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
(두 번째 명령은 ::
하나가 아닌 이중 콜론( )을 남깁니다. 출력을 쉽게 grep할 수 있도록 이렇게 했습니다. 나중에 수정하겠습니다.)
두 번째 명령에는 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'