배경
나는 항상 로그(오류와 정보 모두)를 추적합니다.. 여기에는 다음과 같은 수동 단계가 필요합니다. 1. 서버에 ssh를 연결합니다. 2. 로그 디렉터리에 CD를 넣습니다. 3.마지막오류 또는 정보인 파일 4. 해당 파일로 이동
일반적인 로그 디렉터리는 다음과 같습니다.
error-2017-12-11.log error-2017-12-30.log error-2018-01-05.log error-2018-01-11.log error-2018-01-17.log error-2018-01-23.log error-2018-01-29.log info-2017-12-26.log info-2018-01-01.log info-2018-01-07.log info-2018-01-13.log info-2018-01-19.log info-2018-01-25.log info-2018-01-31.log
error-2017-12-13.log error-2017-12-31.log error-2018-01-06.log error-2018-01-12.log error-2018-01-18.log error-2018-01-24.log error-2018-01-30.log info-2017-12-27.log info-2018-01-02.log info-2018-01-08.log info-2018-01-14.log info-2018-01-20.log info-2018-01-26.log info-2018-02-01.log
error-2017-12-26.log error-2018-01-01.log error-2018-01-07.log error-2018-01-13.log error-2018-01-19.log error-2018-01-25.log error-2018-01-31.log info-2017-12-28.log info-2018-01-03.log info-2018-01-09.log info-2018-01-15.log info-2018-01-21.log info-2018-01-27.log info-2018-02-02.log
error-2017-12-27.log error-2018-01-02.log error-2018-01-08.log error-2018-01-14.log error-2018-01-20.log error-2018-01-26.log error-2018-02-01.log info-2017-12-29.log info-2018-01-04.log info-2018-01-10.log info-2018-01-16.log info-2018-01-22.log info-2018-01-28.log info-2018-02-03.log
error-2017-12-28.log error-2018-01-03.log error-2018-01-09.log error-2018-01-15.log error-2018-01-21.log error-2018-01-27.log error-2018-02-02.log info-2017-12-30.log info-2018-01-05.log info-2018-01-11.log info-2018-01-17.log info-2018-01-23.log info-2018-01-29.log outfile
error-2017-12-29.log error-2018-01-04.log error-2018-01-10.log error-2018-01-16.log error-2018-01-22.log error-2018-01-28.log error-2018-02-03.log info-2017-12-31.log info-2018-01-06.log info-2018-01-12.log info-2018-01-18.log info-2018-01-24.log info-2018-01-30.log
원격 컴퓨터에서 즉시 이 작업을 수행할 수 있는 명령 별칭을 만들고 싶습니다.
질문
원격 서버에서 단일 명령으로 이 작업을 수행하는 것은 쉽습니다( info
정보 및 error
오류에 대한 grep).
tail -f `ls -Art | grep info | tail -n 1`
하지만 이 별칭을 실행하려고 하면 다음과 같습니다.
alias logger='ssh -i /file.pub user@host -t
"cd /path/to/logs; tail -f `ls -Art | grep info | tail -n 1`; bash --login"'
다음 오류가 발생합니다.
tail: cannot open '.viminfo' for reading: No such file or directory
tail: no files remaining
아이디어?
업데이트
기능 옵션
function totprod1log() {
ssh -i file.pub user@host;
cd /path/to/logs;
tail -f $(ls -Art | grep info | tail -n 1);
bash --login;
}
이 옵션을 사용하면 aws에 로그인할 수 있었지만 그 외에는 아무 것도 없었습니다.
답변1
별칭이 실행되면 ssh ... "cd ...; commands using backquote that I can't easily show on Stack"
셸에 역따옴표가 붙은 ls ... | ...
파이프라인을 실행하도록 명령합니다.장소 상에서, 시스템의 현재 디렉터리에 있는 최신 파일의 이름을 찾아 해당 파일 이름을 명령의 일부로 원격 시스템에 보냅니다. 물론 해당 파일을 추적하려고 해도 작동하지 않습니다.
귀하의 옵션은 다음과 같습니다:
# ugly quoting to work with doublequotes
alias logger='ssh ... "cd ...; tail -f \`ls ... | ...\`; bash --login"'
# shell function or script, which let you use clearer singlequotes
logger(){
ssh ... 'cd ...; tail -f `ls ... | ...`; bash --login'
}
# or
cat <<"END" >logger # use some dir (early) in $PATH
ssh ... 'cd ...; tail -f `ls ... | ...`; bash --login'
END
chmod +x logger
일반적으로 다음과 같이 명령을 제공할 수도 있습니다.입력명령줄(인수) 대신 원격 셸로
ssh ... <<"END" # shouldn't need -t in this case
cd ...; tail -f `ls ... | ...`
END
bash --login
그러나 이것은 를 종료한 후 실행을 종료하려는 언급되지 않고 설명할 수 없는 명백한 욕구와 결합되지 않습니다 tail
.
두 개의 heredoc 사례에서는 구분 기호 문자열을 인용하므로 로컬 쉘은 데이터 내에서 역따옴표 또는 기타 특정 항목을 대체하지 않습니다.
$( ... )
그리고 모든 경우에 명령 대체를 위해 이전 역따옴표 구문 대신 새로운 구문을 사용하는 것이 더 나을 것입니다 . 특히 역따옴표가 코드블록이 아닌 형식화를 방해하는 스택 관련 질문의 경우 더욱 그렇습니다.