我想在远程计算机上按顺序执行多个命令,并且后面的一些命令依赖于前面的命令。在最简单的例子中,我得到了这个:
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
对于一些背景信息,我实际上想做的是拼凑一条路径并启动一个 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.
这样,每当 jabref 在服务器上更新到新版本时,我就不必手动更新 jar 文件的路径。 jabref 可执行文件不接受参数,但使用以下命令启动它java -jar
确实如此,这就是为什么我必须稍微调整一下路径。
目前我有一个单独的脚本文件中的命令列表并调用
ssh my_server 'nohup sh -c "( ( my_script.sh &/dev/null ) & )"' &
这是可行的,但由于 ssh 调用已经在一个脚本文件中,因此将所有内容放在一起会很好。
在这个例子中
ssh my_server "echo this is my_server; abc=2;"
abc
是在远程端设置的,所以应该清楚为什么在本地机器上没有设置。
在下一个示例中,
ssh my_server "echo this is my_server; abc=2; echo abc is $abc"
你的本地 shell 尝试扩展$abc
在将其发送到远程主机之前的参数中。稍微修改一下就会如您所期望的那样工作:
ssh my_server 'echo this is my_server; abc=2; echo abc is $abc'
单引号会阻止本地 shell 尝试扩展$abc
,因此文字文本会到达远程主机。
要最终解决您真正的问题,请尝试以下操作:
jabref_dir=$( ssh my_server 'jabref_exe=$(which jabref); jabref_dir=$(dirname $jabref_exe);
java -jar $jabref_dir/../jabref.jar > /dev/null; echo $jabref_dir' )
这将在远程服务器上将带引号的字符串作为命令运行,并准确输出一个字符串:$jabref_dir
。该字符串被捕获并存储在本地主机上的变量中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)