chroot 환경에서 ls 명령은 UTF8 문자 대신 "?"를 표시합니다.

chroot 환경에서 ls 명령은 UTF8 문자 대신 "?"를 표시합니다.

SSH 사용자를 위한 chroot 환경을 설정하려고 하는데 QA에서 UT8 문자가 "?"로 대체된 것을 발견했습니다.

xstorenas>ls /mnt/hires/tsi/
??????????????????

하지만 간단한 for 루프를 수행하면 다음과 같습니다.

xstorenas>for f in /mnt/hires/tsi/*; do 
    echo $f; 
done
/mnt/hires/tsi/рэпертуар

/etc/locale.conf 및 전체 /usr/share/locale을 사용할 수 있으며 LANG이 올바르게 설정되었습니다.

xstorenas>printenv LANG
en_US.UTF-8

따라서 chroot 환경에서 누락된 내용을 찾을 수 없습니다(chroot 환경 외부에서 예상대로 작동하기 때문입니다).

답변1

의 출력은 ls로캘에 따라 다르며 로캘이 작동하려면 많은 지원 파일이 필요합니다. 감옥에 이러한 서류가 없을 수도 있습니다 chroot. Linux의 예:

$ strace -eopen ls >/dev/null
[...]
open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/locale/en_US.UTF-8/LC_IDENTIFICATION", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/en_US.utf8/LC_IDENTIFICATION", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/gconv/gconv-modules.cache", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/gconv/gconv-modules", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/locale/en_US.UTF-8/LC_MEASUREMENT", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/en_US.utf8/LC_MEASUREMENT", O_RDONLY|O_CLOEXEC) = 3
[...]

chroot이러한 파일을 감옥 에 복사하여 ls작업할 수 있지만 로케일 파일로 인해 다양한 보안 취약점이 노출될 수 있으므로 이는 좋은 생각이 아닙니다. 아마도 ed 환경 ls에서 실행할 필요는 없을 것입니다 chroot.

관련 정보