is it possible to use variables in remote ssh command? is it possible to use variables in remote ssh command? shell shell

is it possible to use variables in remote ssh command?


In this example

ssh my_server "echo this is my_server; abc=2;"

abc is set on the remote side, so it should be clear why it is not set on your local machine.

In the next example,

ssh my_server "echo this is my_server; abc=2; echo abc is $abc"

your local shell tries to expand $abc in the argument before it is ever sent to the remote host. A slight modification would work as you expected:

ssh my_server 'echo this is my_server; abc=2; echo abc is $abc'

The single quotes prevent your local shell from trying to expand $abc, and so the literal text makes it to the remote host.


To finally address your real question, try this:

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' )

This will run the quoted string as a command on your remote server, and output exactly one string: $jabref_dir. That string is captured and stored in a variable on your local host.


With some inspiration from chepner, I now have a solution that works, but only when called from a bash shell or bash script. It doesn't work from tcsh.

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

Based on this, the code below is a local script which runs jabref on a remote server (although with X-forwarding by default and passwordless authentication the user can't tell it's remote):

#!/bin/bashif [ -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 argumentfi

and this is the 1-line script load_module, since modulecmd sets environment variables and I couldn't figure out how to do that without sourcing a script.

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

I also looked at heredocs, inspired by How to use SSH to run a shell script on a remote machine? and http://tldp.org/LDP/abs/html/here-docs.html. The nice part is that it works even from tcsh. I got this working from the command line, but not inside a script. That's probably easy enough to fix, but I've got a solution now so I'm happy :-)

ssh my_server 'bash -s' << EOFecho this is \$HOSTNAME; abc=2; echo abc is \$abc;EOF