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

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

如果我在终端中运行脚本,一切正常。但是使用 crontab 运行它,将生成 tmp,但 tmp 文件中没有任何内容(0k)。我已经运行了 ssh 代理,因此 ssh 不会提示询问密码。这可能是什么问题?谢谢。

答案1

我建议您始终在脚本开始时明确设置所有需要的变量。

PATH=/bin:/usr/bin:/sbin
MYVAR=whatever

话虽如此,我会

  1. 创建私钥/公钥对
  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”命令必须由远程服务器上的 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.$$ 文件应该包含有关正在发生的事情的更多信息... 我打赌,正如我所说,您没有权限打开您的密钥。

相关内容