인용문: SSH 계정 반복, 원격 서버에서 psql 호출

인용문: SSH 계정 반복, 원격 서버에서 psql 호출

이것은 인간의 마음에서 작동하지만 쉘은 인용문을 무시합니다.

for h in a b; do ssh $h psql -tAc "select * from mytab where mycol='x'"; done

가독성을 잃지 않고 어떻게 이 줄을 인용할 수 있나요?

답변1

따옴표를 이스케이프 처리해야 합니다. 패키지 전달 게임에서 패키지 레이어로 생각하십시오. 각 쉘은 "레이어"를 엽니다.

그래서:

echo "this ; is a semicolon"

그러나 SSH를 통해 실행하려면 다음을 수행하십시오.

ssh $user@$host echo "this ; is a semicolon"

이것SSH패키지의 첫 번째 레이어가 열립니다 - 전송:

echo this ; is a semicolon

이는 세미콜론이 쉘에 의해 해석되기 때문에 중단됩니다.

따라서 이렇게 하려면 먼저 따옴표를 이스케이프 처리해야 ssh가 한 레이어를 안전하게 "잠금 해제"할 수 있습니다.

ssh $user@$host echo "\"this ; is a semicolon\""

따라서 ssh는 "외부" 및 "이스케이프 레이어"를 제거하고 다음을 전달합니다.

echo "this ; is a semicolon"

이것은 라이너 중 하나에 대해 수행해야 할 작업입니다. 가독성을 잃지 않는 것에 관해서는 이스케이프 및 인용 중첩이 필연적으로 지저분해지기 때문에 말처럼 쉽지는 않습니다.

내가 제공할 수 있는 최선의 방법은 변수를 사용하여 SQL 문을 래핑하는 것입니다. 그러면 최소한 "래핑된 문"을 보내는 것이 분명해집니다.

THING_TO_ECHO='"this ; is a semicolon"'; ssh $user@host echo $THING_TO_ECHO

관련 정보