SSH出力を別のコマンドにパイプするときは、キーボード対話型認証を使用してください。

SSH出力を別のコマンドにパイプするときは、キーボード対話型認証を使用してください。

sshの出力を別のコマンドにパイプしたいです。たとえば、

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

問題は、myserverがパスワードを要求するためにパスワードを入力できないことです。 (何らかの理由でサーバーは公開鍵認証を使用できません。この設定を変更することはできません)。 sshにパスワードを取得させる方法は?

やりたくないので参考にしてくださいパスワードをSSHにパイプ。 SSH出力をパイプし、通常どおりパスワードを入力しようとしています。

万が一に備えて、私はOS X 10.7(Lion)でbashと標準端末を使用しています。この問題を引き起こす可能性があるエイリアスを設定していません。他の(Linux)システムで同じ問題を見たことがあるので、私の設定に限定された問題ではないと思います。

答え1

まあ、これは私の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_titleANSIエスケープコードを使用して現在の端末タイトルとアイコンタイトルを設定する小さな機能です。ご覧のとおり、これはサブシェルを作成し、$(...)私の直感はこれが問題かもしれないと言います。実際、この行を変更した後は効果がありました!

なぜこれが起こるのかを知っている人がいる場合は、詳細を聞きたいです。サブシェルは通常入力を盗みますかtty?それともデバッグトラップの問題ですか?stdin一般的な入力/パイプラインコマンドの問題は覚えていません。

(ご覧のように、私の機能にはとにかくいくつかの問題があります。解決策としてサブシェルの1つを使用しているので、古代のbashバージョンで動作します(従来のシステムでは立ち往生していますが、まだ統合構成が必要です))別のサブシェルを使用するすると実際の命令を抽出するのに使われますがsudo、このようなスイッチでsudoを呼び出すと失敗するsudo -H -u user commandので、今回のコードを修正する機会とみます...)

答え2

この答えはあなたの特定の問題を説明しませんが、あなたの人生をより便利にするためのいくつかの可能な解決策を提供します。

リモートコマンドを実行せずにSSHを使用してリモートファイルにアクセスする場合は、次の手順でリモートファイルシステムをマウントできます。sshfs。あなたはインストールする必要がありますOS X用ヒューズそしてSSHFS最初。 (OSX用のバイナリディストリビューションがあるかどうかはわかりません。)その後、次の手順を実行します。

mkdir ~/myserver
sshfs myserver:/ ~/myserver

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

一度認証した後に複数のSSHコマンドを実行するもう1つの方法は、マスター接続を確立することです。バラよりSSHセッションを再利用してrsyncコマンドを実行する

関連情報