systemd 서비스가 두 서버 간의 scp를 인증하지 못함

systemd 서비스가 두 서버 간의 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

이제 예상대로 수행되고 깔끔하게 종료됩니다.

관련 정보