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

関連情報