众所周知,cron 和 ssh-agent 不通信,因此 ssh 命令不能在 cron 下轻松运行。有一些涉及钥匙串等的解决方案可以做到这一点。但是,在我的情况下,我需要在远程服务器上运行一个 cron 作业(我通过代理转发通过 ssh 登录),它将使用 ssh 在第二个远程服务器上执行。所以我的密钥不存在于 ssh 命令发起的第一个远程服务器中。在 cron 下运行 ssh 的所有解决方案都假定源服务器上存在 ssh 密钥。没有 ssh 密钥时如何使用 cron 运行 ssh 命令?我认为需要让 cron 了解 ssh-agent 变量。但我不知道该怎么做。知道怎么做吗?
这是我在远程服务器 1 上的 crontab:
*/1 * * * * ssh root@remote2 "some command" >> /home/output.log
edit1:remote2 只是一个例子。这必须为大约 100 台服务器重复。
edit2:SSH_AUTH_SOCK 解决方案尝试
~/.ssh 文件夹的内容:
$ ls -lt /home/centos/.ssh
lrwxrwxrwx. 1 centos centos 31 24. Mär 15:13 ssh_auth_sock -> /tmp/ssh-59Ay2ronRN/agent.24129
crontab的内容:
*/1 * * * * SSH_AUTH_SOCK=/home/centos/.ssh/ssh_auth_sock;/bin/bash /home/test.sh
/home/test.sh 的内容:
#!/bin/bash
echo "`date +%FT%T` $0: test cronjob from centos .. $SSH_AUTH_SOCK" >> ${runlog}
/usr/bin/ssh remote2 "sudo less /var/log/program.log | grep 'NOT ENDING'" >>${runlog} 2>&1
${runlog} 的内容:
2022-03-24T15:22:01 /home/test.sh: test cronjob from centos ..
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
edit3:SSH_AUTH_SOCK 解决方案更新(已解决)
如下声明 SSH_AUTH_SOCK 有效:
…
SSH_AUTH_SOCK=/…
*/1 * * * * ssh …
…