crontab运行bash脚本(ssh命令)不起作用

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 

那就是说,我会的

  1. 创build一个私人/公共密钥对
  2. 在私钥上设置一个空的密码
  3. 在私钥文件上设置权限400
  4. 将公钥放在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”命令必须由远程服务器上的根执行。 如果不是,那么“-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。 输出。$$文件应该有更多关于发生了什么事情的信息…我的赌注是,正如我所说的,缺乏开启密钥的权限。