원격 호스트의 로그 파일에서 문자열을 찾으려고 합니다. 하지만 스크립트를 실행하는 호스트로 에코를 다시 가져올 수는 없습니다.
#!/bin/bash
#dt=$(date +"%Y%m%d")
#HHMM=$(date '+%H:%M')
key="keys/cash_prod_key"
if
ssh -o StrictHostKeyChecking=no -qni $key user@host "cat /var/log/FILE_send.log | grep FILENAME | grep -i success"\;
then
echo "Success"
fi
나는 이것이 가장 올바른 접근 방식이라고 생각하지 않습니다.
답변1
문제는잘못된 호스트 이름.
이 답변은 더 나은 방식으로 코드를 작성하는 방법에 중점을 둡니다.
원격 호스트에서 전체 파이프라인을 실행할 필요는 없습니다. 명령줄에서 복잡한 명령을 실행하면 ssh
특히 인용 관점에서 오류가 발생하기 쉽습니다.
대신에:
#!/bin/bash
key="keys/cash_prod_key"
ssh_args=( -o StrictHostKeyChecking=no -qni "$key" user@host )
if ssh "${ssh_args[@]}" cat /var/log/FILE_send.log |
grep -F 'FILENAME' |
grep -q -i -F 'success'
then
echo 'Success'
fi
이는 cat
원격 호스트에서만 실행된 다음 grep
두 명령을 모두 로컬에서 실행합니다.
또한 패턴으로 사용되는 문자열이 다음과 같다고 가정하고 명령 -F
에 플래그를 추가했습니다.grep
아니요정규식이지만 검색하려는 리터럴 문자열입니다. 마지막 grep
사용 -q
, 실제로는 관심이 없기 때문에보다출력, string 이 포함되어 있는지 확인하세요 success
.
읽기 쉽도록 사용된 매개변수를 ssh
배열에 넣어 나중에 호출에 사용할 수 있도록 했고, 파이프 기호 뒤에 줄바꿈을 삽입하여 줄도 약간 더 짧게 만들었습니다. 스크립트는 여전히 문법적으로 정확합니다. 또한 변수 등의 확장은 어떤 맥락인지 알지 않는 한 항상 큰따옴표로 묶어야 합니다.이는 필수 사항이 아닙니다..
ssh
명령이 올바른 방식으로 호출되었다고 가정합니다 .