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
如果我在terminal运行脚本,事情工作得很好。 但是使用crontab来运行它,tmp将被生成,但tmp文件(0k)中没有任何内容。 我已经运行了ssh代理,所以ssh不会提示input密码。 这可能是什么问题? 谢谢。
我build议你总是在脚本的开头明确地设置所有需要的variables。
PATH=/bin:/usr/bin:/sbin MYVAR=whatever
那就是说,我会的
现在尝试连接
#!/bin/bash PATH=/usr/bin ssh -i /myprivatekey -l root 192.168.0.1 '/sbin/iptables -L' > /tmp/output.$$
编辑:我猜想,“iptables”命令必须由远程服务器上的根执行。 如果不是,那么“-l”参数必须相应地改变。
那些不能从cron运行,但从terminal运行的东西几乎总是由于环境的差异而成为问题。 您应该使用可执行文件的完整path,并明确设置所需的任何环境variables和PATH 。
#!/bin/bash /usr/bin/ssh 192.168.0.1 '/sbin/iptables -L' > /tmp/output.$$
顺便说一句,你真的没有你的脚本在根目录中吗?
另外, /tmp是一个应该已经存在的目录。 你应该创build你的输出作为一个文件,正如我所示。
我不认为ssh-agent会在这种情况下提供帮助,因为cronjob不是在其环境中具有ssh-agent通信参数的subprocess。 你需要设置一个无密码login才能工作。
获取更多信息的一种方法是将您的ssh调用更改为
ssh -vvv 192.168.0.1 'iptables -L' 2>&1 > /tmp/output.$$
所以1)ssh将在stderr上产生详细的debugging输出,2)stderr将会和stdout一起被redirect。 输出。$$文件应该有更多关于发生了什么事情的信息…我的赌注是,正如我所说的,缺乏开启密钥的权限。