openEuler 22.03 (LTS-SP1)使用expect spawn无法创建新的终端

编写shell自动化脚本,使用expect spawn来进行命令交互,提示The system has no more ptys. Ask your system administrator to create more.查看内核信息,发现kernel.pty.nr = 1,请问如何解决此问题

1 个赞

kernel.pty.nr 这个参数决定了系统可以使用的最大PTY数量, 把这个调大
kernel.pty.nr = 2048

平时写脚本的时候,记得释放pty,比如下面代码:

# Expect script example
#!/usr/bin/expect

set timeout 5

spawn ssh user@host
expect "password:"
send "your_password\r"
expect "$ "

# Perform some commands here
# ...

# Close the SSH session
send "exit\r"

# Close the spawn id
expect eof

expect eof`关闭了 spawn_id 并释放了PTY资源。

1 个赞

感谢回复,尝试过修改kernel.pty.nr此参数,但是这个参数好像无法被修改,在/etc/sysctl.conf中添加kernel.pty.nr = 4,sysctl -p刷新,提示sysctl: setting key “kernel.pty.nr”: Invalid argument,请问还有其他方式可以设置此参数吗?

1 个赞

有个疑问,PTY作为系统资源,原来为啥会是1呢

这也是我疑惑的地方,我看centos7的kernel.pty.nr默认配置为3,ubuntu20.04.3 LTS、麒麟V10默认配置也为1,但是使用expect spawn不会出现The system has no more ptys的问题

所以感觉不是PTY的问题。虽然我不知道这是啥 :rofl:

我测试并没有啥问题呀,是否是脚本本身问题或系统哪里做了修改变动

这是我用作测试的脚本内容
expect_path_G=which expect
cmd_change_passwd_T=‘passwd yang’
new_password=‘yang’
${expect_path_G} <<EOF
set timeout 50
spawn ${cmd_change_passwd_T}
expect {
assword” {
send “${new_password}\r”
exp_continue
expect eof
}
密码” {
send “${new_password}\r”
exp_continue
expect eof
}
“* *” {
send “${new_password}\r”
exp_continue
expect eof
}
}
catch wait result
exit [lindex $result 3]
EOF

1 个赞

我测试的系统是LTS-SP1,一会试下LTS-SP3