是否有可能在远程SSH命令中使用变量?

我想在远程机器上按顺序执行几个命令,而后面的一些命令依赖于以前的命令。 在最简单的例子中,我得到了这个:

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 。 该字符串被捕获并存储在本地主机上的变量中。


有了chepner的启发,我现在有了一个可行的解决方案,但只有在从bash shell或bash脚本调用时才有效。 它不适用于tcsh。

ssh my_server "bash -c 'echo this is $HOSTNAME; abc=2; echo abc is $abc;'"

基于此,下面的代码是一个本地脚本,它在远程服务器上运行jabref(尽管默认情况下为X-forwarding,无密码身份验证,用户无法告诉它是远程的):

#!/bin/bash
if [ -f "$1" ]
then
    fname_start=$(echo ${1:0:4})
    if [ "$fname_start" = "/tmp" ]
    then
        scp $1 my_server:$1
        ssh my_server "bash -c 'source load_module jdk; source load_module jabref; java_exe=$(which java); jabref_exe=$(which jabref); jabref_dir=$(echo ${jabref_exe%/bin/jabref});eval $(java -jar $jabref_dir/jabref.jar $1)'" &
    else
        echo input argument must be a file in /tmp.
else
    echo this function requires 1 argument
fi

这是1行脚本load_module,因为modulecmd设置了环境变量,我无法弄清楚如何在没有脚本的情况下做到这一点。

eval `/path/to/modulecmd bash load $1`;

我还看了heredocs,受到如何使用SSH在远程计算机上运行shell脚本的启发? 和http://tldp.org/LDP/abs/html/here-docs.html。 好的部分是它甚至可以从tcsh起作用。 我从命令行得到了这个工作,但不是在脚本中。 这可能很容易解决,但我现在有一个解决方案,所以我很高兴:-)

ssh my_server 'bash -s' << EOF
echo this is $HOSTNAME; abc=2; echo abc is $abc;
EOF
链接地址: http://www.djcxy.com/p/97161.html

上一篇: is it possible to use variables in remote ssh command?

下一篇: Execute Bash script stored in a file over SSH