Befehle auf externem Server ausführen

Werner S

Mitglied
Grüß euch,

ich suche eine neue Idee wie ich Befehle aus einer PHP Anwenung auf einem Externen Server ausführe.

Seit einigen Jahren ist es bei uns in der Firma so gelöst:

Aus dem Adminbereich (PHP) wird zb. der Befehl "shutdown -r" in eine Externe Datenbank geschrieben.
Ein PHP Script auf dem externen Server was alle 5 Minuten via Cron abgerufen wird, liest den Befehl aus der Datenbank aus und führt Ihn per shell_exec aus.
Es läuft zwar seit guten 7 Jahr ohne Störungen, shell_exec scheint mir aber nicht so die sicherste und beste Lösung zu sein.

Nein, ich habe das nicht so umgesetzt, ich kam erst später in die Firma.

Wie würdet Ihr das lösen?
 
Da ich mich im Zuge eines Deployments gerade damit beschäftige: Eine Möglichkeit ist, Befehle über SSH auszuführen (SSH remote execution). Das sieht im Allgemeinen so aus:

Code:
ssh user@host command

Mehrere Befehle gehen so:

Code:
ssh user@host "one;two;three"

Der Befehl kann auch ein ausführbares Skript sein.
 
Daran habe ich auch schon gedacht und was kleines geschrieben was auch funktioniert.

Der Server der die Daten empfängt, lässt aber nur maximal 2 gleichzeitige Zugriffe via SSH zu.
6 Mitarbeiter arbeiten im Support. Wenn auch nur 3 irgendwas anklicken was den Externen Server betrifft, gibt es ein Problem.
Zwar ist es bei 6 fast ausgeschlossen das 3 gleichzeitig irgendwas ausführen, aber da können wir uns keine Fehler erlauben.

Wir möchten ungerne die maximale Verbindungen erhöhen.
 
Ist es auch nicht möglich, die SSH-Aufrufe auf einem Server zu bündeln? Also: die 6 Clients senden die Befehle an einen zentralen Rechner im selben Netz (und implementiert ggf. eine Warteliste, die Stück für Stück abgearbeitet wird) und dieser sendet dann die SSH-Aufrufe an den entfernten Server. Dadurch hätte man nur eine Verbindung.

Aber was kann denn im schlimmsten Falle passieren, wenn das Limit erreicht wird? Dann wird doch nur der Befehl mit einem Fehler abgebrochen, oder nicht? Je nachdem, wie diese Befehle von den 6 Rechnern aus ausgelöst werden, könnte man den Fehler abfangen und dem Nutzer einen Hinweis ausgeben und die Möglichkeit bieten, den Befehl zu wiederholen, oder es mehrfach versuchen, bis es klappt. Am besten eine Kombination aus beidem, mit begrenzter Anzahl an automatischen Wiederholungen.

Auf der anderen Seite weiß ich jetzt auch nicht, ob wirklich was gegen shell_exec spricht. Die Möglichkeit, Terminal-Befehle abzusetzen, hat man von so gut wie jeder Sprache aus. Das ist die PHP-Variante davon, neben den Backticks. Man muss nur aufpassen, dass es für potentielle Angreifer nicht möglich ist, einen beliebigen String auszuführen. Eine Möglichkeit, sich dagegen abzusichern, ist ein begrenztes Set an Funktionen zur Verfügung zu stellen. Der Code der Funktionen liegt dann entsprechend auf dem Ziel-System.
Die Clients senden also den Befehl "restart" an den Server, dieser schaut, ob es ein/e Skript/Funktion/... mit diesem Namen gibt und führt diese aus. Ob das machbar ist, hängt halt davon ab, wie flexibel das Gesamtsystem sein muss.
 
Ist es auch nicht möglich, die SSH-Aufrufe auf einem Server zu bündeln? Also: die 6 Clients senden die Befehle an einen zentralen Rechner im selben Netz (und implementiert ggf. eine Warteliste, die Stück für Stück abgearbeitet wird) und dieser sendet dann die SSH-Aufrufe an den entfernten Server. Dadurch hätte man nur eine Verbindung.

An diese Variante hab ich nicht gedacht. Server stehen uns in der Firma genug zur Verfügung.

Aber was kann denn im schlimmsten Falle passieren, wenn das Limit erreicht wird? Dann wird doch nur der Befehl mit einem Fehler abgebrochen, oder nicht? Je nachdem, wie diese Befehle von den 6 Rechnern aus ausgelöst werden, könnte man den Fehler abfangen und dem Nutzer einen Hinweis ausgeben und die Möglichkeit bieten, den Befehl zu wiederholen, oder es mehrfach versuchen, bis es klappt. Am besten eine Kombination aus beidem, mit begrenzter Anzahl an automatischen Wiederholungen.

Ungerne, da steigen die Mitarbeiter aufs Dach wenn Sie alle paar Minuten Fehlermeldungen weg klicken müssen und evtl. mehrmals die Aktion durch führen. Zudem werden die Befehle in die Datenbank auf dem Server geschickt wo diese ausgeführt werden sollen. Sollte ein Fehler auftauchen, bekommt es der Mitarbeiter nicht mit da eben das CRM sich per Remote nur zur DB Verbindet.

Auf der anderen Seite weiß ich jetzt auch nicht, ob wirklich was gegen shell_exec spricht. Die Möglichkeit, Terminal-Befehle abzusetzen, hat man von so gut wie jeder Sprache aus. Das ist die PHP-Variante davon, neben den Backticks. Man muss nur aufpassen, dass es für potentielle Angreifer nicht möglich ist, einen beliebigen String auszuführen. Eine Möglichkeit, sich dagegen abzusichern, ist ein begrenztes Set an Funktionen zur Verfügung zu stellen. Der Code der Funktionen liegt dann entsprechend auf dem Ziel-System.
Die Clients senden also den Befehl "restart" an den Server, dieser schaut, ob es ein/e Skript/Funktion/... mit diesem Namen gibt und führt diese aus. Ob das machbar ist, hängt halt davon ab, wie flexibel das Gesamtsystem sein muss.

Jetzt wo du es sagst, ist mir was aufgefallen. Das PHP Script welches die Daten aus der DB holt und per shell_exec ausführt, ruht nach jedem Befehl für 10 Sekunden sleep(10)
Evtl. kann ich ja aus deiner Idee und dem vorhanden Script was schönes basteln.
 
Zurück
Oben Unten