Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Terminal 未能在bash脚本中执行expect_Terminal_Cron_Debian_Expect_Sudo - Fatal编程技术网

Terminal 未能在bash脚本中执行expect

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

我已经编写了一个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 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是不可原谅的。