我正在使用一个通过ssh与服务器同步的cron脚本。
当我直接运行这些命令时,它们可以很好地运行,但是当我将它们作为cron任务运行时,cron会记录错误的权限问题。我认为这是因为cron用户没有访问ssh密钥的权限。
这是我需要cron运行的代码:
rsync --progress -rvze ssh my_user@myserver/root_folder folder/
我能把ssh密钥传递到cron文件或脚本本身吗?如果可以,你能提供一个像上面那样的示例吗?
我知道这个帖子已经很旧了,但是为了那些像我一样遇到这个问题的人,请看以下两个选项:
对于第二个选项,并假设您的cron作业以正确的用户身份运行(否则还有更多要在环境中正确设置的东西),只需运行:
env|grep -i ssh
会有一行内容:
SSH_AUTH_SOCK=/run/user/1000/keyring/ssh
对于您来说,用户ID可能不同。从那里开始,您只需要将以下行添加到您的脚本中:
if [ -z "$SSH_AUTH_SOCK" ]
then
export SSH_AUTH_SOCK=/run/user/1000/keyring/ssh
fi
希望这有所帮助!rsync --progress -rvze "ssh -i/path/to/ssh_private_key" my_user@myserver:/root_folder folder/
my_user
运行,那么 -i
开关将不再需要。这样会更安全。以 root 用户身份运行命令是不安全的。 - hek2mgl-i
选项无关。(at)johncorser,你可以省略-i
选项。 - hek2mgl另一个选项是让您的 cron 脚本在运行 rsync
之前运行 Keychain:
eval $(keychain --agents ssh --eval --noask --quiet)
这假定你已经在另一个终端中以同一用户运行 Keychain,将私钥添加到一个活动的 ssh-agent
进程中:
$ eval $(keychain --agents ssh --eval id_rsa)
* keychain 2.8.5 ~ http://www.funtoo.org
* Found existing ssh-agent: 272060
* Known ssh key: /home/ubuntu/.ssh/id_rsa
运行keychain --list
命令以查看当前SSH代理中存在的密钥:
$ keychain --list
3072 SHA256:E2IzZ635kapyGwQG0HiZT+5hCv7dh8glpgvz+qN4dsM ubuntu@raspberrypi1 (RSA)
只是为了补充@jytous的答案,通常env|grep -i ssh
会给你一个临时文件:
例如:SSH_AUTH_SOCK=/tmp/ssh-1gJufasJLiXv/agent.3591
上面的/tmp
指的是一个临时文件,在ssh-agent退出或计算机关机时将被删除。
因此,如果您有运行ssh-agent来管理密钥,请尝试在从cron调用的任何脚本开始处添加以下内容:
auth=`find /tmp -user $LOGNAME -type s -name "*agent*" -print 2>/dev/null`
SSH_AUTH_SOCK=$auth
export SSH_AUTH_SOCK
参考 - 链接
crontab
中指定以root身份运行脚本? - hek2mgl