2016-11-22 8 views
0

ssh를 통해 다음 명령을 실행하려고 할 때 :오류 때 ssh를 통해 bash는 명령을 실행

ssh hostname 'for pid in $(ps -ef | grep "some process" | awk '{print $2}'); do kill -9 $pid; done'

나는 다음과 같은 오류 얻을 :

awk: cmd. line:1: {print 
awk: cmd. line:1:  ^unexpected newline or end of string 

나는 다른 방법으로 탈출 시도했습니다를 올바른 방법을 찾지 못했습니다 - 아니면 다른 것일 수 있습니까?

미리 감사드립니다.

+1

이 경우 "pkill -f"프로세스를 사용할 수 있습니다. – ymonad

+0

그것은 특정 이름의 모든 프로세스를 죽이지는 않습니까? –

답변

3

문자열을 닫는 작은 따옴표를 제외하고는 아무 것도 해석되지 않으므로 작은 따옴표를 작은 따옴표로 묶을 수 없습니다. 당신은 "'"와 함께 단일 인용 문자열을 연결할 수 있습니다

ssh host 'for pid in $(ps -ef | grep "some process" | awk '"'"'{print $2}'"'"'); do kill -9 $pid; done' 

또는 탈출 널링 작은 따옴표 (\'는) :

ssh host 'for pid in $(ps -ef | grep "some process" | awk '\''{print $2}'\''); do kill -9 $pid; done' 

Strong Quoting를 참조하십시오.

당신의 명령을 $IFS 단락 지어진 인수의 몇 가지로 해석됩니다 오류의 원인 :

  • for pid in $(ps -ef | grep "some process" | awk {print
  • }); do kill -9 $pid; done

$2에 없다 문자열,부터은 쉘 변수로 해석되며 일반 쉘 컨텍스트에서이 변수의 값은 비어 있습니다.

따라서, 당신은 서버에 다음 명령을 보낸 : 터미널에서이 명령을 실행하면, 당신은 AWK에서 같은 오류가 발생합니다

for pid in $(ps -ef | grep "some process" | awk {print }); do kill -9 $pid; done 

.

+0

@ymonad가 위의 주석에서 지적했듯이, ** pkill ** 명령은 인용 문제를 줄여줍니다 :'ssh 호스트 'pkill -KILL -f "some process"'... ... 텍스트 **' 일부 프로세스'**에는 따옴표가 포함되지 않습니다. – Jdamian