Hintergrund
Ich protokolliere immer Fehler und Informationen. Dazu sind die folgenden manuellen Schritte erforderlich: 1. Melden Sie sich per SSH bei einem Server an. 2. Wechseln Sie per CD in das Protokollverzeichnis. 3. Identifizieren Sie diezuletztDatei, die entweder Fehler oder Informationen enthält 4. tail into it
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 Remotecomputer aus tun kann
Frage
Dies lässt sich ganz einfach mit einem einzigen Befehl auf dem Remote-Server ausführen (grep info
für Informationen und error
Fehler):
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 hat mich einfach dazu gebracht, mich bei aws anzumelden, aber sonst nichts
Antwort1
Wenn Ihr Alias ausgeführt wird , wird Ihre Shell angewiesen, die Backquoted- Pipeline ssh ... "cd ...; commands using backquote that I can't easily show on Stack"
auszuführenls ... | ...
örtlich, das den Namen der neuesten Datei in Ihrem aktuellen Verzeichnis auf Ihrem System findet und diesen Dateinamen als Teil des Befehls an das Remote-System sendet, wo der Versuch, diese Datei zu verfolgen, natürlich nicht funktioniert.
Sie haben folgende Möglichkeiten:
# 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 auch wie folgt angeben:Eingangzur Remote-Shell anstelle einer Befehlszeile (Argument)
ssh ... <<"END" # shouldn't need -t in this case
cd ...; tail -f `ls ... | ...`
END
Dies passt jedoch nicht zu Ihrem offensichtlichen, wenn auch unerwähnten und unerklärten Wunsch, bash --login
nach dem Verlassen von weiterzulaufen tail
.
Beachten Sie, dass in den beiden Heredoc-Fällen die Trennzeichenzeichenfolge in Anführungszeichen gesetzt wird, sodass die lokale Shell innerhalb der Daten KEINE Backquotes oder bestimmte andere Dinge ersetzt.
Und in allen Fällen wäre es besser, $( ... )
für die Befehlsersetzung die neuere Syntax anstelle der alten Backquote-Syntax zu verwenden – insbesondere bei Fragen zu Stack, bei denen Backquotes (viel? den meisten?) Nicht-Codeblock-Formatierungen beeinträchtigen.