【问题标题】:Pass arrays to SSH connections将数组传递给 SSH 连接
【发布时间】:2020-01-20 02:11:32
【问题描述】:

我想将数组传递给远程计算机上的脚本。我为此使用SSH。我尝试了以下代码,但我收到一条错误消息,提示该参数不可用。

ssh -i location/to/keyfile -o StrictHostKeyChecking=no -T ubuntu@18.220.20.50 ./script.sh -m 1G -s 0 -d 120 -w 60 -j 512M -k 512M -l 515M -b "${array_1[*]}"  -u "${array_2[*]}"

这里${array_1} 和${array_2} 是索引数组。

【问题讨论】:

  • 您的问题也有类似的讨论。请看这个answer
  • 我认为您遇到了麻烦,因为命令由本地 shell 解析(并应用和删除引号),然后发送到远程计算机再次进行解析。但要提出解决方案,我需要了解更多:数组的内容是什么(即它们是否包含可能使解析复杂化的空格和/或标点符号),以及它们应该如何传递给脚本(看起来您正在尝试将所有混合在一起的值作为单个脚本参数传递,对吗?)。
  • @GordonDavisson 我在两个数组中都有几个数值。如果我转到远程计算机然后运行相同的命令,它就可以正常工作。是的,我正在尝试将所有值作为单个参数传递。
  • @jww 我认为这不是很接近 - 另一个问题与获取包含换行符的字符串有关,远程shell将其视为单词序列,但这个问题是关于让远程 shell 将数组的条目视为单个字符串。

标签: linux bash ssh debian


【解决方案1】:

另一种解决方案与the question nominated by @jww中的答案略有不同
想法是将数组定义作为文本传递;
而不是通过标准输入设备评估它们
下面的示例代码片
您需要将 echo 部分替换为您自己的数组定义脚本,
并将source /dev/stdin 放入 script.sh

echo 'array_1[id]=3.14'|ssh  ubuntu@18.220.20.50 'source /dev/stdin; echo ${array_1[id]}'

【讨论】:

    【解决方案2】:

    如果我对情况的理解正确,您有两个包含数字的数组,例如:

    array_1=(1 2 3)
    array_2=(21 22 23)
    

    ...并希望将这些数字列表作为空格分隔的列表传递给脚本,例如在远程计算机上运行:

    ./script.sh -m 1G -s 0 -d 120 -w 60 -j 512M -k 512M -l 515M -b "1 2 3"  -u "21 22 23"
    

    如果正确,请尝试以下命令:

    ssh -i location/to/keyfile -o StrictHostKeyChecking=no -T ubuntu@18.220.20.50 ./script.sh -m 1G -s 0 -d 120 -w 60 -j 512M -k 512M -l 515M -b "'${array_1[*]}'"  -u "'${array_2[*]}'"
    

    解释:通过 ssh 传递的命令被解析两次;首先由本地外壳程序,然后由远程外壳程序再次解析结果。在每个解析阶段,引号(和转义)被应用和删除。您的原始命令只有一层引号,因此本地 shell 会解析、应用和删除它,因此远程 shell 看不到任何引号,因此它将每个数字视为一个单独的东西。

    更详细:原始命令:

    ssh -i location/to/keyfile -o StrictHostKeyChecking=no -T ubuntu@18.220.20.50 ./script.sh -m 1G -s 0 -d 120 -w 60 -j 512M -k 512M -l 515M -b "${array_1[*]}"  -u "${array_2[*]}"
    

    扩展了数组引用,相当于(假设我上面列出的数组内容):

    ssh -i location/to/keyfile -o StrictHostKeyChecking=no -T ubuntu@18.220.20.50 ./script.sh -m 1G -s 0 -d 120 -w 60 -j 512M -k 512M -l 515M -b "1 2 3"  -u "21 22 23"
    

    本地 shell 解析并删除引号,但它们具有将 1 2 3 和 21 22 23 作为单个参数传递给 ssh 程序的效果。但随后ssh 只是将返回的命令参数列表粘贴在一起,中间有空格,所以这就是它发送到远程 shell 的内容:

    ./script.sh -m 1G -s 0 -d 120 -w 60 -j 512M -k 512M -l 515M -b 1 2 3  -u 21 22 23
    

    ...混淆了脚本。

    我的解决方案,在数组引用周围添加单引号,不会改变本地解析(单引号在双引号内,所以它们没有特殊效果);他们只是通过,导致这个命令被发送到远程shell:

    ./script.sh -m 1G -s 0 -d 120 -w 60 -j 512M -k 512M -l 515M -b '1 2 3'  -u '21 22 23'
    

    这里的单引号与双引号具有相同的效果(因为其中没有其他引号、转义符、美元符号或其他特殊字符),所以这应该会给出您想要的结果。

    【讨论】:

    • 非常感谢。当我尝试时,我发现了另一种方法。即使用引号,包括脚本和参数。所以代码如下所示。 ssh -i location/to/keyfile -o StrictHostKeyChecking=no -T ubuntu@18.220.20.50 "./script.sh -m 1G -s 0 -d 120 -w 60 -j 512M -k 512M -l 515M -b ' ${array_1[]}' -u '${array_2[]}' "
    猜你喜欢
    • 1970-01-01
    • 2019-07-04
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 2016-05-03
    • 2015-01-11
    相关资源
    最近更新 更多