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

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

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

1) 您位于 A。 2) 您通过 ssh 进入 B。 3) 您在 B 运行一个脚本,该脚本需要 A 处已知的参数。

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

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

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

答案1

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

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

答案2

(这是后续我对已接受答案的评论.)

请注意,如果$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

答案3

如果可以安全地假设$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")"

答案4

我犹豫是否要回答一个 10 岁的问题,尤其是当已经有了一个完美的答案时,但请注意,“远程”脚本实际上并不需要根本就在B上。这 (a) 使参数替换变得微不足道,并且 (b) 消除了将脚本放在远程系统上是否是个好主意的复杂性(安全问题/其他问题)。

另一种方法是运行 ssh这里是文档输入。在这种情况下,参数替换完成本地,而不是在远程系统上(只要您不引用文档分隔符,在本例中为EOF):

portnum=1234
[email protected]
mydir=/var/www/bar
param=foo

ssh -p$portnum $target /bin/bash <<EOF
  set -e;
  cd $mydir;
  # create remote 3-character file '/var/www/bar/myfile' containing 'foo'
  echo -n $param > myfile
EOF

相关内容