背景
我總是尾隨日誌(錯誤和訊息)..這需要以下手動步驟 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 不會在資料中替換反引號或某些其他內容。
在所有情況下,最好使用較新的$( ... )
語法進行命令替換,而不是舊的反引號語法 - 特別是對於堆疊上的問題,其中反引號幹擾(很多?大多數?)非代碼塊格式。