Manchmal muss ich bestimmte Protokollinhalte (z. B. API-Aufrufe) aus Protokolldateien herausfinden. Diese Protokolldateien sind auf mehreren Linux-Servern vorhanden.
Ich muss mich per SSH bei jedem Server anmelden und mit grep das Protokoll durchsuchen. Im Moment plane ich, eine Shell zu schreiben, die diese Aufgabe automatisch erledigt. Aber als ich versuchte, „ssh“ in eine Shell einzugeben, führte ich es aus, musste immer ein Passwort eingeben und zeigte die Meldung auf dem Bildschirm an.
Gibt es eine Möglichkeit, sicherzustellen, dass bei der Kennworteingabe keine Warnmeldung angezeigt wird? Oder gibt es eine Möglichkeit, die Verwendung von „grep“ auf mehreren Servern zu unterstützen?
Ich kann die SSH-Schlüsselauthentifizierung nicht verwenden, da ich diese Änderung auf Produktionsservern vornehmen kann
Weil ich auch plane, das Ergebnis auf einer Webseite bereitzustellen (z. B. JSP, PHP usw.) und diese Shell per Java im Backend auszuführen.
Antwort1
Eine Alternative zur Public-Key-Authentifizierung oder Kerberos-Authentifizierung ist die Verwendung von Master-Verbindungen. Dies geschieht normalerweise, indem Folgendes in die ~/.ssh/config
Datei auf dem Client eingefügt wird:
Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
Wenn Sie danach bereits mit einem Server verbunden sind, wird beim Öffnen einer weiteren Sitzung nicht nach Ihrem Passwort gefragt, sondern die erste Verbindung wird wiederverwendet. Wenn Sie also die Verbindungen zu all Ihren Servern offen halten, muss Ihr Skript nie wieder ein Passwort eingeben.
Siehe die ControlMaster
, ControlPath
, ControlPersist
Optionen in ssh_config(5)
oder alternativ die -O
, -S
Optionen von ssh(1)
.
Antwort2
Ich bin wirklich spät dran mit der Beantwortung dieser Frage, aber Sie könntenStoff. Sie könnten eine fabfile.py wie folgt schreiben:
from fabric.api import *
env.roledefs = {
'dev': ['dev_a', 'dev_b'],
'pro': ['pro_a', 'pro_b', 'pro_c', 'pro_d']
}
env.user = 'foobar'
env.shell = 'rbash -l -c'
env.disable_known_hosts = True
logfile = '/path/to/logfile.txt'
def g(pattern):
with settings(warn_only=True):
run('grep -H --color "{0}" {1}'.format(pattern, logfile))
Das obige Skript definiert einen neuen Befehl namensGDas akzeptiert ein Muster als Eingabe. Sie können das Skript mit Folgendem ausführen:
fab -R dev -p my_pwd g:"some pattern"
um "ein bestimmtes Muster" auf Hosts zu grepen, die durch die Rolle definiert sindEntwickler.
Antwort3
Da Sie keine Authentifizierung mit öffentlichem Schlüssel verwenden können, ist es wahrscheinlich besser, die in der ersten Antwort beschriebene Methode zu verwenden, um den Anmeldevorgang nicht wiederholen zu müssen. Das Erstellen eines Skripts zum Herstellen einer Verbindung mit mehreren Servern sollte jedoch relativ einfach sein:
#!/usr/bin/env bash
hosts=(ipaddr1 ipaddr2 ipaddr3) # or host names
user=username # your user on host
log=/tmp/mylog # result of grepping
for host in ${hosts[@]}; do
echo "== $host ==" >> $log
ssh -l $user $host "grep some_pattern /path/to/logfile 2>&1" >> $log
done
less $log # view result
Ich habe das nicht getestet, aber es sollte funktionieren. Bitte sagen Sie mir, wenn es nicht das ist, was Sie brauchen.
Antwort4
verwenden Sie einfach grep4j (https://code.google.com/p/grep4j/) auf Ihrem Backend und zeigen Sie die Ergebnisse auf Ihrem JSP/PHP an