Centos7
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 ifunk@10.88.59.200:/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,但服務仍然失敗並出現同樣的錯誤。
多虧了 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
它現在做了它應該做的事情並乾淨地退出。