以下を使用して、リモートサーバーでコマンドを実行できます。
ssh user@host 'the command'
しかし、引用符なしでコマンドを実行する方法はありますか?
(私はBSDを使用し、OpenSSHを使用します)
答え1
コマンドによって異なります。通常、リモートコンピュータにコマンドを渡すときは、通常、ローカルシェルで解釈されるコマンドのすべての文字をエスケープする必要があります。過度に一般化する危険性があるため、ローカルシェルが解釈しようとする文字がないと、引用符が必要ない可能性があります。その結果、シェル文字が正しくエスケープされると(ローカルシェルがそれを解釈しないように)、引用符が必要なコマンドを再作成して引用符を必要としない可能性があります。
date.out
リモートシステムの日付をリモートシステムのユーザーホームディレクトリにあるファイルにキャプチャすることを検討してください。引用符を使用してこれを達成する1つの方法は次のとおりです。user
host
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
ローカルシェルではなくリモートホストによって実行されるために印刷されます。
答え2
ここで:
$ ssh host.example.com echo this is a test
this is a test