回答:
SSHリモートシェルで(たとえば、rsyncサーバーではなく)rsyncを使用すると仮定すると、rsyncでパスワードを要求しない方法でSSHを実行できます。たとえば、一度この呼び出しを使用できます:
rsync -e 'ssh -o "NumberOfPasswordPrompts 0"' source user@target:/path
これにより、rsyncは0回のパスワード試行でSSHを使用するように強制されます。他の認証方法(公開鍵やGSSAPIなど)を使用してアクセスできない場合、エラーで失敗します。その場合、rsyncはあなたを気に入らず、大声でSTDERRに文句を言い、終了コード255でブレークすることに注意してください。
静かに保つために使用するsshのコマンドラインオプションを次に示します。
ssh -o stricthostkeychecking=no -o userknownhostsfile=/dev/null -o batchmode=yes -o passwordauthentication=no
あなたがknown_hostsファイルを維持しておらず、MitM警告を取得することを心配している場合にのみ、hostkeyのものが必要です。James Fが提案した認証タイプを指定するのではなく、パスワード認証を明示的に制限する必要がありました。私はこれを使用して、いくつかの異なるOSバージョンを持つ数百のホストを攻撃するので、それは単に非互換性であるかもしれません。
最初にシェルからrsyncを動作させると、コマンドは次のようになります。
それが失敗した場合は、sshコマンドを単独でデバッグします。すべてがうまくいったら、Pythonスクリプトに何が起こるかを確認します
rsyncの起動方法によっては、TTYまたはPTYを指定しないことが役立つ場合があります。
多くのプログラムは、ユーザーに入力を求めることを決定する前に、制御TTYがあるかどうかを確認します。system()および類似の呼び出しのデフォルトの動作は、ttyをサブプログラムに提供することですが、これを無効にすることができます。
また、両方のシステムを制御していて、この問題を解決しながらセキュリティ上の利点のためにパスワード認証から離れたい場合は、リモート側でパスワード認証を完全に無効にすることもできます。
SSH経由でrsyncを実行している場合は、問題のホストのssh_configファイルに以下を追加するか、-oコマンドラインスイッチを使用します。
PreferredAuthentications publickey
(rsyncではなくsshのみの)クイックテストで、パスワードを要求せずに公開鍵が受け入れられなかった場合にSSHがすぐに終了しました。