貼り付けた入力はどこに行きますか?

貼り付けた入力はどこに行きますか?

一連のシェルコマンドをコピーしてターミナルエミュレータに貼り付けていますが、動作が混乱しています。

  • 1行を貼り付けると、ssh user@remote "echo foo"; echo bazコンピュータは期待どおりに機能します。 SSHコマンドを発行してからSSHセッションが終了すると、何かをエコーし​​ます。
  • ところで、複数行のコマンドで同じ内容を貼り付けると、これは発生しません。
    ssh user@remote "エコ foo"
    エコバズ
    それでもSSHセッションを見ることができますが、echo baz完全に消えました。どのコマンドも実行されませんでした。
  • これは少なくともSSHに関連しているようです。 SSHを別のものに置き換えると、実際に予想される動作が発生するためです。このコマンドを貼り付けると、両方のコマンドが実行されます。たとえば、次のようになります。
    エコリッチ
    エコバズ

それで、正確に何が起こりましたか?貼り付けた入力はどこに行きますか? echoコマンドが実行されないのはなぜですか?何もない?これはSSHとどのような関係がありますか?

Ctrl(注:私は+ XCtrl+メソッドを知っていますが、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/nullssh

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

おすすめ記事