setfattr
나는 자유 텍스트 주석에 해당하는 확장 속성을 설정하기 위한 약간 더 편리한 래퍼 인 짧은 쉘 스크립트를 작성했습니다 .
#!/bin/sh
test "$2" && setfattr -n user.xdg.comment -v "$2" "$1"
getfattr -d -m '^user.xdg.comment$' "$1"
이는 US ASCII 주석을 xattrs로 저장하는 데 적합합니다. 그러나 US ASCII가 아닌 문자가 포함된 주석을 설정하려고 하면 Base64로 인코딩된 데이터로 보이는 내용이 반환됩니다.
$ touch xyz
$ set-comment xyz åäöåä
# file: xyz
user.xdg.comment=0sw6XDpMO2w6XDpA==
$
하지만 Base64만이 아닙니다.
$ printf "0sw6XDpMO2w6XDpA==" | \base64 --decode
��:\:L;l:\:@base64: invalid input
$
대부분의 경우 나는오직무작위 쓰레기가 돌아온 것 같습니다. 때때로 이와 같이 Base64 디코더가 나에게 "잘못된 입력"을 던집니다.
이 문자열은 무엇입니까?원래 입력 값과 어떤 관련이 있습니까? getfattr
나에게 주어진 값에서 원래 입력 값(예 åäöåä
: 이 예) 으로 어떻게 돌아가나요 ?
setfattr --version
내 시스템에서 응답은 입니다 setfattr 2.4.46
. Debian Wheezy 패키지 버전을 실행하고 있습니다. 중요한 경우에는 기존 Wheezy 커널에서 ZFS On Linux 0.6.3을 실행하고 있습니다(0.6.2에서도 동일한 동작이 나타났습니다).
답변1
이 질문을 읽고 조금 궁금해서 몇 가지를 해보겠습니다."법의학":
먼저 반대 접근 방식을 시도해 보세요.
åäöåä
Base64는 어떻게 인코딩되나요?
$ echo åäöåä | base64
w6XDpMO2w6XDpAo=
이것은 분명히 당신이 가지고 있는 것과 매우 비슷해 보입니다 0sw6XDpMO2w6XDpA==
. 0s
처음에는 추가 항목이 많이 있지만 결국에는 합산되지 않습니다. 끝에 개행 문자를 억제하면 åäöåä
(automatic으로 삽입됨 echo
) 다음과 같은 결과를 얻습니다.
$ echo -n åäöåä | base64
w6XDpMO2w6XDpA==
이것이 바로 시작 부분 user.xdg.comment
을 제외하면 -value 입니다 0s
.
결론적으로
논평예Base64 인코딩 및 접두사 지정 0s
및 기타 문자열 테스트를 통해 이를 확인했습니다.
예:
$ ./set-comment xyz 日本語
# file: xyz
user.xdg.comment=0s5pel5pys6Kqe
$ base64 -d <<<'5pel5pys6Kqe' ; echo
日本語
( ; echo
출력이 base64
개행으로 끝나지 않기 때문에 다음 프롬프트를 엉망으로 만들지 않기 위한 것입니다.)
하지만...
이는 이러한 경우(주석이 ASCII가 아닌 경우) Base64로 인코딩되어 0s
.
"진짜" 대답
getfattr
이 작업을 수행한 후 다음과 같은 내용이 언급된 매뉴얼 페이지를 확인하는 훌륭한 아이디어가 떠올랐습니다 .
옵션 정보-e en, --encoding=en
값을 검색한 후 인코딩합니다. en에 유효한 값은 "text", "hex" 및 "base64"입니다. 텍스트 문자열로 인코딩된 값은 큰따옴표(")로 묶인 반면, 16진수와 base64로 인코딩된 문자열에는 각각 0x와 0이 앞에 붙습니다.
따라서 스크립트를 다음과 같이 변경하십시오.
(문서댓글 설정:)
#!/bin/sh
test "$2" && setfattr -n user.xdg.comment -v "$2" "$1"
getfattr -e text -d -m '^user.xdg.comment$' "$1"
속성은 항상 텍스트로 인쇄됩니다. 예:
$ ./set-comment xyz åäöåä # with fixed script
# file: xyz
user.xdg.comment="åäöåä"
그러나 여전히 몇 가지 주의 사항이 있습니다. 예를 들면 다음과 같습니다.
$ ./set-comment xyz 0x414243
# file: xyz
user.xdg.comment="ABC"
그리고
$ ./set-comment xyz 0s5pel5pys6Kqe
# file: xyz
user.xdg.comment="日本語"
출력이 입력과 일치하지 않는 경우.
setfattr
이러한 문제는 인수를 선호하는 형식 으로 "마사지"하여 해결할 수 있습니다 . 바라보다 man setfattr
.