![여러 SSH를 통해 원격 컴퓨터의 매개 변수에 공백이 있는 로컬 스크립트를 실행하는 방법은 무엇입니까?](https://linux55.com/image/169335/%EC%97%AC%EB%9F%AC%20SSH%EB%A5%BC%20%ED%86%B5%ED%95%B4%20%EC%9B%90%EA%B2%A9%20%EC%BB%B4%ED%93%A8%ED%84%B0%EC%9D%98%20%EB%A7%A4%EA%B0%9C%20%EB%B3%80%EC%88%98%EC%97%90%20%EA%B3%B5%EB%B0%B1%EC%9D%B4%20%EC%9E%88%EB%8A%94%20%EB%A1%9C%EC%BB%AC%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC%20%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
내 문제와 비슷해요여기, 여러 SSH를 제외하고 다음과 유사합니다.이 문제그런데 매개변수에 공백이 있네요...
test.sh
여러 SSH를 통해 원격 서버에서 로컬 스크립트를 실행 하고 싶습니다 . test.sh
종종 두 개 이상의 단어로 구성된 주장을 받아들입니다.
테스트.sh:
#!/bin/bash
while getopts b: opt;
do
case $opt in
b)
bval="$OPTARG"
;;
esac
done
echo $bval
calltest.sh
#!/bin/bash
# Do some stuff
PHRASE="multi word arg"
ssh -A user@host1 "bash -s" -- < ./test.sh -b "${PHRASE@Q}"
실행하면 ./call_test.sh
올바르게 출력됩니다.
multi word arg
call_test.sh
그러나 마지막 줄을 다음과 같이 변경하면 :
ssh -A user@host1 ssh -A user@host2 "bash -s" -- < ./test.sh -b "${PHRASE@Q}"
실행하면 ./call_test.sh
다음이 출력됩니다.
multi
기본적으로 단일 SSH에서 다중 SSH로 변경하면 여러 단어로 된 주장이 깨졌습니다.
여러 ssh 명령이 모든 단계에서 여러 단어 인수를 인용 해제하고 있다고 생각하지만 이를 방지하는 방법을 잘 모르겠습니다. 여러 SSH에서 실행되는 스크립트에 여러 단어 인수를 성공적으로 전달하는 방법에 대한 아이디어가 있습니까?
편집하다:
나는 믿는다이 답변발생한 문제를 해결했습니다.
답변1
2개의 ssh 명령을 통해 전달하는 경우 문자열을 따옴표로 두 번 이스케이프해야 합니다. 추가 숙제를 통해 PHRASE=${PHRASE@Q}
이를 수행하세요 .
그러나 ${var@Q}
및 (아래 설명) 모두 따옴표로 처리된 형식을 printf %q
사용하며 이는 원격 셸에서 지원되지 않을 수 있습니다.$'...'
.
test.sh
스크립트의 마지막 줄을 echo "$bval"
다음과 같이 수정합니다 echo $bval
.
PHRASE="multi word arg"
PHRASE=${PHRASE@Q}
ssh -A user@host1 ssh -A user@host2 "bash -s" -- < ./test.sh -b "${PHRASE@Q}"
multi word arg
${var@P}
다음을 사용하는 대신 이전 버전의 bash가 지원하지 않는 확장 형식을 사용할 수 있습니다.printf -v var %q
:
PHRASE="multi word arg"
printf -v PHRASE %q "$PHRASE"
printf -v PHRASE %q "$PHRASE"
ssh -A user@host1 ssh -A user@host2 "bash -s" -- < ./test.sh -b "$PHRASE"
또는 stdin을 통해 스크립트를 공급하는 대신 전체 스크립트와 해당 인수를 변수에 넣을 수 있습니다. 이는 비효율적입니다(stdin에서 스크립트를 읽을 때 bash는 모든 바이트 전송에 대해 읽기 시스템을 수행합니다).
printf -v cmd 'bash -c %q bash -b %q' "$(cat test.sh)" 'multi word wahterve'
printf -v cmd %q "$cmd"
ssh localhost ssh localhost "$cmd"
multi word wahterve