로컬/원격 ls

로컬/원격 ls

실시간으로 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여야 합니다 .-w123.123.123.12323.123.123.1

관련 정보