배경

배경

배경

나는 항상 로그(오류와 정보 모두)를 추적합니다.. 여기에는 다음과 같은 수동 단계가 필요합니다. 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 사례에서는 구분 기호 문자열을 인용하므로 로컬 쉘은 데이터 내에서 역따옴표 또는 기타 특정 항목을 대체하지 않습니다.

$( ... )그리고 모든 경우에 명령 대체를 위해 이전 역따옴표 구문 대신 새로운 구문을 사용하는 것이 더 나을 것입니다 . 특히 역따옴표가 코드블록이 아닌 형식화를 방해하는 스택 관련 질문의 경우 더욱 그렇습니다.

관련 정보