我想在远程机器上按顺序执行几个命令,后面的一些命令依赖于之前的命令.在最简单的例子中,我得到了这个:
ssh my_server "echo this is my_server; abc=2;"
this is my_server
abc=2: Command not found.
ssh my_server "echo this is my_server; abc=2; echo abc is $abc"
abc: undefined variable
Run Code Online (Sandbox Code Playgroud)
有关背景信息,我实际想要做的是拼凑一个路径并启动一个java应用程序:
ssh my_server 'nohup sh -c "( ( echo this is my_server; jabref_exe=`which jabref`; jabref_dir=`dirname $jabref_exe`; java -jar $jabref_dir/../jabref.jar` $1 &/dev/null ) & )"' &
jabref_dir: Undefined variable.
Run Code Online (Sandbox Code Playgroud)
这样,每当jabref更新到服务器上的新版本时,我就不必手动更新jar文件的路径.jabref可执行文件不接受参数,而是使用do启动它java -jar,这就是为什么我必须稍微改变路径.
目前,我在单独的脚本文件中有命令列表并调用
ssh my_server 'nohup sh -c "( ( my_script.sh &/dev/null ) & )"' &
Run Code Online (Sandbox Code Playgroud)
这是有效的,但由于ssh调用已经在一个脚本文件中,所以将所有内容放在一起会很不错.
我尝试通过ssh发送命令,如下所示:
ssh user@192.168.1.1 "echo $(uname -a)"
Run Code Online (Sandbox Code Playgroud)
但是我的问题是,该$(uname -a)部分实际上创建了一个子外壳,并且不在192.168.1.1服务器上执行,而是在从中执行此命令的系统上执行。
我该如何解决?
PS我的实际示例涉及docker stop all命令,看起来像
docker stop $(docker ps -q)
Run Code Online (Sandbox Code Playgroud)
但我简化了问题。
更新:对不起,我简化了我的问题。我的命令使用Here Document(因为命令内部很复杂,并且使用了许多不同的引号)
ssh user@192.168.1.1 <<SSHCOMMAND
echo $(uname -a)
SSHCOMMAND
Run Code Online (Sandbox Code Playgroud)
因此,Ignacio Vazquez-Abrams解决方案将不起作用