linux - 将数组传递给 SSH 连接

标签 linux bash ssh debian

我想将数组传递给远程计算机上的脚本。我为此使用 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 321 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/

相关文章:

java - Java应用程序中的线程处理

linux - 如何使用 bash 脚本从 base64 转换后的文件中播放声音?

linux - 构建 Qemu - 未知目标名称 'arm-softmmu'

bash - 无法使用 ansible 获取 ~/.bashrc 文件

node.js - 在共享托管计划上安装 NodeJS 的问题

ssh - vagrant ssh 没有按预期工作,它不符合我的自定义设置

git - 使用ssh克隆git仓库时出错

linux - 在 pydev eclipse (Debian) 中配置 kivy 路径

linux - 如何在每个 Bash 命令的开头添加一些内容?

python - 比较 bash 中 Python 版本检查的 python -V 输出