如何通过 ssh 连接传递数组。
我有一个这样形成的数组:
declare -a target_array=(
"item1 -p12345 -r"
"item2 -p65677 -e"
)
然后我需要将其传递到 ssh 连接,如下所示:
ssh $server target_array=${target_array[@]}" "bash -s" <<TARGETSCRIPT
echo "hello"
TARGETSCRIPT
但这只是给了我错误:
bash: -p12345: command not found
做这个的最好方式是什么?我尝试过有和没有{}
,有和没有[@]
,但似乎没有任何效果。
(注意,这echo hello
只是使用 target_array 的 800 行脚本的占位符)。
答案1
remote_code=$(cat << 'EOF'
echo Hello
for i in "${!target_array[@]}"; do
echo "$i -> ${target_array[i]}"
done
EOF
)
ssh server bash << EOF
$(declare -p target_array)
$remote_code
EOF
远程 shell 将在 stdin 上看到类似以下内容:
declare -a target_array='([0]="item1 -p12345 -r" [1]="item2 -p65677 -e")'
echo Hello
for i in "${!target_array[@]}"; do
echo "$i -> ${target_array[i]}"
done
为了避免破坏远程 shell 的标准输入,并假设您的 ssh 和远程 sshd 允许传递LC_*
环境变量,您还可以执行以下操作:
LC_CODE="$(declare -p target_array)
$remote_code" ssh server 'bash -c '\''eval "$LC_CODE"'\'
如果你知道远程用户的登录 shell 是bash
,你可以简单地执行以下操作:
ssh server "$(declare -p target_array)
$remote_code"
答案2
您不能将数组作为第一个参数放在ssh
主机后面。它将被评估为命令并且显然失败了。如果你确实需要这样做,你应该将其添加到“脚本”中,如下所示:
ssh $server "bash -s" <<TARGETSCRIPT
target_array=("${target_array[@]}")
echo ${target_array[@]}
echo "hello"
TARGETSCRIPT
正确封装阵列对于确保阵列在另一端保持不变也很有用。