So, nach einigen Hin- und Her hab ich mir erstmal ein Testaufbau, mit zwei Debian Server, aufgebaut. Hab für SSH einen Public- und Privatschlüssel eingerichtet. Wenn ich nun im root Terminal ssh -N -l <user> -L3306:127.0.0.1:3306 <Server-IP> eingebe, funktioniert auch der SSH Tunnel und php kann auch auf den MySQL Server zugreifen.
Allerding möchte ich gern per php den Tunnel starten, sodass der Tunnel nur dann aufgebaut wird, wenn er gebraucht wird. Also hab ich zwei Zeilen geschrieben, die lauten
Allerdings scheint php den Shell Befehl nicht auszuführen.
shell_exec ist nicht deaktiviert, da andere Befehle, wie z.B. ls funktionieren.
Weiß vielleicht einer, woran das liegen kann und ich dass verändern verändern kann?
Allerding möchte ich gern per php den Tunnel starten, sodass der Tunnel nur dann aufgebaut wird, wenn er gebraucht wird. Also hab ich zwei Zeilen geschrieben, die lauten
Allerdings scheint php den Shell Befehl nicht auszuführen.
shell_exec ist nicht deaktiviert, da andere Befehle, wie z.B. ls funktionieren.
Weiß vielleicht einer, woran das liegen kann und ich dass verändern verändern kann?
...
Sicher, dass das mysql_connect() überhaupt jemals ausgeführt wird? shell_exec() wartet darauf, dass das Programm beendet wird, bevor es das PHP-Script weiterlaufen lässt. Der ssh-Befehl, den du verwendest (und der einige Ungereimtheiten enthält, dazu gleich) beendet aber nie.
Mein Vorschlag:
Unterschiede: Durch -f wird SSH angewiesen, in den Hintergrund zu forken, sodass shell_exec() das Script weiterlaufen lässt. Durch -N weist du SSH an, keinen Befehl auf dem Server auszuführen, weshalb du das sleep 20 sparen kannst (wird eh nicht ausgeführt).
Da du so keine Kontrolle mehr über das laufende ssh hast, solltest du entweder vorher checken, ob der Tunnel schon aufgebaut wurde, oder etwas anderes als shell_exec benutzen und ssh am Ende des Scripts wieder killen (je nachdem, ob das Script mehrfach ausgeführt wird oder als Daemon die ganze Zeit läuft). Schau dir dazu z.B. mal die proc_*()-Funktionen an.
shell-exec() ist blockierend. Sprich: PHP wartet ab, bis der Befehl vollständig durchgelaufen ist, bevor es den nächsten Befehl verarbeitet. Falls dein Skript auf einem *nix-Rechner läuft (also auf so ziemlich allem außer Windows), solltest du dir die POSIX-Threadmanagementbefehle ansehen. Allerdings müssen die PCNTL-Funktionen einkompiliert sein, was sie nicht immer sind.
Alternativ kannst du dir vielleicht mit proc_open() was basteln, allerdings hab' ich auf die Schnelle nichts sinnvolles hingekriegt.
shell-exec() ist blockierend. Sprich: PHP wartet ab, bis der Befehl vollständig durchgelaufen ist, bevor es den nächsten Befehl verarbeitet.
...
dann würde ich aber irgendwann eine Meldung bekommen, dass die zeit vom Script abgelaufen wäre aber es sieht so aus, als würde er den Befehl komplett ignorieren, da ich die Fehlermeldung bekomme, dass er sich nicht zum MySQL Server verbinden kann. Also springt er zur nächsten Zeile des Scriptes. $str ist auch leer, also NULL. Bei einer Fehlermeldung müsste zumindest $str FALSE sein.
shell_exec ist nicht deaktiviert, da andere Befehle, wie z.B. ls funktionieren.
...
Das habe ich schon versucht.
Andere Befehle funktionieren ja.
Das Script wird ja nicht abgewürgt. Wenn er es abwürgen würde, würde er nicht versuchen, eine Verbindung zum MySQL Server aufzubauen, was aber nicht klappt, da Lokal kein MySQL Server läuft und deshalb eine Fehlermeldung ausspuckt.
Wie ich schon sagte, es sieht so aus, als würde er den Befehl in Shell_exec() ignorieren.