Как декодировать текст base64 в файл ldif в Linux?

Мне нужно декодировать base64, встроенный в резервные копии ldif (openldap).

Я нашел здесь способ объединения строк, начинающихся с пробела.

Затем на основе этого вопроса о «Как декодировать текст base64 в XML-файл в Linux?» Я хочу декодировать строки base64, но я не могу заставить его работать.

Мой сценарий:

#Join lines starting with space sed -n 'H; ${ x; s/\n//; s/\n //g; p}' "$FILE" > "$FILE_JOINED" #Decode lines containing base64 (those with double colon) sed -r 's/(:: )([[:graph:]]+)/\1 '"`grep -oP ':: [[:graph:]]+' "$FILE_JOINED" |cut -c 4- | base64 -d`"'/g' "$FILE_JOINED" 

Когда я выполняю это, я получаю следующую ошибку:

 sed: -e expression #1, char 297: unknown option to `s' 

Здесь я добавляю пример содержимого “$ FILE_JOINED”:

 dn: olcDatabase={1}mdb,cn=config objectClass: olcDatabaseConfig objectClass: olcMdbConfig olcDatabase: {1}mdb olcDbDirectory: /var/lib/ldap olcSuffix: dc=proxy,dc=ldap olcAccess:: b25lIHZhbHVlCg== olcAccess: {1}to filter=(&(objectClass=securityPrincipal)(!(pwdAccountLockedTime=*))) attrs=userPassword,shadowLastChange by dn="cn=Man1,ou=local,dc=proxy,dc=ldap" write by anonymous auth by self write by * none olcAccess: {2} to * by * read olcAddContentAcl: FALSE olcLastMod: TRUE olcMaxDerefDepth: 15 olcReadOnly: FALSE olcRootDN: cn=Man1,ou=local,dc=proxy,dc=ldap olcRootPW:: dmFsdWUgdHdvCg== olcSyncUseSubentry: FALSE olcSyncrepl:: dmFsdWUgdGhyZWUK olcMirrorMode: TRUE dn: olcOverlay={0}unique,olcDatabase={1}mdb,cn=config objectClass: olcOverlayConfig objectClass: olcUniqueConfig 

(Обратите внимание, что вторая команда оставляет двойное двоеточие ( :: вместо одного. Я сделал это специально, чтобы иметь возможность легко получить вывод. Я исправлю это позже)

Во второй команде есть grep: как она «выбирает» правильную строку для декодирования во всем содержимом файла?

Вот результат одной только команды grep :

 # grep -oP ':: [[:graph:]]+' x |cut -c 4- | base64 -d one value value two value three 

Может ли кто-нибудь дать мне какие-нибудь советы о том, как декодировать значения base64, содержащиеся в файле ldif?

One Solution collect form web for “Как декодировать текст base64 в файл ldif в Linux?”

Я нашел способ сделать это:

 sed -r 's/(.*:)(: )([[:graph:]]+)/echo "\1 `echo -n '\\3' |base64 -d`"/ge' "$FILE_JOINED" 

И если вы хотите сложить длинные линии, (на основе этого ответа )

 sed -r 's/(.*:)(: )([[:graph:]]+)/echo "\1 `echo -n '\\3' |base64 -d`"/ge' "$FILE_JOINED" | \ awk -v WIDTH=76 ' { space=""; while (length>WIDTH) { print substr($0,1,WIDTH); space=" "; $0=space substr($0,WIDTH+1); } print; } ' 

В случае, если это кому-то нужно, вот весь сценарий.

[Обратите внимание, что команда AWK скрипта оставляет закомментированные строки (строки, начинающиеся с «#»), которые не включены в предыдущую] :

 #!/bin/bash FILE=$1 DIR=`dirname $FILE` pushd $DIR WIDTH=76 FILE=`basename $FILE` FILE_JOINED="`basename $FILE .ldif`-una-linea.ldif" FILE_DECODED="`basename $FILE .ldif`-decodificado.ldif" echo echo DIR: $DIR echo FILE: $FILE echo FILE_JOINED: $FILE_JOINED echo FILE_DECODED: $FILE_DECODED sed -n 'H; ${ x; s/\n//; s/\n //g; p}' "$FILE" > "$FILE_JOINED" sed -r 's/(.*:)(: )([[:graph:]]+)/echo "\1 `echo -n '\\3' |base64 -d`"/ge' "$FILE_JOINED" | \ awk -v WIDTH=$WIDTH -v space=" " ' /^[^#]/ { while (length>WIDTH) { print substr($0,1,WIDTH); $0=space substr($0,WIDTH+1); } print; } /^[#]|^$/ { print; } ' > $FILE_DECODED rm $FILE_JOINED 

ОБНОВЛЕНИЕ 20180830

Произошла ошибка с расширением оболочки. Он не сохранял символы «*», а заменял их списком файлов.

Исправление заключалось в добавлении двойных кавычек в первую команду echo. Я уже исправил команды и скрипт, показанные ранее.

Ошибочная команда была:

 sed -r 's/(.*:)(: )([[:graph:]]+)/echo \1 `echo -n '\\3' |base64 -d`/ge' "$FILE_JOINED" 

ОБНОВЛЕНИЕ 20180830-b

Команда AWK также изменяла комментарии, и этого не должно было быть.

ПРЕДЫДУЩАЯ команда была:

 awk -v WIDTH=$WIDTH ' BEGIN { space=" "; } { while (length>WIDTH) { print substr($0,1,WIDTH); $0=space substr($0,WIDTH+1); } print; } ' > $FILE_DECODED 
  • Недопустимый код команды с sed
  • Согласование нескольких шаблонов на одной строке
  • Значение Grep из json-файла
  • sed: игнорировать строку, начинающуюся с пробела для соответствия
  • Как присоединиться к двум csv с таким же количеством строк
  • Использовать sed с обратными ссылками
  • Подсчитать каждую строку поиска выходных awk в файле
  • заменить строку в цикле
  • Как удалить текст, сопоставляющий определенные шаблоны из файла
  • добавление букв и символов в столбец с помощью awk или sed?
  • сравнить два файла, получить идентичный список
  • Linux и Unix - лучшая ОС в мире.