我怎样才能自动化这个任务?
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