rsync を非対話モードに強制する

rsync を非対話モードに強制する

Python スクリプト内で rsync を使用したいと思います。モジュールを使用して呼び出しsubprocessauthorized_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 がすぐに終了しました。

関連情報