リモートファイルをdiffにインポートするときのパスワードの問題

リモートファイルをdiffにインポートするときのパスワードの問題

ローカルファイルをリモートファイルと比較する場合は、通常、次のいずれかが機能します。

$ ssh remote cat file | diff file -
$ diff file <(ssh remote cat file)

しかし、時には(特にパスワードを要求するとき)、次のように失敗します。

$ ssh remote cat file | diff file -
1,162d0
< ...
< ...
Password: 

ここでは、完了をdiff待たずにssh2番目のファイルが空であると見なします。diff完了するまでパスワードを要求しませんが、ssh遅すぎます。

$ diff file <(ssh remote cat file)
Password: 
Password:       # asking again after a few seconds
#&%Pasword:     # the typed raw password leaks into the terminal
user@remote's password:
Permission denied, please try again.
user@remote's password:
Permission denied, please try again.
user@remote's password:
Received disconnect from XXX.XX.XX.XX: 2: Too many authentication failures for user
1,162d0
< ...
< ...

今回はsshパスワードを聞いてみますが、入力したパスワードが端末にエコーされますがssh検索できません。最後にssh失敗し、空のdiff2番目のファイルに進みます。

なぜこれが起こるのかを説明してください。それとも何が起こっているのかを詳しく説明してください。フード

ベストアンサー1

SSHを最初に実行すると:

ssh remote 'cat file' | cat

sshは制御端末を標準入力として使用するため、問題なくパスワードを入力できます。

バッシュ使用時プロセスの交換、stdin は最初のコマンドに接続されたままで、子プロセスの出力パイプは最初のコマンドに引数として渡されます。

cat <(ssh remote 'cat file')

SSHネゴシエーションが成功すると、/dev/fd/63出力を含むパイプが生成されますssh remote 'cat file'

これは次のコマンドで説明できます。

$ echo <(ls)
/dev/fd/63

重要な部分は端末がcatstdinに接続されていsshません。。実行するとcat、コマンドライン引数が取得されます(たとえば/dev/fd/63、catはstdinを完全に無視しますが、代わりにまだcatプロセスに接続されているため、sshパスワードは使用できません)。

これを変更するには、まず上記のようにssh出力を実行してからパイプする必要があります。diff

ssh remote 'cat file' | diff file -

おすすめ記事