これらの職業、
ssh remote 'echo hi > hi.txt'
echo hi | ssh remote 'cat > hi.txt'
しかし、これはうまくいきません
ssh remote sh -c 'echo hi > hi.txt'
「hi」を含むhi.txtというファイルをリモートで生成したいと思います。代わりに私は得る空ファイル名はhi.txtです。
以下は、対話型SSHセッションで実行するときに予想される動作を提供します。
sh -c 'echo hi > hi.txt'
SSHとリダイレクトについてどのような誤解がありますか?
答え1
あなたのローカルシェルがあなたの引用符を削除していると思います。あなたは試すことができます
ssh remote sh -c '"echo hi > hi.txt"'
sshを使用してリモートコマンドを送信するときに送信された各行を読み取るための2つのシェルがあります。ローカルシェルとリモートシェル。
これについての良い説明は以下にあります。リモートシェルのUnix / Linuxシェルリファレンス
答え2
これはおそらくsshを使用するときに最も混乱していて迷惑なことです(少なくとも私の考えでは)。
この動作は、リモートコマンドを実行したときにsshがパラメータを保存しないために発生します。すべてのパラメータを取得し、スペースで区切って一緒に連結します。
だからあなたが走るとき
ssh remote sh -c 'echo hi > hi.txt'
実際に実行中の内容は次のとおりです。
ssh remote 'sh -c echo hi > hi.txt'
これはsh -c echo
シェル(いいえecho
)引数hi
(未使用)を入力して出力をにリダイレクトしますhi.txt
。
chhonous(ネストされた参照)が提供するソリューションは、この問題を解決する1つの方法です。一度見てください。
ssh remote sh -c '"echo hi > hi.txt"'
ここで何が起こるのかは、SSH接続がすべてのパラメータを使用するため、実際には次のような結果が発生することです。
ssh remote 'sh -c "echo hi > hi.txt"'