Como decodificar o texto base64 no arquivo ldif no Linux?

0

Eu preciso decodificar o base64 incorporado em backups ldif (openldap).

Eu encontrei aqui uma maneira de juntar linhas começando com um espaço em branco.

Então, com base em esta pergunta sobre "Como decodificar o texto base64 no arquivo xml no Linux?" Eu quero decodificar as seqüências de caracteres base64, mas eu não estou conseguindo fazê-lo funcionar.

Meu script é:

#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:]]+)/ '"'grep -oP ':: [[:graph:]]+' "$FILE_JOINED" |cut -c 4- | base64 -d'"'/g' "$FILE_JOINED"

Quando executo isso, recebo o seguinte erro:

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

Aqui, adiciono um exemplo do conteúdo "$ 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

(OBSERVAÇÃO de que o segundo comando deixa o dois-pontos duplo ( :: ) em vez de deixar apenas um. Eu fiz isso propositadamente para poder facilmente acertar a saída. Vou consertar isso mais tarde)

O segundo comando tem um grep nele: Como ele "seleciona" a linha correta para decodificar em todo o conteúdo do arquivo?

Aqui está o resultado do comando grep sozinho:

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

Alguém poderia me dar alguma indicação sobre como decodificar os valores base64 contidos em um arquivo ldif?

    
por elysch 30.08.2018 / 02:55

1 resposta

0

Eu encontrei uma maneira de fazer isso:

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

E se você quiser dobrar as linhas longas, (com base em esta resposta )

sed -r 's/(.*:)(: )([[:graph:]]+)/echo " '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;
}
'

No caso de alguém precisar, aqui está o roteiro inteiro.

[Observe que o comando AWK do script deixa as linhas comentadas (linhas iniciadas com "#") que não estão incluídas na anterior] :

#!/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 " '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

ATUALIZAÇÃO 20180830

Houve um erro com a expansão do shell. Não estava preservando os caracteres "*", mas substituindo-os por uma lista de arquivos.

A correção foi adicionar aspas duplas no primeiro comando echo. Eu já consertei os comandos e scripts mostrados anteriormente.

O comando ERRONEOUS foi:

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

ATUALIZAÇÃO 20180830-b

O comando AWK também estava modificando comentários, e não deveria ter feito isso.

O comando PREVIOUS foi:

awk -v WIDTH=$WIDTH '
BEGIN {
    space=" ";
}
{
    while (length>WIDTH) {
        print substr($0,1,WIDTH);
        $0=space substr($0,WIDTH+1);
    }
    print;
}
' > $FILE_DECODED
    
por 30.08.2018 / 04:11