远程执行的复杂bash命令中的变量值

时间:2019-05-29 11:58:35

标签: bash ssh

我想在远程主机上运行复杂的命令列表。通过使用此类命令创建另一个脚本,然后调用我的其他脚本(有或没有将其复制到远程主机),我都可以轻松解决,但是我不想这样做。我的问题是我有一些对于整个脚本固定的变量,然后有for循环变量。我可以在远程主机上对两者之一进行正确评估,但是两者都不可以。我在类似问题上发现的所有内容都是关于在不同元素之间使用引号引起来的讨论。我没有尝试过固定(在ssh之前扩展)和循环变量(在扩展上) (对您来说,@ Inian是个亮点,因为您不能他妈的在阅读完整问题之前将其标记为重复的内容而不是重复的内容)。

fixed_value="blue"

ssh remote_host << "EOF"
    value_list="VALUE1 VALUE2"
    for i in $value_list; do
        echo "executing $i"
        my_program -arg1 $i -arg2 "$fixed_value"
    done
EOF

我期望的是运行带有两个参数的my_program(远程主机上的二进制文件),一个是固定的,实际上是作为输入传递给本地脚本的,另一个是从固定值列表中读取的,因此,在该示例中,我应该最终在远程主机上执行以下操作:

my_program -arg1 VALUE1 -arg2 blue
my_program -arg1 VALUE2 -arg2 blue

我可能需要一种将值“传递”到远程主机中正在执行的脚本的方法,或者在发送命令之前强制对$ fixed_value进行求值(我尝试使用引号来执行此操作,但此方法不起作用),而不会阻止在远程主机上对$ i进行评估。因为我通过切换引号(或删除引号或更改引号)而得到的只是:

my_program -arg1 -arg2 blue
my_program -arg1 -arg2 blue

my_program -arg1 VALUE1 -arg2
my_program -arg1 VALUE2 -arg2

2 个答案:

答案 0 :(得分:1)

重组:

fixed_value="blue"
value_list=( VALUE1 VALUE2 )
for i in "${value_list[@]}"; do
    echo "executing $i"
    ssh remote_host "my_program -arg1 $i -arg2 $fixed_value"
done

如果您真的希望一次调用即可完成所有操作,则将其编写为脚本,scp结束,然后ssh在目标计算机上调用。

...或将其本地写入临时文件:

$: cat a
echo '
fixed_value="blue"
value_list=( VALUE1 VALUE2 )
for i in "${value_list[@]}"; do
    echo "executing $i"
    echo "my_program -arg1 $i -arg2 $fixed_value"
done
'>/tmp/foo && . /tmp/foo && rm /tmp/foo

然后以

运行
ssh remote_host < a

产生:

Pseudo-terminal will not be allocated because stdin is not a terminal.
executing VALUE1
my_program -arg1 VALUE1 -arg2 blue
executing VALUE2
my_program -arg1 VALUE2 -arg2 blue

答案 1 :(得分:1)

#!/bin/bash

fixed_value="blue"
qq='"'

ssh remote_host bash -c "
  value_list='VALUE1 VALUE2'
  for i in \$value_list; do
    echo ${qq}executing \$i$qq
    my_program -arg1 \$i -arg2 '$fixed_value'
  done
"

我已将该命令包装在bash -c "…"命令中。因为您仍然需要一些双引号,并且因为我不信任转义的引号,所以我创建了一个$qq变量来表示双引号字符。从服务器端传递的变量($qq$fixed_value)是未转义的,因此它们的值将传递到服务器。服务器端评估变量($value_list$i)被转义,因此它们由远程bash调用解释。

此客户端脚本的退出代码将是ssh的退出代码,该退出代码应由my_program的最终迭代中的退出代码决定(除非ssh本身失败或终止)。