为什么这个 rsync + ssh cron 作业给我“权限被拒绝(公钥)”错误?

Tom*_*man 21 ssh permissions backup cron rsync

我经常备份到我想每天同步到远程服务器的本地驱动器。

目标服务器配置为仅用于 SSH 密钥(无密码)访问。由于我用于该服务器的主 SSH 密钥受密码保护,我创建了第二个 SSH 密钥(不受密码保护)+ 用户用于无人值守备份- 这样当 cron 运行时我不必在场输入我的密码.

我正在使用 cron 和 rsync,所有命令都可以单独工作,但在组合时失败。

故障排除运行时我得到的最远距离

env -i sh -c "rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ backups-only@XX.XX.XX.XX:/backups/desktop/"
Run Code Online (Sandbox Code Playgroud)

返回错误

Permission denied (publickey).
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(226) [sender=3.1.0]
Run Code Online (Sandbox Code Playgroud)

有关如何进一步解决此问题的任何提示?


这是我迄今为止尝试过的,但我没有想法:

  1. Cron 肯定在运行 ps aux | grep cron
  2. /var/log/syslog 中没有异常 Sep 7 13:22:01 desktop CRON[6735]: (tom) CMD (sh /home/tom/Documents/Scripts/offsite-backup)

  3. 当备份用户工作时,终端中的 SSH 到远程服务器 ssh backups-user@XX.XX.XX.XX

  4. 在终端中运行命令完美 rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ backups-only@XX.XX.XX.XX:/backups/desktop/
  5. 手动指定备份用户密钥的路径无效 rsync -lrstRO --delete --exclude 'lost+found' -e 'ssh -i /home/tom/.ssh/backups-only' /Backups/auto-daily-backups/./ backups-only@XX.XX.XX.XX:/backups/desktop/

  6. 用简单的测试命令替换不起作用的命令有效 echo "Hello world" > ~/Desktop/test.txt

  7. 对着电脑大喊大叫没有任何效果(但让我暂时感觉好多了)。


编辑1:

这是我的 crontab 文件和它调用的脚本。

...
# m h  dom mon dow   command
MAILTO=""
* * * * * sh /home/tom/Documents/Scripts/offsite-backup
Run Code Online (Sandbox Code Playgroud)

#!/bin/bash

rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ backups-only@XX.XX.XX.XX:/backups/desktop/
Run Code Online (Sandbox Code Playgroud)

编辑2:

澄清/var/log/auth.log一下,在目标服务器上包含一行Sep 11 08:23:01 <hostname> CRON[24421]: pam_unix(cron:session): session closed for user rootThis is令人困惑,因为我不再在本地每分钟运行一次 cron,但每分钟都会在服务器日志中出现一个新条目。服务器上所有用户(包括 root)的Crontab 文件都是空的,什么也不做。

此外,用户 'backups-only' 仅在服务器上创建且权限有限,并将专用 SSH 密钥复制到我的台式机上。我假设这是要走的路,因为在手动运行命令时一切正常。

上面发布的 crontab 文件是给我的,我的台式机上的用户“tom”。我的意图是让它调用应该以用户“仅备份”身份登录到服务器的脚本。我只是尝试运行备份脚本(而不是其中的命令)并且它成功连接并工作。我以用户“tom”的身份在我的桌面上运行它,该用户创建了不起作用的 cron 作业。这是与成功登录对应的服务器日志的输出

Sep 11 08:35:31 <hostname> sshd[25071]: error: Could not load host key: /etc/ssh/ssh_host_ed25519_key
Sep 11 08:35:32 <hostname> sshd[25071]: Accepted publickey for backups-only from <desktop IP> port 54242 ssh2: RSA e2:e6:07:27:c1:continues...
Sep 11 08:35:32 <hostname> sshd[25071]: pam_unix(sshd:session): session opened for user backups-only by (uid=0)
Sep 11 08:35:32 <hostname> systemd-logind[638]: New session 12 of user backups-only.
Sep 11 08:36:00 <hostname> sshd[25133]: Received disconnect from <desktop IP>: 11: disconnected by user
Sep 11 08:36:00 <hostname> sshd[25071]: pam_unix(sshd:session): session closed for user backups-only
Run Code Online (Sandbox Code Playgroud)

Ala*_*Ali 15

由于从命令行一切正常,错误Permission denied (publickey)意味着 SSH 部分rsync使用的身份文件与指定的用户名不同。

Jan对原始问题的评论中,我们可以在rsync命令中使用-e 'ssh -i /path/to/identity.file' ....

使用以下命令从 cron 中的新环境开始并指定文件的完整路径显然可以解决问题:

env -i sh -c "rsync -lrstRO --delete --exclude 'lost+found' -e 'ssh -i /home/tom/.ssh/backups-only' /Backups/auto-daily-backups/./ backups-only@XX.XX.XX.XX:/backups/desktop/"
Run Code Online (Sandbox Code Playgroud)

我仍然对这个发现很感兴趣。它可能与 cron、它以最少的环境变量以及 ssh-agent 开始的事实有关。我将在几天内设置相同的场景来测试它并报告回来。

  • 你的意思是你运行了 `env -i sh -c "rsync -lrstRO --delete --exclude 'lost+found' -e 'ssh -i /path/to/identity.file' /Backups/auto-daily-backups /./仅备份@XX.XX.XX.XX:/backups/desktop/"` (2认同)