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
끝 부분이 정확히 일치하지 않습니다. åäöåä
(에 의해 자동으로 삽입됨 ) 끝에 개행 문자를 억제하면 echo
다음을 얻습니다.
$ echo -n åäöåä | base64
w6XDpMO2w6XDpA==
이것은 시작 부분을 user.xdg.comment
제외하면 정확히 -값 입니다.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
.