Expect 脚本在命令行中运行良好,但在 cron 作业中不起作用
Expect script works fine in command line but does not work in cron job
我有 python 脚本调用 shell 脚本是这样的:
p = subprocess.Popen([/path/to/script.sh], stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
output, error = p.communicate()
expect
脚本:
#!/usr/bin/env expect
set username "user"
set password "pass"
cd /my/repo
spawn /usr/bin/git pull origin master
expect "Username"
send "$username\r"
expect "Password"
send "$password\r"
interact
当我手动 运行 py-script 时它工作正常,我看到如下输出:
Username for repo: user
Password for repo:
* branch master -> FETCH_HEAD
Already up to date.
但是当我通过 cron 运行 我的脚本时,我看到了这个:
Username for repo: user
Password for repo:
什么也没发生。我做错了什么?
我的 /etc/crontab 文件:
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
10 * * * * my_username /usr/bin/python3 /path/to/python/script.py
您需要将 interact
更改为 expect -timeout -1 eof
。
interact
仅当 Expect 脚本在 tty 上 运行ning 但 cron 作业不在 tty 上 运行 时才有效。
您可以通过交互式 shell:
验证这一点
# this works
expect -c 'spawn sleep 5; interact'
# this does not work
true | expect -c 'spawn sleep 5; interact'
# this works
true | expect -c 'spawn sleep 5; expect -timeout -1 eof'
我有 python 脚本调用 shell 脚本是这样的:
p = subprocess.Popen([/path/to/script.sh], stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
output, error = p.communicate()
expect
脚本:
#!/usr/bin/env expect
set username "user"
set password "pass"
cd /my/repo
spawn /usr/bin/git pull origin master
expect "Username"
send "$username\r"
expect "Password"
send "$password\r"
interact
当我手动 运行 py-script 时它工作正常,我看到如下输出:
Username for repo: user
Password for repo:
* branch master -> FETCH_HEAD
Already up to date.
但是当我通过 cron 运行 我的脚本时,我看到了这个:
Username for repo: user
Password for repo:
什么也没发生。我做错了什么?
我的 /etc/crontab 文件:
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
10 * * * * my_username /usr/bin/python3 /path/to/python/script.py
您需要将 interact
更改为 expect -timeout -1 eof
。
interact
仅当 Expect 脚本在 tty 上 运行ning 但 cron 作业不在 tty 上 运行 时才有效。
您可以通过交互式 shell:
验证这一点# this works
expect -c 'spawn sleep 5; interact'
# this does not work
true | expect -c 'spawn sleep 5; interact'
# this works
true | expect -c 'spawn sleep 5; expect -timeout -1 eof'