Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.2k views
in Technique[技术] by (71.8m points)

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

I'd like to execute several commands in sequence on a remote machine, and some of the later commands depend on earlier ones. In the simplest possible example I get this:

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

For a bit of background info, what I actually want to do is piece together a path and launch a java application:

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.

That way, whenever jabref gets updated to a new version on the server, I won't have to manually update the path to the jar file. The jabref executable doesn't take arguments, but launching it with java -jar does, which is why I have to juggle the path a bit.

At the moment I have the list of commands in a separate script file and call

ssh my_server 'nohup sh -c "( ( my_script.sh &/dev/null ) & )"' &

which works, but since the ssh call is already inside one script file it would be nice to have everything together.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...