ローカルパラメータ値を使用してリモートスクリプトを実行する


8

このタスクを自動化するにはどうすればよいですか?

1)Aにいます。2)BにSSHで接続します。3)Bでスクリプトを実行します。これには、Aで認識されているパラメータが必要です。

まず、sshで接続を開いたときに値を送信できると思いました。次に、おそらく1)と2)の間でより単純な方法で、スクリプト全体をBの同じ場所にscpします(古いスクリプトを置き換える)。それでも、Bでスクリプトを実行するにはどうすればよいですか。(つまり、最後のステップを自動化する方法です。もちろん、sshの後で手動で実行することもできます。)

もう1つの考えは、おそらくsshを完全に破棄することです-私はBにWebページを持っているので、「内部」Webインターフェイスを介してスクリプトを呼び出すことができますか?

それとも、まったく異なる方法でそれを行いますか?


回答:


11
myparameter=foobar
ssh user@server "myscript $myparameter"

これはmyscript foobarサーバー上で実行されます。


そのような単純な!よく働く。(スクリプト名の前に "./"を付けなければなりませんでした~/.elm/aliases。それ以外の場合は。が検索されたためです。)
Emanuel Berg

6
小さな警告として、ここでは"単一引用符()ではなく二重引用符()を使用すること'が重要です。doubleを使用すると、ローカルマシンのシェルが変数を展開し、sshコマンドを実行します。単一のものを使用する場合、ローカルシェルはコマンドに影響を与えません。コマンドは逐語的に送信されますが、リモートシェルで引き続き展開されます。
Tilo Wiklund、2012

3
$myparameterスペースが含まれている場合、サーバー側で分割されることに注意してください。Bashにprintfは、%q使用できる形式があります。いくつかのサンプルコードがありますが、ここには収まりません。そのための新しい答えを作成します。
janmoesen 2012

7

(これは、受け入れられた回答に関する私のコメントのフォローアップです。)

$myparameterスペースが含まれている場合、サーバー側で分割されることに注意してください。Bashのprintfには、%q使用できる形式があります。例:

$ myparameter='hello; rm somefile'
$ ssh user@server "echo $myparameter"
hello
rm: cannot remove `somefile': No such file or directory

$ ssh user@server "echo $(printf '%q' "$myparameter")"
hello; rm somefile

1

それはそれは仮定しても安全である場合$myparameterになるではない(それ以外の参照単一引用符が含まれ、ここか、使用printf '%q' ...janmoesenによって溶液)を、あなただけの周りの単一引用符を置くことができ$myparameter、サーバー側のスプリット・オン・スペースの問題を避けるために。

myparameter="foo \" bar"
#myparameter="foo \" ' bar"

ssh localhost "set -xv; printf '%s\n' myscript '${myparameter}'"
ssh localhost "set -xv; echo $(set -xv; printf '%q' "$myparameter")"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.