SSHを介してリモートで起動したときにteeが動作を拒否するのはなぜですか?

SSHを介してリモートで起動したときにteeが動作を拒否するのはなぜですか?

私の間違いはどこにありますか?質問への回答としてスタック交換の質問、ディレクトリをtarし、アーカイブをリモートシステムに転送します。リモートシステムはteeそれをファイルに保存し、tar解凍するためにパイプします。

私の元のコマンドは...生成されますが、生成されません。tar -cf - mydir | ssh [email protected] bash -c "tee archive.tar | tar -xf -"mydirarchive.tar

より簡単なテストのためにcat私はリモコンに書いて/tmp/outfileから。しかし、ファイルは触れていないようです。/tmp/outfileteetee

$ ssh [email protected] rm -r /tmp/outfile
$ echo data | ssh [email protected] bash -cx "cat > /tmp/outfile"
+ cat
$ echo DATA | ssh [email protected] bash -cx "tee /tmp/outfile"
DATA
+ tee
$ ssh [email protected] cat /tmp/outfile
data

/tmp/outfile存在しない場合はtee生成しないでください。teeDATAで上書きしたらどうでしょうか?/tmp/outfileリモートサーバーにログインして実行すると、期待どおりに機能します。

リモートサーバーはCentos 8を実行しています。私はいつもエラーが明らかなように感じますが、それを見ることはできません。

答え1

これは古典的な引用問題ですが、この場合は確実に解決しようとしました。あなたのtar構造を検討してください。

ssh [email protected] bash -c "tee archive.tar | tar -xf -"

ローカルシェルは、これを一般的な処理、引用符の削除、代替変数などの一部として評価します。最終結果は、ssh実行のための二重引用符なしでコマンドラインを受け取り、それが実行のためにリモートシェルに渡されることです。

bash -c tee archive.tar | tar -xf -

インスタンスは引数としてbash割り当てられ、asに渡された値はそのまま残ります(後で無視されます)。このインスタンスで実行されるコマンドにはリストされた出力ファイルがないため、その内容を次にパイプします。tee-carchive.tar$0teebash標準出力キャプチャして処理する場所ですtar

正しい方法は、に渡されたコマンド文字列を引用してssh次のコマンドを提供することです。

ssh [email protected] 'tee archive.tar | tar -xf -'

関連情報