私の間違いはどこにありますか?質問への回答としてスタック交換の質問、ディレクトリをtarし、アーカイブをリモートシステムに転送します。リモートシステムはtee
それをファイルに保存し、tar
解凍するためにパイプします。
私の元のコマンドは...生成されますが、生成されません。tar -cf - mydir | ssh [email protected] bash -c "tee archive.tar | tar -xf -"
mydir
archive.tar
より簡単なテストのためにcat
私はリモコンに書いて/tmp/outfile
から。しかし、ファイルは触れていないようです。/tmp/outfile
tee
tee
$ 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
生成しないでください。tee
DATAで上書きしたらどうでしょうか?/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
-c
archive.tar
$0
tee
bash
標準出力キャプチャして処理する場所ですtar
。
正しい方法は、に渡されたコマンド文字列を引用してssh
次のコマンドを提供することです。
ssh [email protected] 'tee archive.tar | tar -xf -'