我正在尝试为 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
jail 中以便ls
工作,但这不是一个好主意,因为语言环境文件可能会给您带来各种安全漏洞。您可能不需要在 ed 环境ls
中运行chroot
。