따옴표가 포함된 변수에 구문 오류가 있습니다.

따옴표가 포함된 변수에 구문 오류가 있습니다.

2개의 게이트웨이 뒤에는 여러 대의 Linux 머신이 있습니다. 내가 만든 설정에 연결하려면

ssh -o ProxyCommand="ssh gateway1 nc %h %p" machines_behind_1
ssh -o ProxyCommand="ssh gateway2 nc --proxy %h %p --proxy-type socks4" machines_behind_2

이 프로세스를 단순화하기 위해 에이전트 명령을 보관하고 간단히 사용할 수 있는 환경 변수를 생성해야 한다고 생각했습니다. 그래서 내가 그랬어

export PGWA='-o ProxyCommand="ssh gateway1 nc %h %p"'
export PGWB='-o ProxyCommand="ssh gateway2 nc --proxy %h %p --proxy-type socks4"'

그런 다음 연결하려는 컴퓨터에 따라 다음을 수행합니다.

ssh $PGWA machine_behind_1
ssh $PGWB machine_behind_2 

하지만 이런 오류가 발생합니다.

/bin/bash: -c: line 0: unexpected EOF while looking for matching `"'
/bin/bash: -c: line 1: syntax error: unexpected end of file

이유를 아시나요?

호스트 이름을 미리 모르기 때문에 ssh_config 트릭을 사용할 수 없습니다. Gateway1 뒤에 새 가상 머신을 생성할 수 있으며 첫 번째 에이전트 명령을 사용해야 합니다.

내가 생각할 수 있는 유일한 것은 새로운 별칭, 함수 또는 쉘 스크립트를 만들고 기본적으로 ssh -o foo $@이것을 대신 사용하는 것입니다. 그러나 scp에 대한 별칭/셸 스크립트 또는 함수를 생성하는 것도 기억해야 하는데, 이 역시 많이 사용합니다. 차라리 자동으로 할 수 있으면 좋겠어요.

나는 유사한 작업을 수행 ssh gw1-host하고 구성 파일에서 작업을 수행하여 ssh -o foo host첫 번째 게이트웨이를 통해 변환할 수 있기를 바랐지만 이 정규식 조작은 ssh_config에서 허용되지 않습니다.

별도의 ssh/scp 별칭/스크립트/함수 없이 내가 원하는 것을 달성할 수 있는 방법이 있나요?

편집: 환경 변수를 여기 스택 교환에 복사하여 붙여넣었을 때 인용문에 실수가 있었습니다.

답변1

따옴표 없이 쓰면 $PGWA값이 공백으로 분할됩니다. 따옴표 문자에는 특별한 의미 가 PGWA없으므로 단어 -o, ProxyCommand="ssh, gateway1, nc및 로 끝납니다 .%h%p"

바라보다공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?더 많은 설명을 원하시면.

큰따옴표 밖의 변수 확장은 거의 항상 오류입니다. 큰따옴표를 제거해야 하는 이유를 알지 못하는 한 이는 항상 실수입니다.

당신이 해야 할 일은 SSH 명령에 두 개의 매개변수인 -o및 를 전달하는 것입니다 ProxyCommand=ssh gateway2 nc --proxy %h %p --proxy-type socks4.

PGWAzsh에서는 배열로 설정할 수 있습니다 .

PGWA=(-o 'ProxyCommand=ssh gateway2 nc --proxy %h %p --proxy-type socks4')
ssh $PGWA …

bash 및 ksh와 같은 다른 셸에서는 따옴표가 없는 변수 확장이 분할된다는 설계 결함과 명시적인 배열 구문으로 인해 더 많은 입력이 필요합니다.

PGWA=(-o 'ProxyCommand=ssh gateway2 nc --proxy %h %p --proxy-type socks4')
ssh "${PGWA[@]}" …

sh와 유사한 쉘에서 작동하고 많은 입력이 필요하지 않은 한 가지 방법은 함수를 정의하는 것입니다.

pgwa () {
  typeset c="$1"; shift
  "$c" -o 'ProxyCommand=ssh gateway2 nc --proxy %h %p --proxy-type socks4' "$@"
}
pgwa ssh …

하지만 내 생각에 가장 좋은 해결책은 이러한 정의를 모두 .ssh/config해당 위치에 두는 것입니다. 이렇게 하면 쉘 기술이 필요하지 않으며 구성은 다른 프로그램(rsync, sshfs, GUI 파일 전송 프로그램 등)에서 작동합니다. Gateway1 뒤에 새 VM을 추가하는 경우 항목을 추가하거나 다음 .ssh/config을 사용하세요.ssh -o HostName=new-vm something-behind-gateway1 …

게다가 여기서는 중요하지 않은 다른 것들도 있습니다.

관련 정보