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'