como inserir o último arquivo em um servidor remoto via ssh

0

plano de fundo

Eu sempre procuro os logs (tanto de erro quanto de informação) ... o que requer as seguintes etapas manuais 1. ssh em um servidor 2. cd no diretório de logs 3. identifique o último arquivo que é erro ou informação 4. cauda para dentro dela

é assim que um diretório de log típico se parece:

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

Eu quero criar um alias de comando que me permita fazer isso de uma máquina remota instantaneamente

pergunta

fazer isso como um único comando no servidor remoto é fácil (grep info para info e error para erro):

tail -f 'ls -Art | grep info | tail -n 1'

mas quando tento executar este alias:

alias logger='ssh -i /file.pub user@host -t 
"cd /path/to/logs; tail -f 'ls -Art | grep info | tail -n 1'; bash --login"'

Eu recebo este erro:

tail: cannot open '.viminfo' for reading: No such file or directory
tail: no files remaining

ideias?

atualizar

opção de função

function totprod1log() {
    ssh -i file.pub user@host;
    cd /path/to/logs;
    tail -f $(ls -Art | grep info | tail -n 1); 
    bash --login;
}

essa opção simplesmente me fez logar no aws, mas nada além disso

    
por abbood 03.02.2018 / 10:00

1 resposta

1

Quando o seu alias executar ssh ... "cd ...; commands using backquote that I can't easily show on Stack" que comanda seu shell para executar o backquoted ls ... | ... pipeline localmente , que localiza o nome do arquivo mais recente em seu diretório atual em seu sistema e envia esse nome do arquivo como parte do comando para o sistema remoto, onde é claro que tentar acompanhar esse arquivo não funciona.

Suas opções são:

 # 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

Em geral, você também pode fornecer o comando como entrada para o shell remoto em vez de uma linha de comando (argumento)

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

mas isso não combina com seu desejo aparente, embora não mencionado e inexplicável, de deixar bash --login em execução após sair do tail .

Note que os dois casos heredoc citam a string do delimitador para que o shell local NÃO substitua o backquote, ou certas outras coisas, dentro dos dados.

E em todos os casos, seria melhor usar a sintaxe $( ... ) mais recente para a substituição de comandos, em vez da antiga sintaxe de backquote - especialmente para perguntas no Stack em que os backquotes interferem na formatação sem codeblock (muito? mais?).

    
por 03.02.2018 / 18:49