是否有可能使用远程SSH命令变量?(is it possible to use variables

2019-07-21 02:17发布

我想在序列中的远程计算机上执行多个命令,一些后来的命令依赖于早期的。 在最简单的可能的例子,我得到这样的:

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调用已里面一个脚本文件,它会是不错的一切融合在一起。

Answer 1:

在这个例子中

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"

当地壳试图扩大$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 。 该字符串被捕获并存储在一个变量本地主机上。



Answer 2:

从chepner一些灵感,我现在有一个可行的解决方案,但只能从bash shell中或bash脚本调用时。 它不会从tcsh的工作。

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

在此基础上,下面的代码是一个运行的JabRef在远程服务器上(虽然X-转发默认和密码认证用户无法分辨出它是远程)本地脚本:

#!/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`;

我又看了看here文档,通过启发如何使用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


文章来源: is it possible to use variables in remote ssh command?