我想将数组传递给远程计算机上的脚本。我为此使用 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}
是索引数组。
最佳答案
如果我对情况的理解正确的话,你有两个包含数字的数组,例如:
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 再次解析结果。在每个解析阶段,引号(和转义符)都会被应用和删除。您的原始命令只有一层引号,因此本地 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'
这里的单引号与双引号具有相同的效果(因为其中没有其他引号、转义符、美元符号或其他特殊字符),因此这应该会给出您想要的结果。
关于linux - 将数组传递给 SSH 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58004291/