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
リモートシェルは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
配列を正しくパッケージ化することは、配列が他方の側でも変わらないままになるようにするのにも役立ちます。