2017-01-18 4 views
2

SSH를 통해 실행하려고하는 명령이 있지만 따옴표로 올바르게 묶는 방법을 모르겠습니다. 아래 2 가지 시도가 있습니다. 아무도 내가 원하는 것을하지 않습니다.ssh를 통한 인용문 및 매개 변수 대체

A) 명령이이 $ 파일 이름 때문에 작동하지 않습니다 올바른 디렉토리 /home/nrichard/1.1 그러나 while 루프에 갈 수있을 것입니다

version=1.1 
ssh [email protected] " 
    cd /home/nrichard/${version} 
    ls | while read filename ; do 
     echo $filename 
     hive -f $filename & 
    done" 

따옴표로 싸여있다 명령이 ssh를 통해 전송되기 전에 빈 문자열로 대체됩니다. 한편 ...

B) 명령이 올바른 디렉토리 /home/nrichard/1.1에 갈 수 없습니다 따옴표

version=1.1 
ssh [email protected] ' 
    cd /home/nrichard/${version} 
    ls | while read filename ; do 
     echo $filename 
     hive -f $filename & 
    done' 

에 싸여있다. 그것은/home/nrichard/$ {version} '에 존재하는 디렉토리가 아니며 내가 가고자하는 디렉토리가 아닙니다. 그러나 while 루프는 정상적으로 작동합니다.

이 아이디어를 만드는 방법에 대한 아이디어가 있으십니까?

답변

1

큰 따옴표를 사용하여 전체를 감싸는 동안 셸을 확장하지 않으려는 변수를 이스케이프 처리하는 방법은 어떻습니까?

version=1.1 
ssh [email protected] " 
    cd /home/nrichard/${version} 
    ls | while read filename ; do 
     echo \$filename 
     hive -f \$filename & 
    done" 
+1

감사 @codeforester. 그거야. 답변을 수락합니다 :) –

2

디스크의 추가 파일 비용으로 모든 인용 문제를 해결하려면이 방법을 사용하십시오.

별도의 (로컬) 파일에서 원격 호스트에서 실행할 명령을 입력하십시오. 명령 줄에서 정상적으로 사용하는 것처럼 일반 인용을 사용합니다. 배쉬에 텍스트

cat name_of_file_containing_commands | ssh [email protected] bash 

배관 라인 (은, 그것을 시도도 로컬로 작동)이 텍스트의 실행됩니다. 이 경우 간단히 ssh를 "네트워크 파이프"로 사용하십시오.

또한 물론, 쓸모 cat을 방지 할 수 있습니다

ssh [email protected] bash <name_of_file_containing_commands