在 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
[...]

您可以将这些文件复制到chrootjail 中以便ls工作,但这不是一个好主意,因为语言环境文件可能会给您带来各种安全漏洞。您可能不需要在 ed 环境ls中运行chroot

相关内容