作为服务运行时,SSH 连接的权限被拒绝(公钥、密码)

作为服务运行时,SSH 连接的权限被拒绝(公钥、密码)

我有一个 bash 脚本,/home/localuser/backup-script.sh其中包含以下代码片段:

rsync -avzh \
  -e "ssh -i /home/localuser/.ssh/id_ed25519" \
  /home/localuser/backups/file-to-backup.gz \
  [email protected]:/home/remoteuser/backups

如果我直接从 shell 运行它,一切都会像魅力一样工作,而如果我通过我配置的 systemd 服务运行它,我会收到错误[email protected]: Permission denied (publickey,password).

这是我配置的服务( /etc/systemd/system/backup.service):

[Unit]
Description=Trigger script to perform backup

[Service]
Type=oneshot
User=localuser
ExecStart=/bin/bash /home/localuser/backup-script.sh

[Install]
WantedBy=multi-user.target

我通常通过计时器运行它,但如果我直接通过启动它,我也会得到同样的错误sudo systemctl start backup.service

ssh 服务已正确设置,正如我直接运行脚本或启动.ssh [email protected]

我不知道发生了什么事......有任何线索吗?

附加信息:我得到同样的错误替换rsyncscp


编辑:

根据斯图尔特的评论,我尝试通过运行此命令直接启动脚本env -i /bin/bash --norc --noprofile backup-script.sh,在这种情况下,系统会提示我输入 ssh 密钥密码,因此问题正是斯图尔特的评论所指出的。

为了通过简单的解决方案解决该问题(从而避免添加ssh-agent为服务、自动密钥加载和启动时自动输入密码),我更改了rsync脚本中的命令,将第二行 ( -e ...) 替换为以下行--rsh="/usr/bin/sshpass -p remoteuser_pwd ssh -o StrictHostKeyChecking=no -l remoteuser"

结果类似:如果我直接启动它,它工作正常。如果我通过服务启动它,它就不起作用:但这次没有错误,它只是挂起。如果我启动它env -i /bin/bash --norc --noprofile backup-script.sh,它也会以同样的方式挂起。

通过以这种方式backup.service添加来更改并不能解决问题。--loginExecStart=/bin/bash --login /home/localuser/backup-script.sh

答案1

我没有解决您的具体问题的答案,但您可以向 ssh 命令添加详细输出,以调试与其使用 ssh 密钥相关的更多信息:

rsync -avzh \
  -e "ssh -vvv -i /home/localuser/.ssh/id_ed25519" \
  /home/localuser/backups/file-to-backup.gz \
  [email protected]:/home/remoteuser/backups

将使-vvvssh 向 stdout 输出一堆与连接、ssh 配置和 ssh 密钥相关的输出。将运行的交互式运行的输出通过管道传输到文件,然后将服务(未运行)的输出通过管道传输到文件。使用差异实用程序读取这两个文件。如果你熟悉 vim,我推荐 vimdiff。这至少应该让您知道哪里有不同以及哪里出了问题。

编辑:我认为 rsync 现在默认为 ssh,您可以在 ~/.ssh/config 中添加远程主机的条目。这应该配置任何 ssh 会话(包括 rsync)以使用提供的身份/密钥以及您想要的其他主机特定选项。

相关内容