相关疑难解决方法(0)

是否可以在远程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
Run Code Online (Sandbox Code Playgroud)

有关背景信息,我实际想要做的是拼凑一个路径并启动一个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.
Run Code Online (Sandbox Code Playgroud)

这样,每当jabref更新到服务器上的新版本时,我就不必手动更新jar文件的路径.jabref可执行文件不接受参数,而是使用do启动它java -jar,这就是为什么我必须稍微改变路径.

目前,我在单独的脚本文件中有命令列表并调用

ssh my_server 'nohup sh -c "( ( my_script.sh &/dev/null ) & )"' &
Run Code Online (Sandbox Code Playgroud)

这是有效的,但由于ssh调用已经在一个脚本文件中,所以将所有内容放在一起会很不错.

ssh shell variable-assignment nohup

8
推荐指数
2
解决办法
3万
查看次数

使用ssh通过SSH调用subshel​​l $()来执行bash命令

我尝试通过ssh发送命令,如下所示:

ssh user@192.168.1.1 "echo $(uname -a)"
Run Code Online (Sandbox Code Playgroud)

但是我的问题是,该$(uname -a)部分实际上创建了一个子外壳,并且不在192.168.1.1服务器上执行,而是在从中执行此命令的系统上执行。

我该如何解决?

PS我的实际示例涉及docker stop all命令,看起来像

docker stop $(docker ps -q)
Run Code Online (Sandbox Code Playgroud)

但我简化了问题。

更新:对不起,我简化了我的问题。我的命令使用Here Document(因为命令内部很复杂,并且使用了许多不同的引号)

ssh user@192.168.1.1 <<SSHCOMMAND
  echo $(uname -a)
SSHCOMMAND
Run Code Online (Sandbox Code Playgroud)

因此,Ignacio Vazquez-Abrams解决方案将不起作用

ssh bash heredoc subshell

2
推荐指数
2
解决办法
2230
查看次数

标签 统计

ssh ×2

bash ×1

heredoc ×1

nohup ×1

shell ×1

subshell ×1

variable-assignment ×1