systemd サービスが 2 つのサーバー間の scp 認証に失敗する

systemd サービスが 2 つのサーバー間の scp 認証に失敗する

CentOS7 サーバー上で、シェル スクリプトをトリガーして postgres データベースをバックアップするサービスを作成しました。バックアップ ファイルを /tmp/ フォルダーにダンプし、そのファイルを別のサーバーにコピーするはずですが、何かがおかしいようです。私の bash が原因だと思います。サービスはバックアップは正常に行いますが、別のサーバーにコピーするときに失敗します。

公開鍵認証を使用して、server1 の /tmp/ フォルダーから server2 の /tmp/ フォルダーにバックアップ ファイルを手動で scp 送信できるので、両者の間でパスワードは必要ありませんが、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

今では期待通りに動作し、正常に終了します。

関連情報