我有一个 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]
我不知道发生了什么事......有任何线索吗?
附加信息:我得到同样的错误替换rsync
为scp
编辑:
根据斯图尔特的评论,我尝试通过运行此命令直接启动脚本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
添加来更改并不能解决问题。--login
ExecStart=/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
将使-vvv
ssh 向 stdout 输出一堆与连接、ssh 配置和 ssh 密钥相关的输出。将运行的交互式运行的输出通过管道传输到文件,然后将服务(未运行)的输出通过管道传输到文件。使用差异实用程序读取这两个文件。如果你熟悉 vim,我推荐 vimdiff。这至少应该让您知道哪里有不同以及哪里出了问题。
编辑:我认为 rsync 现在默认为 ssh,您可以在 ~/.ssh/config 中添加远程主机的条目。这应该配置任何 ssh 会话(包括 rsync)以使用提供的身份/密钥以及您想要的其他主机特定选项。