引用符なしでSSHコマンドを実行する

引用符なしでSSHコマンドを実行する

以下を使用して、リモートサーバーでコマンドを実行できます。

ssh user@host 'the command'

しかし、引用符なしでコマンドを実行する方法はありますか?

(私はBSDを使用し、OpenSSHを使用します)

ベストアンサー1

コマンドによって異なります。通常、リモートコンピュータにコマンドを渡すときは、通常、ローカルシェルで解釈されるコマンドのすべての文字をエスケープする必要があります。過度に一般化する危険性があるため、ローカルシェルが解釈しようとする文字がないと、引用符が必要ない可能性があります。その結果、シェル文字が正しくエスケープされると(ローカルシェルがそれを解釈しないように)、引用符が必要なコマンドを再作成して引用符を必要としない可能性があります。

date.outリモートシステムの日付をリモートシステムのユーザーホームディレクトリにあるファイルにキャプチャすることを検討してください。引用符を使用してこれを達成する1つの方法は次のとおりです。userhost

ssh user@remote 'date > date.out'

引用符なしでコマンドを実行しようとする誤った試みは次のとおりです。

ssh user@remote date > date.out

これにより、ローカルシェル処理では> date.outリモートsshコマンドのみがそのまま残りますdate。コマンドはdateリモートで実行されますが、出力はローカルに保存されます。これを防ぐには、>シンボルをエスケープする必要があります。

ssh user@remote date \> date.out

このコマンドを実行した後、2番目の例を続行できます。引用したコマンドを使用して、出力ファイルlsとその内容を調べてみましょうcat

ssh user@remote 'ls -l date.out; cat date.out'

引用しないコマンド:

ssh user@remote ls -l date.out; cat date.out

リモートでのみlsコマンドを実行してください。catローカルシェルはセミコロン文字を2つのコマンド間の区切り文字として解釈するため、コマンドはローカルで実行されます。

引用符なしでコマンドを正しく実行するには、次のものを使用できます。

ssh user@remote ls -l date.out\; cat date.out

コマンドで変数またはパラメーター拡張を使用したい場合も、同様の規則が適用されます。変数がローカル環境で定義されている場合、通常は引用符(またはエスケープ)は必要ありません。ローカルユーザーがalexコマンドを実行する場合:

ssh user@remote echo $USER

alex$USERのローカル値がリモートホストに送信される前にsshコマンドで拡張されるため、出力されます。コマンドが次の場合二重引用符:

ssh user@remote "echo $USER"

ローカルシェルは二重引用符で囲まれている場合は変数を拡張するため、結果は同じです。ただし、2つのコマンドの1つは次のとおりです。

ssh user@remote 'echo $USER'

または

ssh user@remote echo \$USER

user文字列拡張は、$USERローカルシェルではなくリモートホストによって実行されるために印刷されます。

おすすめ記事