2010-03-18 8 views
5

기계 목록에 ssh로 스크립트를 작성하고 변수를 다른 값과 비교합니다. 문제가 발생했습니다 (몇 가지 해결 방법이 있지만이 시점에서 왜이 방법이 효과가 없는지 궁금해하는 것).지저분한 bash 변수

VAR=`ssh $i "awk -F: '/^bar/ {print \$2}' /local/foo.txt"` 

는 ($ 내가 호스트 이름을하여야 할 호스트, 암호 프롬프트가 주어지지 신뢰할 수 있습니다.)에 foo.txt의

예 :

foo:123456:abcdef 
bar:789012:ghijkl 
baz:345678:mnopqr 

내가 있으리라 믿고있어 그것이 문제입니다 따옴표 또는 \ 어딘가에 필요합니다. 여러 가지 방법을 시도해 봤지만 (``, ''대신 $()를 사용하는 따옴표가 있지만) 제대로 된 것처럼 보이지 않습니다. 내 스크립트는 다음을 사용하여 올바르게 작동합니다.

VAR=`ssh $i "grep bar /local/foo.txt" | awk -F: '{print \$2}'` 

내가 말했듯이, 단지 호기심, 모든 응답은 높이 평가됩니다.

내 출력이 무엇인지 게시하는 것을 잊어 버렸습니다. awk는 두 번째 섹션이 아닌 일치하는 전체 라인을 뱉어냅니다. 따옴표로 연주하고 \ "나는 거기에 새로운 줄이있는 것처럼"{print "명령을 찾지 못하는 등의 오류가 발생했습니다.

+0

당신이 내 질문에 관련에 Serverfault에 대한 응답을 얻을 수 있습니다 tions/99886/ssh-not-redirecting-stdout-to-local-terminal –

+0

첫 번째 예제에서 캐럿을 제거하면 어떻게됩니까? 어쩌면 선의 시작 부분에 보이지 않는 문자가있을 수 있습니다. – danben

+0

@ Lance Roberts -이 질문은 ssh가 아니라 awk에 관한 것이므로 스택 오버 플로우에 적절합니다. – danben

답변

5

sshd는 명령을 bash로 실행하도록 명령하므로 스크립트를 실행하는 측뿐만 아니라 원격 측의 bash 인터프리터를 통과하게됩니다. 의이 명령을 보자 : 당신이 실행하고있는 bash는 스크립트를 해석하지 않도록

VAR=`ssh $i "awk -F: '/^bar/ {print \$2}' /local/foo.txt"` 

당신은 제대로 로컬 컴퓨터에 대한 $2을 탈출했습니다. 그러나 모든 따옴표는 (I 내부 따옴표가 제거 된 이유를 완전히 확실하지 않다) awk가에 도착하는 시간에 의해 제거되고 있으며이 실행 있어요 : 원격 측에

awk -F: /^bar/ {print $2} /local/foo.txt 

배쉬는 $ 2보고 그것을 대체 빈 문자열로 다음과 같이 남겨 두십시오.

awk -F: /^bar/ {print } /local/foo.txt 

이것이 전체 행을 인쇄하는 이유입니다. 어떻게 해결할 수 있니? 당신은 원격 측면에서 어떤 bash는 지금처럼 슬래시로 실행됩니다 벗어날 수 있습니다 또한

VAR1=`ssh $i localhost "echo awk -F: '/^bar/ {print \\\$2}' /local/foo.txt"` 

, 당신은 당신이 와서 더 이상 문제를 디버깅하는 정말 실행되는 것을 bash에 볼 수있는 명령을 에코 단지 수 를 통해 : http://serverfault.com/ques :

VAR1=`ssh $i localhost "echo awk -F: '/^bar/ {print \$2}' /local/foo.txt"` 
echo VAR1: $VAR1 

Execute it and see this output and see right away that it has removed $2: 
VAR1: awk -F: /^bar/ {print } /local/foo.txt 
+0

따옴표가 임의로 제거되지는 않지만 원격 측의 셸이이를 인용하고 있습니다. 명령 행을 작성하십시오. 원격 쉘에 대해 인용하십시오. 로컬 쉘에 대해 인용하십시오. –

+0

아아 나는 가까왔다! 고맙습니다! – Kyle

+0

@Chris Johnsen : "... \ '{print \ $ 2} \'.."'을 통과했을 때 나는 실험하는 동안 자신을 혼란스럽게 생각했습니다. 원격 측에서는 표현식을 적절히 표현하고 있지만'$ 2 '는 여전히 누락되었습니다. 그러나 당신이 말한 것을 읽고 나면'\ '를''로 대체하기 때문에 의미가 있습니다. 동시에''$ 2' '로 대체합니다. 나는 그것이 마법이 아니라는 것을 알았다. 나는 지금 당장 그것을 설명 할 수 없었다. ;) 명확히 해 주셔서 감사합니다. – indiv

0

시도는 가능한 한 $() 구문을 사용하는

VAR=$(ssh $i "awk -F: '/^bar/ {print \$2}' /local/foo.txt")