web-dev-qa-db-ja.com

Expect "no more ptys。"を通常のユーザーとして実行できません

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ステートメントを使用して通常のユーザーとして実行する必要があります。

私は考えられるすべての可能な方法を実行しました。助けてください!!

3
nirmalraj17

かなりの検索の結果、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
2
nirmalraj17

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を使用して、スクリプトが機能するようにポリシーを生成できました。

0
miken32