Linuxでldifファイルのbase64テキストをデコードする方法は?

Linuxでldifファイルのbase64テキストをデコードする方法は?

ldif(openldap) バックアップに含まれる Base64 をデコードする必要があります。

私が見つけたここスペースで始まる行を連結する方法です。

その後、これ「Linuxでxmlファイルのbase64テキストをデコードする方法」に関する質問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

(2番目のコマンドは::1つではなくダブルコロン()を残します。出力を簡単にgrepできるようにしました。後で修正します。)

2番目のコマンドにはgrepがあります。すべてのファイルの内容をデコードするために正しい行をどのように「選択」しますか?

これは別のコマンドの結果ですgrep

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

ldifファイルに含まれているBase64値をデコードする方法を教えてください。

答え1

私はこれを行う方法を見つけました:

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

答え2

あなたの素敵なbase64コンテンツに基づいて解凍とデコードをパイプコマンドにまとめました。

sed -n ':loop N; s/\n //; t loop; P; D' | sed -r 's/(.*:)(: )([[:graph:]]+)/echo "\1 `echo -n '\\3' |base64 -d`"/ge' 

関連情報