Chroot

在 chrooted 環境中,ls 命令顯示“?”而不是 UTF8 字元

  • September 5, 2016

我正在嘗試為 ssh 使用者設置 chrooted 環境,但我們的 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

因此,我找不到 chrooted env 中缺少的內容(因為它在 chrooted env 之外按預期工作)。

的輸出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工作,但這不是一個好主意,因為語言環境文件可能會使您面臨各種安全漏洞。一開始您可能不需要lschrooted 環境中執行。

引用自:https://unix.stackexchange.com/questions/307945