실시간으로 SNMP 로거에서 관련 라인을 가져와 확인을 위해 내 애플리케이션 서버로 이동하고 싶습니다. 후반은 괜찮습니다 scp
. 트릭을 수행하고 있습니다. 전반전은 나에게 약간의 슬픔을 안겨준다.
내가 하고 싶은 일은 관련 메시지에 대한 최신 로그 파일 3개를 확인하는 것입니다. 그래서 나는 이렇게 할 것이다:
[user@SNMPServer]$ cd /var/opt/OV/log/nnm/; files=`ls -t | grep -m 3 trap.csv`; echo $files
trap.csv trap.csv.2019-05-31_07_00_01 trap.csv.2019-05-31_06_00_01
좋습니다. 왜냐하면 다음과 같은 계획을 세우기 때문입니다.
[user@SNMPServer]$ grep $ipAddress $files
다시 말하지만, SNMP 서버에서 실행하면 제대로 작동합니다.
그러나 내 VM에서 수행할 때
admin@alarmux:~$sudo ssh [email protected] "cd /var/opt/OV/log/nnm/; files=`ls -t | grep -m 3 trap.csv`; echo $files"
나는 다음과 같은 결과를 얻습니다.
assets bash: testerlog: command not found bash: count.txt: command not found
이는 ls -t
원격 디렉토리가 아닌 내 VM 홈 디렉토리의 결과입니다. 어딘가에 이스케이프 문자가 누락되었나요?
답변1
역따옴표를 사용하고 $( … )
큰따옴표 안에 삽입합니다. 작은 따옴표를 사용하면 작동합니다.
sudo ssh [email protected] 'cd /var/opt/OV/log/nnm/; files=`ls -t | grep -m 3 trap.csv`; echo $files'
또는 xargs를 사용하여 서브쉘을 완전히 피하십시오.
sudo ssh [email protected] 'ls -td /var/opt/OV/log/nnm/* | grep -m 3 trap.csv | xargs grep '$ipAddress
답변2
셸을 사용하면 zsh
가장 최근 수정 타임스탬프가 있고 디렉터리 *trap.cvs
에서 파일 이름이 일치하는 세 개의 파일이 /var/opt/OV/log/nnm
다음 패턴을 갖게 됩니다.
/var/opt/OV/log/nnm/*trap.cvs(.om[1,3])
여기서 (...)
이전 패턴의 동작을 수정합니다. .
일반 파일(디렉토리 이름 등 제외)만 선택하고 om
수정 타임스탬프를 줄여서 순서를 지정합니다. 이 함수는 [1,3]
처음 3개의 일치 항목만 반환합니다(또는 일치 항목이 더 적은 경우 그 이하).
따라서 원격 시스템에 쉘이 설치되어 있으면 zsh
다음을 수행할 수 있습니다.
ssh [email protected] zsh -c 'grep -wF "$1" /var/opt/OV/log/nnm/*trap.cvs(.om[1,3])' zsh "$ipAddress"
이는 원격 시스템에서 가장 최근에 수정된 세 개의 파일에 grep
보관된 IP 주소를 찾기 위해 시작됩니다 .$ipAddress
와 함께 사용된 플래그는 grep
정규식 일치(즉 ) 대신 문자열 비교를 사용하도록 하며 일치하는 문자열이 전체 단어(즉 ; 와 일치하지 않도록 ;) -F
여야 합니다 .-w
123.123.123.123
23.123.123.1