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

(두 번째 명령은 ::하나가 아닌 이중 콜론( )을 남깁니다. 출력을 쉽게 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' 

관련 정보