将数组传递给 SSH 连接

将数组传递给 SSH 连接

如何通过 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

正确封装阵列对于确保阵列在另一端保持不变也很有用。

相关内容