
Ich muss ein Skript erstellen, das sich bei allen in aufgeführten Servern anmeldet servers.txt
. Ich möchte ein Passwort verwenden, nicht passwortlos. Nach der Anmeldung muss ich eine Variable festlegen und ein if
- then
- ausführen else
. Nach Abschluss der Arbeit sollte eine Datei auf dem lokalen Computer erstellt werden, nicht auf dem Remotecomputer. Die (lokale) Datei enthält die Hostnamen der Computer, auf denen bestimmte Prozesse nicht ausgeführt wurden.
Die allgemeine Idee ist:
#!/bin/bash
while read line
do
sshpass -p ******** ssh "mydomain1\admin1"@$line bash -s << EOF
pwd=*********
var=$"(ps -ef | grep http | grep -v grep | wc -l)"
if (( var > 0 ))
then
echo "$pwd" | sudo -S ps -ef | grep patrol | grep -v grep | awk '{print $2}' | xargs kill
echo "$pwd" | sudo -S rm -rf /data/abc /etc/efg
#need to create the log on local machine, not on remote machine
hostname >> /find.txt
else
#need to create the log on local machine, not on the remote machine
hostname >> /agentnotthere.txt
fi
EOF
#servers.txt contains server names
done < servers.txt
Offensichtlich bilden die Zeilen 5-16 des obigen Dokuments ein Dokument hier, das Befehle enthält, die auf dem Remote-Host ausgeführt werden sollen. In diesem Dokument hier habe ich Befehle hostname >> /find.txt
und hostname >> /agentnotthere.txt
. Wie in meinem Einführungsabschnitt und erneut in den Kommentaren im Code angegeben, möchte ich, dass der (Remote-)Hostname in eine lokale Datei geschrieben wird, nicht in eine Datei auf dem Remote-Computer. Offensichtlich schreibt ein Befehl auf dem Remote-Computer in eine Dateicommand >> filename
auf dem Remote-Rechner.
Wie kann ich mein Skript, das normalerweise ssh
einige Befehle auf Remote-Rechnern ausführt, dazu bringen, basierend auf den Ergebnissen der auf dem Remote-Rechner durchgeführten Tests eine Ausgabe in eine lokale Datei zu schreiben?
Antwort1
Ich glaube nicht, dass es einen einfachen Weg gibt, das zu tun, was Sie wollten, nämlich aus einem Skript, das auf einem Remotecomputer ausgeführt wird, in separate Dateien auf Ihrem lokalen Host zu schreiben.
Sie können die Ausgabe des Skripts jedoch problemlos in eine lokale Datei umleiten:
ssh host << EOF > output_file
some commands
to be executed
EOF
Damit können Sie das Skript so umstrukturieren, dass es ssh
mehrmals ausgeführt wird (das erhöht den ssh
Mehraufwand, aber Sie können ihn größtenteils verringern, indem Sie es ControlPersist
in der ssh
Konfigurationsdatei verwenden).
Stattdessen erhalten Sie etwa Folgendes (Pseudo-Bash):
echo "get the output of var script" | ssh host > var_value
if var read from the file is more than zero; then
echo "the thing you want" | ssh host >> /find.txt
else
echo "the other thing you want" | ssh host >> /agentnotthere.txt
fi
Dies sollte für Ihren Anwendungsfall gut geeignet sein :)
Meine zwei Cents zum Skript selbst:
- Ansible oder eines der anderen Konfigurationsmanagement-Tools ist für diese Aufgabe wahrscheinlich besser geeignet als das Schreiben von Bash-Skripten
- Die Verwendung von SSH-Passwörtern anstelle der Schlüsselauthentifizierung ist aus Sicherheitsgründen schlecht. Aber ich war in Situationen, in denen es unmöglich war, dies umzusetzen, entweder aufgrund der Unternehmensrichtlinien/alter eingebetteter Sachen, die es nicht unterstützen/usw.
- Anstatt den alten
ps aux | grep -v grep | grep something
Boilerplate-Code zu verwenden, können Siepgrep
und verwendenpkill
. Sie sind im Standard enthaltencoreutils
, daher sollten sie dort verfügbar sein, sofern Sie nicht wirklich veraltete Systeme verwenden.