sudoで実行されているPythonスクリプトでsshを使用するとrsyncエラーが発生する

sudoで実行されているPythonスクリプトでsshを使用するとrsyncエラーが発生する

Raspberry PiのDebian Linuxでは、パスワードを提供する必要がないように、sshキーを使用してPythonスクリプトでrsyncを実行してみました。 Pythonスクリプトをサービスとして実行する予定です。私が使用しているスクリプトmyScript.pyから

def syncImageFiles(remoteUser, src, dest):
   runssh = f"'ssh -i /home/{remoteUser}/.ssh/id_rsa'"
   syncCmd = ['rsync', '-zr', '--bwlimit=400', '--delete', '-e', runssh, src, dest]
   subprocess.run(syncCmd)
   ...

syncImageFiles('pi', '[email protected]:/home/pi/images/', '/home/user1/images')

私のローカルRaspberry Piでスクリプトを実行すると、以下のようにuser1としてログインします。

sudo python3 myScript.py

次のエラーが発生します。

rsync: Failed to exec ssh -i /home/user1/.ssh/id_rsa: No such file or directory (2)

ただし、次のようにコマンドラインからsudoにrsyncコマンドを実行すると、

sudo rsync -zr --bwlimit=400 --delete -e 'ssh -i /home/user1/.ssh/id_rsa' [email protected]:/home/pi/images/ '/home/user1/images'

それは非常にうまく動作します。フルパス/usr/bin/sshを提供しようとしましたが、役に立ちませんでした。次へ追加

fullCmd = ' '.join(syncCmd)
logging.info(fullCmd)

結果が「sudo」を除いて、コマンドラインに入力したものと正確に一致することを確認しました。それでは、私が何を見逃しているのでしょうか?

更新:他のウェブ検索からいくつかの手がかりを得ました。ファイルが見つかりませんエラーが発生する理由は、rsyncが-eオプションに渡された文字列全体をファイルとして扱うためです。私はsyncCmdを使ってsubprocess.run()に個々の引数を与える方法と同様に、-eオプションが個々の引数を見るように強制する方法が必要だと思います。私の推測が正しい場合は、Pythonフォーラムに回答を投稿するのが最善です。

ベストアンサー1

おすすめ記事