Python スクリプト内で rsync を使用したいと思います。モジュールを使用して呼び出しsubprocess
、authorized_key
リモート マシン上のファイルに保存されている公開キーを使用して認証します。
唯一の問題は、間違ったリモート ユーザー名を使用して rsync を使用すると、パスワードの入力を求められ、バックアップ スクリプトが永久に停止してしまうことです。
rsync
認証できない場合、パスワードの入力を求めるのではなく、エラーで強制終了することはできますか?
ウディ
答え1
SSH リモート シェルで rsync を使用する場合 (たとえば、rsync サーバーでは使用しない場合)、パスワードを要求しない方法で rsync に SSH を実行させることができます。たとえば、次の呼び出しを使用できます。
rsync -e 'ssh -o "NumberOfPasswordPrompts 0"' source user@target:/path
これにより、rsync はパスワード試行回数が 0 の SSH を使用するようになります。他の認証方法 (公開キーや GSSAPI など) を使用してアクセスできない場合は、エラーが発生して失敗します。これが発生すると、rsync はそれを嫌い、STDERR に大声でエラーを出力し、終了コード 255 で中断することに注意してください。
答え2
以下は、ssh を静かに保つために使用するコマンドライン オプションです。
ssh -o stricthostkeychecking=no -o userknownhostsfile=/dev/null -o batchmode=yes -o passwordauthentication=no
ホストキーが必要なのは、known_hosts ファイルを維持しておらず、MitM 警告が表示されることを心配している場合のみです。James F の提案に従って認証タイプを指定するのではなく、パスワード認証を明示的に制限する必要がありました。ただし、これを使用して、いくつかの異なる OS バージョンを持つ数百のホストにアクセスしているため、単に互換性がないだけかもしれません。
答え3
James の提案 (tty を指定しない) については、サブプロセスの場合は、Popen のパラメーターとして stdin=None を設定してみてください。
答え4
rsync の起動方法によっては、TTY または PTY を指定しないことが役立つ場合があります。
多くのプログラムは、ユーザーに入力を求める前に、制御 TTY があるかどうかを確認します。system() および同様の呼び出しのデフォルトの動作は、サブプログラムに tty を提供することですが、これを無効にすることもできます。
また、両方のシステムを制御し、セキュリティ上の利点のためにパスワード認証を回避しながらこの問題を解決したい場合は、リモート側でパスワード認証を完全に無効にすることも可能です。
SSH 経由で rsync を実行している場合は、問題のホストの ssh_config ファイルに次の内容を追加するか、-o コマンドライン スイッチを使用して追加できます。
PreferredAuthentications publickey
簡単なテスト (rsync ではなく ssh のみ) では、パスワードの入力を求めることなく公開キーが受け入れられなかったため、SSH がすぐに終了しました。