web-dev-qa-db-ja.com

ssh出力を他のコマンドにパイプするときにキーボードインタラクティブ認証を使用する

Sshの出力を別のコマンドにパイプしたいと思います。例えば:

ssh myserver cat remote-file | diff local-file -

問題は、myserverがパスワードを要求するのに、パスワードを入力できないことです。 (何らかの理由で、サーバーで公開鍵認証を使用できません。これを変更することはできません。)「Password:」プロンプトが表示されますが、入力した鍵がエコーされ、sshに渡されません。どうすればsshにパスワードを取得させることができますか?

パスワードをsshにパイプする を試みていないことに注意してください。 sshの出力をパイプ処理して、通常どおりパスワードを入力しようとしています。

重要な場合は、OS X 10.7(Lion)と標準のターミナルでbashを使用しています。これを引き起こす可能性のあるエイリアスを設定していません。同じ問題が異なる(Linux)システムで見られたので、それは私のセットアップに固有のものではないと思います。

7
jdm

OK、これは私のbash構成との奇妙な相互作用が原因であることがわかりました。

_.bash_profile_に、現在実行されているコマンドをウィンドウのタイトルまたはscreenタブに配置するものがあります。 trapを使用して機能します。

_trap 'bash_current_command' DEBUG
_

そしてその前に:

_function bash_current_command {
    # only works in bash > 3.1
    #set -- $BASH_COMMAND

    # for old bash
    set -- $(history 1)
    shift

    if [[ "$1" == "Sudo" ]]; then
        cmd="*$(basename -- "$2")*"
    else
        cmd="$(basename -- "$1")"
    fi

    bash_set_title "$cmd"
}
_

_bash_set_title_は、ANSIエスケープコードを使用して現在の端末のタイトルとアイコンのタイトルを設定する小さな関数です。ご覧のとおり、これによりサブシェル$(...)が作成され、直感的にこれが問題になる可能性があることがわかりました。確かに、私がそれらの行を変更した後、それはうまくいきました!

なぜこれが起こるのか誰かが知っているなら、私は詳細を聞いてうれしいです。サブシェルは一般的にtty入力を盗みますか?それとも、デバッグトラップの問題だけですか?通常のstdin入力/コマンドへのパイピングの問題を思い出しません。

(あなたも見ることができるように、とにかく私の関数にはいくつかの問題があります-それは回避策としてサブシェルの1つを使用するので、古風なbashバージョンで実行できます(私はレガシーシステムでそれを使い続けていますが、それでも欲しかったSudoを使用する場合、もう1つのサブシェルを使用して実際のコマンドを抽出しますが、_Sudo -H -u user command_などのスイッチでSudoを呼び出すと失敗します。したがって、これを次の機会と見なします。このコードを修正してください...)

4
jdm

この回答はあなたの特定の問題を説明するものではありませんが、あなたの生活をより便利にする可能性のあるいくつかの可能な回避策を提供します。

Sshをリモートファイルへのアクセスのみに使用し、リモートコマンドを実行しない場合は、 sshfs を使用してリモートファイルシステムをマウントできます。最初に Fuse for OS X および [〜#〜] sshfs [〜#〜] をインストールする必要があります。 (OSX用のバイナリディストリビューションがあるかどうかはわかりません。)次に、

mkdir ~/myserver
sshfs myserver:/ ~/myserver

sshfsコマンドを実行する場合にのみ認証する必要があります。その後、リモートファイルは~/myserverで利用できるようになるため、ファイルの1つがリモートであることを心配することなくdiff ~/myserver/path/to/remote-file local-fileを実行できます。 fusermount -u ~/myserverを実行して、ファイルシステムをアンマウントします。

一度認証してから多くのsshコマンドを実行できる別のアプローチは、マスター接続をセットアップすることです。 繰り返されるrsyncコマンドのためのsshセッションの再利用 を参照してください。