SSH를 사용하여 변수로 grep

SSH를 사용하여 변수로 grep

이 두 단어가 포함된 파일을 디렉토리에서 검색하고 싶습니다.단어 1그리고단어 2. 로컬 디렉토리에서 검색하려는 경우 다음 명령을 사용하면 정상적으로 작동합니다.

for FILE in pathToDirectory/*.txt; do grep -q word1 $FILE && grep -q word2
 $FILE && echo $FILE; done

원격 호스트에서는 변수를 사용할 수 없으니 어떻게 해야 하나요? 다른 스레드에서 알아냈어요(SSH를 통한 원격 for 루프) 사람들은 이 명령을 사용하여 서버에 연결한 다음 find 명령을 다음 따옴표 안에 넣습니다. 이와 유사합니다:

 ssh -l username servername 'for FILE in pathToDirectory/*.txt; do grep -q word1 $FILE && grep -q word2 $FILE && echo $FILE; done' 

그러나 이것은 여전히 ​​나에게 효과가 없습니다.
지금 실행하는 명령은 다음과 같습니다(여전히 오류가 발생합니다).

ssh username@servername sh -c 'for FILE in /pathToDirectory/*.txt; do grep -q "word1" "$FILE" && grep -q "word2" "$FILE" && echo "$FILE"; done'

실수

FILE: -c: line 0: syntax error near unexpected token `newline'
FILE: -c: line 0: `for'
FILE: Undefined variable

답변1

기본 셸은 tcsh원격 호스트에 있으므로 명시적으로 셸을 시작해야 할 수도 있습니다 sh.

ssh username@servername sh -c 'for FILE in pathToDirectory/*.txt; do grep -q "word1" "$FILE" && grep -q "word2" "$FILE" && echo "$FILE"; done'

$FILE또한 외국 문자가 포함된 파일 이름을 처리하려면 변수 확장을 큰따옴표로 묶어야 합니다 .

word1또한 및 를 사용하더라도 이는 다음 word2과 같습니다.grep일반적인 표현설마성격. 파일에서 단어를 찾으려면 를 사용하십시오 grep -wF "word".


ssh원격 호스트에서 주어진 명령을 실행하기 위해 로그인 쉘이 항상 실행되는 것 같습니다 tcsh.정말 힘들다명령줄 스크립트에서 올바른 인용문을 얻으세요.

두 가지 솔루션(둘 다 마음에 들지 않음):

  1. 원격 호스트의 로그인 셸을 또는 같은 sh유사한 셸로 변경합니다 bash. 호스트 시스템에 로그인하고 실행하여 이를 수행하십시오 .kshzshchsh

  2. 스크립트 파일에 스크립트를 넣고 ssh다음 명령으로 실행합니다.

    ssh username@servername sh ./script.sh
    

관련 정보