Skript ruft SSH auf; möchte Protokoll auf lokalem Rechner erstellen

Skript ruft SSH auf; möchte Protokoll auf lokalem Rechner erstellen

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.txtund 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 >> filenameauf dem Remote-Rechner.

Wie kann ich mein Skript, das normalerweise ssheinige 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 sshmehrmals ausgeführt wird (das erhöht den sshMehraufwand, aber Sie können ihn größtenteils verringern, indem Sie es ControlPersistin der sshKonfigurationsdatei 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 somethingBoilerplate-Code zu verwenden, können Sie pgrepund verwenden pkill. Sie sind im Standard enthalten coreutils, daher sollten sie dort verfügbar sein, sofern Sie nicht wirklich veraltete Systeme verwenden.

verwandte Informationen