$가 반환되는 이유는 무엇입니까? 이 스크립트 내에서 실행할 때 차이가 있습니까? [복사]

$가 반환되는 이유는 무엇입니까? 이 스크립트 내에서 실행할 때 차이가 있습니까? [복사]

내 스크립트에는 다음이 있습니다.

connectionTest=$(sshpass -p "${pass}" ssh -q -o ConnectTimeout=5 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no "${remoteUser}"@"${IP}" "echo quit | netcat -w 5 local.server.local ${telnetPort}; echo $?")

명령을 받아 컴퓨터에서 수동으로 실행하면 예상한 종료 코드가 표시됩니다. 그러나 스크립트가 실행될 때마다 생성되는 종료 코드는 다음과 같습니다.언제나0.

종료 코드가 항상 0을 반환하는 이유는 무엇입니까?

답변1

예상치 못한 반환 상태를 받는 이유는 원격 호스트에 대한 명령을 인용한 방식 때문입니다.

다음 두 가지 진술을 고려하고 대조하십시오.

a=apple; ssh remotehost "a=banana; echo $a"
a=apple; ssh remotehost 'a=banana; echo $a'

첫 번째 경우에는 "... $a"평가앞으로명령을 실행하면 ssh다음과 같은 유효한 상황이 발생합니다.

ssh remotehost "a=banana; echo apple"

두 번째 경우에는 '... $a'합격문자 그대로의 의미로실행을 위해 원격 호스트에 연결하면 다음과 같은 유효한 상황이 발생합니다.

ssh remotehost 'a=banana; echo $a'

이것은 정확히 귀하의 것입니다 $?. 큰따옴표로 묶었으므로 명령을 실행하기 전에 평가됩니다. 0 값은 이전 명령에서 나온 것이므로 어떻게 해야 합니까?효과적으로실행하면 다음과 같습니다.

connectionTest=$(sshpass -p PASSWORD ssh ... "REMOTEUSER@REMOTEIP "echo quit | netcat ... ; echo 0")

필요한 것은 작은따옴표를 사용하여 로컬 쉘이 이를 리터럴로 처리하도록 하는 것입니다. 다음과 같습니다.

connectionTest=$(sshpass -p "${pass}" ssh ... "${remoteUser}@${IP}" "echo quit | netcat -w 5 local.server.local ${telnetPort}; "'echo $?')

예를 들어 두 부분으로 구성된 문자열은 "hello"'world'단일 값으로 연결됩니다 helloworld. 첫 번째 부분은 변수 평가를 수행하지만 두 번째 부분은 수행하지 않습니다.

관련 정보