Sshの出力を別のコマンドにパイプしたいと思います。例えば:
ssh myserver cat remote-file | diff local-file -
問題は、myserverがパスワードを要求するのに、パスワードを入力できないことです。 (何らかの理由で、サーバーで公開鍵認証を使用できません。これを変更することはできません。)「Password:」プロンプトが表示されますが、入力した鍵がエコーされ、sshに渡されません。どうすればsshにパスワードを取得させることができますか?
パスワードをsshにパイプする を試みていないことに注意してください。 sshの出力をパイプ処理して、通常どおりパスワードを入力しようとしています。
重要な場合は、OS X 10.7(Lion)と標準のターミナルでbashを使用しています。これを引き起こす可能性のあるエイリアスを設定していません。同じ問題が異なる(Linux)システムで見られたので、それは私のセットアップに固有のものではないと思います。
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を呼び出すと失敗します。したがって、これを次の機会と見なします。このコードを修正してください...)
この回答はあなたの特定の問題を説明するものではありませんが、あなたの生活をより便利にする可能性のあるいくつかの可能な回避策を提供します。
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セッションの再利用 を参照してください。