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


8

如何自动执行此任务?

1)您在A。2)在ssh中进入B。3)在B处运行脚本,该脚本需要A处已知的参数。

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

另一个想法,也许是完全不使用ssh-我在B处有一个网页,那么该脚本是否可以通过“幕后” Web界面调用?

还是您会以完全不同的方式来做?


Answers:


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

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


就那么简单!效果很好。(我必须在脚本名称前加上“ ./”,否则会查找~/.elm/aliases。)
Emanuel Berg 2012年

6
作为一个小警告,在这里使用双引号(")而不是单引号(')很重要。使用double意味着本地计算机上的shell将扩展变量,然后执行ssh命令。如果要使用单个命令,则本地shell不会触摸该命令,该命令是逐字发送的,但仍会在远程shell中进行扩展。
蒂洛·维克伦德

3
请注意,如果$myparameter包含空格,它将在服务器端拆分。bash的printf有一个%q格式,你可以使用。我有一些示例代码,但是这里不适合。我将为此创建一个新答案。
janmoesen

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")"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.