상상하다:
원격 호스트에 연결하고 로그 파일에서 특정 키워드를 검색하는 스크립트가 있습니다. EOF가 없으면 ssh가 정지되지만 heredoc(EOF)을 사용하면 문제가 사라집니다. 모든 명령은 원격 호스트에 SSH로 연결한 후에 실행되어야 하므로 EOF 블록 내에 있습니다.
grep 명령은 터미널에서 동일한 명령을 실행하는 동안 "해당 파일이나 디렉터리가 없습니다"라는 출력을 제공했으며 원하는 출력을 제공했습니다.
문제의 grep 코드는 다음과 같습니다.
ssh -q -T username@remotehost <<-EOF 2>&1 | tee -a
getValue=$(grep -R 'keyword' /user/log/file.log | awk -F ' ' '{print$NF}') )
echo "${getValue}"
EOF
Output: grep: /user/log/file.log : No such file or directory
원격 호스트를 인쇄하고 로그 경로와 file.log를 추가로 교차 검사하면 SSH가 제대로 작동합니다. 설정 관점에서 볼 때 모든 것이 제자리에 있습니다. 인터넷을 통해 몇 가지 연구 및 개발을 수행했지만 지금까지 아무 도움도 되지 않았습니다.
답변1
'EOF'
쉘이 $
로컬에서 해석 하지 못하도록 하려면 인용문을 사용해야 합니다 . 원격 명령을 실행하기 전에 셸에서 grep을 실행해 보세요.
비교하다:
ssh username@remotehost << 'EOF'
echo "THIS IS $(hostname)"
EOF
그리고
ssh username@remotehost << EOF
echo "THIS IS $(hostname)"
EOF
답변2
문제는 쉘이 원격 시스템이 아닌 로컬에서 문서의 명령 대체를 확장하도록 함으로써 발생합니다. 이는 여기에 있는 문서가 참조되지 않았기 때문에 수행됩니다. 같은 이유로 $NF
및 쉘 변수로서 빈 문자열로 확장됩니다(해당 쉘 변수에 이전 값이 없는 경우). ${getValue}
쉘은 $NF
프로그램이 사용되는 것을 인식하지 못합니다 awk
.
원격 호스트에서 복잡한 명령을 실행하는 대신 ssh
다음 ssh
을 사용하여 데이터를 가져온 다음 해당 데이터에 대해 로컬로 명령을 실행하십시오.
ssh username@remotehost cat /user/log/file.log |
awk -F ' ' '/keyword/ { print $NF }'
또한 명령이 하위 문자열을 포함하는 줄에서 공백으로 구분된 마지막 필드를 인쇄 grep
하도록 재귀(?!)를 결합 awk
하여 파이프라인을 약간 단순화했습니다 .awk
keyword
또한 echo
해당 변수의 내용만 출력하려는 경우 출력을 변수에 할당하는 것은 의미가 없습니다(경우에 따라 인쇄하기 전에 제공된 데이터를 추가로 수정할 수 있음). tee -a
별 일 없을 것 같은 통화 도 삭제했습니다 .
답변3
약 일주일 전에 나는 래퍼 스크립트 개념을 사용하여 내가 원하는 것을 달성했습니다. 동일한 문제가 발생할 수 있는 신규 사용자를 위해 이 링크를 게시하세요.
물론 이것은 새로운 개념이 아니며 다른 많은 사람들과 마찬가지로 여기에 질문을 게시하기 전에도 알고 있었습니다. 나는 이것을 스크립트를 통해 정말로 달성하고 싶지만 원격 호스트에 대한 ssh 이후의 변수 확장은 동일한 스크립트의 모든 것을 처리하지 못합니다. 따라서 그렇게 많은 노력을 기울일 가치가 없습니다.
래퍼 스크립트를 만들고 그 안에 있는 기본 스크립트를 호출합니다. 래퍼에서 ssh 명령을 실행하고 기본 스크립트를 인수로 전달합니다. 그것은 다음과 같습니다:
ssh username@host < main_script.sh
호스트가 여러 개인 경우 "host" 변수에서 호스트 서버 값을 읽은 후 for/while 루프에 ssh를 넣습니다.
while read -r host
do
servers=${host}
ssh username@${host} < main_script.sh
done < ${servers}
제안해 주신 모든 분들께 감사드립니다! !