如何通过ssh拖入远程服务器上的最后一个文件


0

背景

我总是尾部记录日志(错误和信息)..这需要以下手动步骤: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

我想创建一个命令别名,使我可以立即从远程计算机执行此操作

作为远程服务器上的单个命令执行此操作很容易(grep info表示信息和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,但没有其他

Answers:


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

通常,您还可以提供命令作为远程Shell的输入,而不是命令行(参数)

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

但这与您明显的(尽管未被提及和无法解释的)bash --login退出欲望的愿望相结合tail

请注意,这两个heredoc情况用引号引起来,因此本地shell不会在数据中替换反引号或某些其他内容。

在所有情况下,最好使用较新的$( ... )语法代替命令(而不是旧的反引号)来使用命令-尤其是对于堆栈上反引号会干扰(最多??)非代码块格式的问题。


函数选项不起作用,请参阅更新以回答
Abbood

丑陋的报价虽然有效!
–'abbood
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.