SSH対話型およびコマンドリダイレクトの動作が一貫していない

SSH対話型およびコマンドリダイレクトの動作が一貫していない

これらの職業、

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"'

関連情報