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 hellotarget_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

リモートシェルは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

リモートシェルの標準入力が中断されるのを防ぎ、sshとリモートsshdがLC_*環境変数を渡すことを許可すると仮定するには、次のこともできます。

LC_CODE="$(declare -p target_array)
$remote_code" ssh server 'bash -c '\''eval "$LC_CODE"'\'

リモートユーザーのログインシェルがわかっている場合は、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

配列を正しくパッケージ化することは、配列が他方の側でも変わらないままになるようにするのにも役立ちます。

関連情報