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
배열을 올바르게 포장하는 것은 배열이 다른 쪽에서도 변경되지 않은 상태로 유지되도록 하는 데에도 유용합니다.