一連のシェルコマンドをコピーしてターミナルエミュレータに貼り付けていますが、動作が混乱しています。
- 1行を貼り付けると、
ssh user@remote "echo foo"; echo baz
コンピュータは期待どおりに機能します。 SSHコマンドを発行してからSSHセッションが終了すると、何かをエコーします。 - ところで、複数行のコマンドで同じ内容を貼り付けると、これは発生しません。
ssh user@remote "エコ foo" エコバズ
それでもSSHセッションを見ることができますが、echo baz
完全に消えました。どのコマンドも実行されませんでした。 - これは少なくともSSHに関連しているようです。 SSHを別のものに置き換えると、実際に予想される動作が発生するためです。このコマンドを貼り付けると、両方のコマンドが実行されます。たとえば、次のようになります。
エコリッチ エコバズ
それで、正確に何が起こりましたか?貼り付けた入力はどこに行きますか? echoコマンドが実行されないのはなぜですか?何もない?これはSSHとどのような関係がありますか?
Ctrl(注:私は+ X、Ctrl+メソッドを知っていますが、E時には特にWindowsでターミナルエミュレータを使用している場合はデフォルトでは機能しません。)
答え1
以下を貼り付けてみてください。
ssh user@host 'read foo; echo ">>$foo<<"'
echo bar
サーバーから出力を表示できます>>echo bar<<
。echo
これはssh
、あなたがしたように標準入力に貼り付けたデータを食べることを意味します。
echo 'echo bar' | ssh user@host 'read foo; echo ">>$foo<<"'
この問題の解決策は、次にssh -n
リダイレクトされるを使用することです。/dev/null
ssh
ssh -n user@host 'echo foo'
echo bar
残念ながら貼り付けメカニズムがわからないので賢い言葉はできません。なぜ貼り付けたデータはstdinストリームで終わりますがssh
(stdinからコマンドを読み取る)、対話型シェルから継承されたストリームに関連していると推測されます。
使用することもssh -n
解決策です(または少なくともㅏ解決)問題
while read something; do
ssh user@host 'somecommand'
done <inputfile
ここでループはssh
のデータを食べるので一度だけ実行されますinputfile
。