wie man sich per ssh in die letzte Datei auf einem Remote-Server einfügt

621
abbood

Hintergrund

Ich protokolliere immer Protokolle (sowohl Fehler als auch Info). Dies erfordert die folgenden manuellen Schritte: 1. SSH in einen Server 2. CD in das Protokollverzeichnis 3. Identifizieren Sie die letzte Datei, die entweder Fehler oder Info 4. Endet

So sieht ein typisches Protokollverzeichnis aus:

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 

Ich möchte einen Befehlsalias erstellen, mit dem ich dies sofort von einem Remote-Computer ausführen kann

Frage

Dies als Einzelbefehl auf dem Remote-Server zu tun ist einfach (grep infofür Info und errorFehler):

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

aber wenn ich versuche, diesen Alias ​​auszuführen:

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

Ich erhalte diesen Fehler:

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

Ideen?

aktualisieren

Funktionsoption

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

Diese Option veranlasste mich einfach, mich auf aws anzumelden, aber sonst nichts

0

1 Antwort auf die Frage

1
dave_thompson_085

Wenn Ihr Alias ​​ausgeführt wird ssh ... "cd ...; commands using backquote that I can't easily show on Stack", befiehlt Ihre Shell der Shell, die Backquoted- ls ... | ...Pipeline lokal auszuführen, wobei der Name der neuesten Datei in Ihrem aktuellen Verzeichnis auf Ihrem System ermittelt wird und dieser Dateiname als Teil des Befehls an das Remote-System gesendet wird Tail diese Datei funktioniert nicht.

Ihre Optionen sind:

 # 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 

Im Allgemeinen können Sie den Befehl anstelle einer Befehlszeile (Argument) auch als Eingabe für die Remote-Shell angeben.

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

Dies ist jedoch nicht mit Ihrem offensichtlichen, wenn auch unerwarteten und unerklärlichen Wunsch verbunden, bash --loginnach dem Verlassen des Systems zu laufen tail.

Beachten Sie, dass in den beiden Heredoc-Fällen die Trennzeichenfolge angegeben ist, sodass die lokale Shell KEINE Backquote oder bestimmte andere Dinge innerhalb der Daten subventioniert.

In allen Fällen wäre es besser, die neuere $( ... )Syntax für die Befehlssubstitution anstelle der alten Backquote-Syntax zu verwenden - insbesondere für Fragen zu Stack, bei denen Backquotes (viel? Am meisten?) Nicht-Codeblock-Formatierungen stören.

Die Funktionsoption hat nicht funktioniert. Siehe Update, um zu antworten abbood vor 6 Jahren 0
das hässliche Zitat funktionierte jedoch! abbood vor 6 Jahren 0