stdinがプロセスを「スキップ」する方法はありますか?たとえば、次のコマンドでは
cat file | ssh host 'mkdir -p /some/directory && cat > /some/directory/file'
cat
これは、最初から2番目に標準入力を送信し、mkdir
2番目はcat
標準入力を受け取りません。最初の標準出力をcat
スキップしてmkdir
2番目の標準出力にのみ送信したいですcat
。私はあなたが次のようなことを実行できることを知っています。
cat file | ssh host 'cat > /tmp/file2 ; mkdir -p /some/directory && mv /tmp/file2 /some/directory/'
ファイルをコピーするときのみ
cat file | ssh host 'tee >(mkdir -p /some/directory) >/some/directory/file'
ただし、これはmkdir
コマンドが標準入力を使用しないために機能します。この機能を複製するコマンドはありますか?それは次のとおりです。
cat file | ssh host 'stdinhop mkdir -p /some/directory | cat > /some/directory/file'
stdinhop
stdinをmkdirに送らずに2番目の猫が読めるようにstdoutにリダイレクトする場所はどこですか?
答え1
次に、最初のコマンドの標準入力をリダイレクトできます/dev/null
。
anthony@Watt:~$ echo -e 'hello\nworld' | ssh localhost 'cat < /dev/null && cat -n'
1 hello
2 world
行には番号が付けられているので、2行目から取得します cat
。
SSH を使用しない場合は、サブシェルを使用できます。echo -e 'hello\nworld' | ( cat < /dev/null && cat -n )
答え2
実際、あなたが望むことはすでに行われています。もちろん、mkdir
あなたの問題ではありません。stdin
とにかく読まれません。パイプは、ssh
そのようなものが得られない限り、標準入力として-のすべての子に継承されますssh -t
。
それに加えて、問題は、これらのコマンドを実行するシェルが子のssh
1つであるということです。タスクの一部は、実行する各コマンドグループに対して0,1,2を開くことです。入力は、共通記述子(シェルが各子に対して再び開く記述子)にあるため、シャッフルで失われます。
したがって、最も簡単なのは、入力をこれら3つのデフォルト値の1つではなく記述子に移動することです。たとえば、次は私にとって効果的でした。
echo hey there >file
cat file | ssh mikeserv@localhost '
exec 3<&0
mkdir -p .
echo ho there
cat <&3'
上記を実行すると、次のように印刷されます。
ho there
hey there
-W
オプションの中にいくつかのユーティリティを見つけることもできますssh
。man ssh
説明する:
-W
所有者 :ポート- クライアントの標準入力と出力を次に渡すように要求します。所有者存在するポート安全なパスを介して、、、-N
およびを意味します。-T
ExitOnForwardFailure
ClearAllForwardings
プロトコルバージョン2でのみ利用可能