CentOS 5.4
(在我的脚本文件-script.sh中)
#!/bin/bash
ssh 192.168.0.1 'iptables -L' > /tmp;
(在 /etc/crontab 中)
30 21 30 9 * root /bin/bash /script.sh
如果我在终端中运行脚本,一切正常。但是使用 crontab 运行它,将生成 tmp,但 tmp 文件中没有任何内容(0k)。我已经运行了 ssh 代理,因此 ssh 不会提示询问密码。这可能是什么问题?谢谢。
答案1
我建议您始终在脚本开始时明确设置所有需要的变量。
PATH=/bin:/usr/bin:/sbin
MYVAR=whatever
话虽如此,我会
- 创建私钥/公钥对
- 在私钥上设置一个空密码
- 在私钥文件上设置权限400
- 将公钥放入192.168.0.1上root用户的authorized_keys文件中
现在尝试连接
#!/bin/bash
PATH=/usr/bin
ssh -i /myprivatekey -l root 192.168.0.1 '/sbin/iptables -L' > /tmp/output.$$
编辑:我猜想“iptables”命令必须由远程服务器上的 root 执行。如果不是,当然必须相应地更改“-l”参数。
答案2
由于环境不同,无法从 cron 运行但可以从终端运行的程序几乎总是存在问题。您应该使用可执行文件的完整路径,并明确设置PATH
它们所需的任何环境变量。
#!/bin/bash
/usr/bin/ssh 192.168.0.1 '/sbin/iptables -L' > /tmp/output.$$
顺便问一下,您的脚本实际上并没有放在根目录中,是吗?
此外,/tmp
这是一个应该已经存在的目录。您应该像我所展示的那样,在其中将输出创建为文件。
答案3
我认为 ssh-agent 在这种情况下不会有帮助,因为 cronjob 不是在其环境中具有 ssh-agent 通信参数的进程的子进程。您需要设置无密码登录才能使其工作。
获取更多信息的一种方法是将 ssh 调用更改为
ssh -vvv 192.168.0.1 'iptables -L' 2>&1 > /tmp/output.$$
这样 1) ssh 将在 stderr 上生成详细的调试输出,2) stderr 将与 stdout 一起重定向。该 output.$$ 文件应该包含有关正在发生的事情的更多信息... 我打赌,正如我所说,您没有权限打开您的密钥。