systemd 服务无法在两个服务器之间验证 scp

systemd 服务无法在两个服务器之间验证 scp

我在 CentOS7 服务器上编写了一个服务,该服务触发 shell 脚本来备份 postgres 数据库。它将备份文件转储到 /tmp/ 文件夹中,然后应该将文件复制到另一台服务器,但有些不对劲,我怀疑是我的 bash 出了问题。该服务可以正常进行备份,但在将其复制到另一台服务器时失败了。

我能够使用公钥认证手动将备份文件从 server1 中的 /tmp/ 文件夹 scp 到 server2 中的 /tmp/ 文件夹,因此两者之间无需密码,但我不确定为什么 systemd 会出现以下错误:

Aug 17 14:29:34 pcc-home-page-one.novalocal systemd[1]: Started backup service for production.
Aug 17 14:29:35 pcc-home-page-one.novalocal backup.sh[1467]: Permission denied, please try again.
Aug 17 14:29:35 pcc-home-page-one.novalocal backup.sh[1467]: Permission denied, please try again.
Aug 17 14:29:35 pcc-home-page-one.novalocal backup.sh[1467]: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
Aug 17 14:29:35 pcc-home-page-one.novalocal backup.sh[1467]: lost connection
Aug 17 14:29:35 pcc-home-page-one.novalocal systemd[1]: backup.service: main process exited, code=exited, status=1/FAILURE
Aug 17 14:29:35 pcc-home-page-one.novalocal systemd[1]: Unit backup.service entered failed state.
Aug 17 14:29:35 pcc-home-page-one.novalocal systemd[1]: backup.service failed.

这是我的 bash 脚本:

#!/usr/bin/env bash

today=$(date +"%d-%m-%Y")

pg_dump -U db_backup -h localhost pcc_db >/tmp/backup-${today}.bak

scp /tmp/backup-${today}.bak [email protected]:/tmp/

这是服务文件:

[Unit]
Description=backup service for production

[Service]
Type=simple
ExecStart=/home/ifunk/backup.sh

请问我该怎么做才能使脚本中的 scp 行正常工作?

编辑:查看 journalctl 日志我收到以下错误:

Unregistered Authentication Agent for unix-process:3757:6223410 (system bus name :1.42, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_GB.UTF-8) (disconnected from bus)

我已将 SELinux 设置为 Permissive,并运行 daemon-reload,但服务仍然因同样的错误而失败。

答案1

感谢 reddit 用户 u/Skaarj,这个问题现已得到解决。他说道:

systemd 默认假设您以系统用户(没有主目录的非人类用户)身份运行服务。这就是为什么未设置 $HOME 的原因。

你可以

start your systemd unit as a secific user

or give scp the path to the ssh key using the -i flag

所需要做的就是编辑 bash 脚本并将密钥文件添加到 scp 命令,bash 脚本现在如下所示:

#!/usr/bin/env bash

today=$(date +"%d-%m-%Y")

pg_dump -U db_backup -h localhost pcc_db >/tmp/backup-${today}.bak

scp -i /home/ifunk/.ssh/id_rsa /tmp/backup-${today}.bak

现在它可以完成预期的工作并干净地退出。

相关内容