使用本地参数值执行远程脚本

Ema*_*erg 8 scripting ssh scp web

我怎样才能自动化这个任务?

1) 你在 A. 2) 你 ssh 进入 B。 3) 你在 B 运行一个脚本,它需要一个在 A 已知的参数。

首先,我想也许我可以在打开与 ssh 的连接时发送该值。然后,可能更简单,在 1) 和 2) 之间,将整个脚本 scp 到 B 处的相同位置(替换旧的)。但是,我如何在 B 处执行脚本?(也就是如何自动化最后一步。当然,我可以在ssh之后手动运行它。)

另一个想法,也许完全放弃 ssh - 我在 B 有一个网页,那么脚本是否可以通过“幕后”网络界面以某种方式调用?

或者你会以完全不同的方式来做吗?

Mic*_*ton 12

myparameter=foobar
ssh user@server "myscript $myparameter"
Run Code Online (Sandbox Code Playgroud)

这将myscript foobar在服务器上执行。

  • 作为一个小警告,在这里使用双引号 (`"`) 而不是单引号 (`'`) 很重要。使用 double 意味着本地机器上的 shell 将扩展变量,然后执行 `ssh ` 命令。如果使用单个命令,本地 shell 将不会触及该命令,该命令是逐字发送的,但仍会在远程 shell 中扩展。 (7认同)
  • 请注意,如果 `$myparameter` 包含空格,它将在服务器端拆分。Bash 的 `printf` 有一个你可以使用的 `%q` 格式。我有一些示例代码,但它不适合这里。我会为它创建一个新的答案。 (3认同)

jan*_*sen 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
Run Code Online (Sandbox Code Playgroud)