Intereting Posts
Как проверить man-страницы для того, что делает один параметр команды? Что было бы хорошим выбором для эластичной файловой системы (для добавления хранилища на более позднюю дату)? Кросс-компиляция Slackware: порядок сборки указан в любом месте? Как вы удаляете доброкачественного пользователя из вашей системы? запуск процесса в другом пространстве имен Разложить аргумент bash пробелом скопировать один файл из локального репозитория Git Переупорядочить строки в каждой трехстрочной записи Как создать функцию в zsh, которая вызывает существующую команду с тем же именем? Как предоставить аргументы команды в виде массива? Маршрутизация мобильных соединений для нескольких восходящих линий Как запустить gedit с терминала и отсоединить его (как работает команда «subl»)? проверьте, находятся ли все файлы из папки в другой папке Команды Emacs в xterm Тихая загрузка Linux из u-boot

Как декодировать текст 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?

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

 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