为了从远程服务器(Centos 6.x)到本地客户端(Ubuntu 18.04)进行 rsync(增量),我将创建的公钥从客户端复制到服务器以在无需密码的情况下执行 rsync。
PasswordAuthentication yes
在 sshd_config
在本地 Ubuntu 上我有一些可执行脚本,如下所示
#!/bin/sh
RSYNC=/usr/local/bin/rsync-incr
SSH=/usr/bin/ssh\ -p\ xxxx
ROTATE=60
RUSER=yyyy
RHOST=zzzz
RPATH=/path-to-remote-dir/
LPATH=/path-to-local-dir/
$RSYNC -az --rsh="$SSH" $ROTATE $RUSER@$RHOST:$RPATH $LPATH
我从命令行运行这个脚本/path-to-local-script-file
并且它表现良好,但如果我将这行添加到crontab -e
00 00 * * * /path-to-local-script-file
执行时出现 cron 错误“权限被拒绝,请重试”
权限被拒绝(公钥、gssapi-keyex、gssapi-with-mic、密码)。rsync
:连接意外关闭(迄今为止收到 0 个字节)
[接收器] rsync 错误:io.c(235) 处出现无法解释的错误(代码 255)[接收器=3.1.2]
*** 错误:rsync 返回代码 255
显然这是一个权限问题。我不明白的是为什么我能够/path-to-local-script-file
从命令行执行并以用户身份成功执行 rsync 任务myname
,却无法cron
以同一用户身份执行 (crontab -e)。
编辑 1:我创建了一个没有密码的新密钥,删除了远程服务器上 authorized_keys 中带有公钥的旧 rsa-ssh 行。
同样的行为,从命令行运行脚本正常,但 cron 拒绝权限
编辑 2:
从命令行连接 ssh 的服务器日志
5 月 23 日 10:20:53 主机 sshd[21067]: 已接受来自 xxx.xxx.6.13 端口 42836 ssh2 的 root 公钥
5 月 23 日 10:20:53 主机 sshd[21067]: pam_unix(sshd:session): 由 (uid=0) 为用户 root 打开会话
从 cron 连接 ssh 的服务器日志
5 月 23 日 10:17:03 主机 sshd[18163]: 来自 xxx.xxx.6.13 端口 42514 ssh2 的 root 密码失败
5 月 23 日 10:17:03 主机 sshd[18163]: 来自 xxx.xxx.6.13 端口 42514 ssh2 的 root 密码失败
5 月 23 日 10:17:03 主机 sshd[18164]: xxx.xxx.6.13 关闭连接
答案1
看起来您正在以非 root 用户身份手动运行该脚本,而 cron 正在以 root 用户身份运行该脚本。
如果是这种情况,那么您将需要定义 ssh 私钥的路径。
如果你以 root 身份连接到远程服务器(不好),那么你将需要 root authorized_keys 来获得工作站的公钥