背景
我总是跟踪日志(错误和信息)。这需要以下手动步骤 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
我想创建一个命令别名,让我可以立即从远程机器执行此操作
问题
在远程服务器上用单个命令执行此操作很容易(使用 grepinfo
获取信息,使用 greperror
获取错误):
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
。
请注意,两个 heredoc 案例引用了分隔符字符串,因此本地 shell 不会替换数据中的反引号或某些其他内容。
并且在所有情况下,最好使用较新的$( ... )
语法进行命令替换,而不是旧的反引号语法 - 特别是对于 Stack 上反引号会干扰(很多?大多数?)非代码块格式的问题。