/home/localuser/backup-script.sh
次のコードスニペットを含むbashスクリプトがあります。
rsync -avzh \
-e "ssh -i /home/localuser/.ssh/id_ed25519" \
/home/localuser/backups/file-to-backup.gz \
[email protected]:/home/remoteuser/backups
シェルから直接実行すると、すべてが魅力のように動作しますが、設定した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 [email protected]
何が起こっているのか分からない…手がかりはありますか?
rsync
追加情報:交換時に同じエラーが発生します。scp
編集する:
Stewartのコメントに従ってこのコマンドを実行してスクリプトを直接実行しようとしましたが、env -i /bin/bash --norc --noprofile backup-script.sh
この場合はSSHキーパスワードの入力を求められたので、問題はStewartのコメントに記載されているのとまったく同じです。
簡単な解決策で問題を解決するために(したがってssh-agent
サービスとして追加、自動キーロード、および起動時に自動パスワード入力を防ぐ)、スクリプトのrsync
コマンドを変更し、2行目(-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は、接続、ssh設定、およびsshキーに関連する一連の出力をstdoutとして印刷します。実行中の対話型実行の出力をファイルにパイプし、サービス(実行されていない)の出力をファイルにパイプします。両方のファイルを読み取るには、diff ユーティリティを使用します。 vimに慣れている場合はvimdiffをお勧めします。これにより、少なくとも何が違うのか、何が間違っているのかというアイデアを得ることができます。
編集:これで、rsyncのデフォルトはsshであり、~/.ssh/configにリモートホストのエントリを追加できると思います。これにより、他のホスト固有のオプションに付属のID /キーを使用するようにSSHセッション(rsyncを含む)を設定する必要があります。