CentOS 7.4が実行されているLXCコンテナーがあります。
通常のユーザーからの期待を実行すると、以下のエラーが発生します。
user@server ~> expect -c "spawn ls"
spawn ls
The system has no more ptys. Ask your system administrator to create more.
while executing
"spawn ls"
しかし、rootユーザーから同じことを実行すると、動作します。
[root@server]# expect -c "spawn ls"
spawn ls
Mountの出力には、これらのマウントポイントもあります。/dev/pts上のdevptsタイプdevpts(rw、relatime、seclabel、mode = 620、ptmxmode = 000)
サーバーで以下の更新を実行しました。
mknod -m 600 /dev/console c 5 1 2>/dev/null
mknod -m 666 /dev/null c 1 3 2>/dev/null
mount -n -t tmpfs none /dev 2>/dev/null
mknod -m 622 /dev/console c 5 1 2>/dev/null
mknod -m 666 /dev/null c 1 3 2>/dev/null
mknod -m 666 /dev/zero c 1 5 2>/dev/null
mknod -m 666 /dev/ptmx c 5 2 2>/dev/null
mknod -m 666 /dev/tty c 5 0 2>/dev/null
mknod -m 444 /dev/random c 1 8 2>/dev/null
mknod -m 444 /dev/urandom c 1 9 2>/dev/null
chown root:tty /dev/{console,ptmx,tty} 2>/dev/null
ln -s /proc/self/fd /dev/fd 2>/dev/null
ln -s /proc/self/fd/0 /dev/stdin 2>/dev/null
ln -s /proc/self/fd/1 /dev/stdout 2>/dev/null
ln -s /proc/self/fd/2 /dev/stderr 2>/dev/null
ln -s /proc/kcore /dev/core 2>/dev/null
mkdir /dev/pts 2>/dev/null
mkdir /dev/shm 2>/dev/null
mount -t devpts -o gid=4,mode=620 none /dev/pts 2>/dev/null
mount -t tmpfs none /dev/shm 2>/dev/null
chmod 666 /dev/null
しかし、それでも通常のユーザーとしてexpectコマンドを実行することはできません。
いくつかのスクリプトがあり、expectステートメントを使用して通常のユーザーとして実行する必要があります。
私は考えられるすべての可能な方法を実行しました。助けてください!!
かなりの検索の結果、chroot内に/ dev/ptmxおよび/ dev/pts構造を作成する必要があることがわかりました。
#!/bin/sh
mknod /dev/ptmx c 5 2
chmod 666 /dev/ptmx
mkdir /dev/pts
chmod 755 /dev/pts
mount -t devpts -o gid=5,mode=620 none /dev/pts
ウェブサイトのおかげで https://mintcast.org/building-linux/ 上記のサイトのスクリプトと詳細を引用しました。
スクリプトを実行した後、コマンドを実行できました
[user@server]# expect -c "spawn ls"
spawn ls
Chroot環境とは関係ありませんが、この問題に遭遇した他の人のために、SELinuxがアクセスをブロックしていないことを/var/log/audit/audit.log
で確認してください。プログラムがrootで実行されているにもかかわらず、この問題が発生し、これが見つかりました。
type=AVC msg=audit(1560463619.636:16181): avc: denied { read write } for pid=32466
comm="myscript.exp" name="ptmx" dev="devtmpfs" ino=1149 scontext=system_u:system_r:fail2ban_t:s0
tcontext=system_u:object_r:ptmx_t:s0 tclass=chr_file permissive=0
audit2allow
を使用して、スクリプトが機能するようにポリシーを生成できました。