Terminal 未能在bash脚本中执行expect
我已经编写了一个bash监控脚本,其中包含自动登录vpn服务的expect 系统上只有root和User1。 当sudo从终端执行时,它可以正常工作Terminal 未能在bash脚本中执行expect,terminal,cron,debian,expect,sudo,Terminal,Cron,Debian,Expect,Sudo,我已经编写了一个bash监控脚本,其中包含自动登录vpn服务的expect 系统上只有root和User1。 当sudo从终端执行时,它可以正常工作 #!/bin/bash vpn_user=$(getent passwd | grep "/home" | tail -1 | cut -d":" -f1) write_log(){ echo "$msg" >> "some.log" } log_to_vpn(){ /usr/bin/expect -c ' set
#!/bin/bash
vpn_user=$(getent passwd | grep "/home" | tail -1 | cut -d":" -f1)
write_log(){
echo "$msg" >> "some.log"
}
log_to_vpn(){
/usr/bin/expect -c '
set timeout 10
spawn sudo -u "User1" nordvpn login
expect "Please enter your login details.\r" {
expect "Email / Username: " { send "User1@mail.com\r" }
sleep 1
expect "*assword*" { send "User1Password\r" }
interact }
'
}
if ( sudo -u "$vpn_user" nordvpn account | grep "Active" ); then
msg="INFO: $vpn_user is already logged to VPN."
else
msg="WARNING: Logging to VPN by $(whoami) as $vpn_user."
log_to_vpn
sleep 1
if ( sudo -u "$vpn_user" nordvpn account | grep "Active" ); then
msg="OK: Logging to VPN as $vpn_user has been successful."
fi
fi
write_log
从终端执行时,消息为:“信息:User1已登录到VPN。”或“确定:以User1已成功登录到VPN”。具体取决于User1是否已登录的情况
问题是当作为crone作业执行时,它不执行该作业。
在本例中,some.log仅包含“警告:以User1身份通过root登录到VPN”条目
为什么不工作?只有当stdin在tty/pty上,而cron作业没有在tty/pty上运行时,Expect的interactive才会工作
#!/bin/bash
.
.
.
log_to_vpn(){
/usr/bin/expect '
set timeout 10
spawn sudo -u "User1" nordvpn login
expect "Please enter your login details.\r" {
expect "Email / Username: " { send "User1@mail.com\r" }
sleep 1
expect "*assword*" { send "User1Password\r" }
# interact }- to replace with below:
send "exit\r"
}
expect eof
'
}
.
.
问题已解决:)cron以非常小的路径运行。确保可以在cron使用的路径中找到nordvpn。@格伦·杰克曼:谢谢您的评论。在向crone添加nordvpn路径方面,为了清晰起见,我宁愿将其保存在脚本中。以前很少有版本不允许su做任何事情,现在又可以使用了,但我保留了“sudo-u”以防万一。@pynexj:谢谢你的提示。此脚本是expect在我的系统上的唯一应用程序。安装sexpect是不可原谅的。