背景

背景

背景

我總是尾隨日誌(錯誤和訊息)..這需要以下手動步驟 1. ssh 進入伺服器 2. cd 進入日誌目錄 3. 識別最後的4. tail 進入其中的錯誤或資訊文件

這是典型的日誌目錄的樣子:

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

我想建立一個命令別名,讓我可以立即從遠端電腦執行此操作

問題

在遠端伺服器上將其作為單一命令執行很容易(grepinfo用於獲取資訊和error錯誤):

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",命令您的 shell 運行反引號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

一般來說,您還可以提供以下命令輸入到遠端 shell 而不是命令列(參數)

ssh ... <<"END" # shouldn't need -t in this case 
cd ...; tail -f `ls ... | ...`
END

但這並不符合您明顯但未提及和無法解釋的bash --login退出後繼續運行的願望tail

請注意,這裡的兩個案例引用了分隔符號字串,因此本地 shell 不會在資料中替換反引號或某些其他內容。

在所有情況下,最好使用較新的$( ... )語法進行命令替換,而不是舊的反引號語法 - 特別是對於堆疊上的問題,其中反引號幹擾(很多?大多數?)非代碼塊格式。

相關內容