[PHP]System Aufruf "ping" geht nicht

Status
Für weitere Antworten geschlossen.

flutsch

Benutzer
Mitglied seit
15. Okt 2008
Beiträge
93
Punkte für Reaktionen
0
Punkte
6
Hi, ich wollte mir heute ein Skript schreiben, mit dem ich Rechner im LAN anpingen kann. Ich habe auf meiner DS408 via ipkg schon einen extra Apache mit PHP installiert, der meistens gut tut. Das Skript wollte mittels system, exec oder derart einfach die binary ping der DS ausführen. Das klappt aber nicht und bringt keinerlei Ausgabe. Folgendes hab' ich probiert:
- alle PHP-Befehle zur externen Programmausführung (system, exec, shell_exec,...)
- ping -c 1 <ip>
- /bin/ping -c 1 <ip>

Alles ohne Ausgabe, der Rückgabewert ist immer 1, den bekomm ich. Der Rechner ist aber definitiv an und erreichbar (per SSH probiert zu pingen).
Andere Befehle, wie ps, ls, ifconfig, usw. frisst er anstandlos.

Habt ihr ne Idee, was das Problem sein kann?

P.S.: Ich möchte keine Flickschustereien, wie einen Socket-Ping via PHP zu bauen.

Dank im Voraus, Flutsch
 

ag_bg

Benutzer
Mitglied seit
19. Jan 2008
Beiträge
1.736
Punkte für Reaktionen
0
Punkte
0

smulg

Benutzer
Mitglied seit
30. Jan 2009
Beiträge
218
Punkte für Reaktionen
0
Punkte
0
Ping per PHP

Ich habe es allerdings nicht ausprobiert/angesehen.
Es kann somit sein, dass es nicht funktioniert (Siehe Post von ag_bg)

Grüße
Smulg
 

flutsch

Benutzer
Mitglied seit
15. Okt 2008
Beiträge
93
Punkte für Reaktionen
0
Punkte
6
Hi danke für eure Antworten.

@ag_bg: Ich habe ja einen extra Apache drauf, u.A. weil eben diese Kommandos wie du sagst gesperrt sind.

@smulg: Danke, aber das funzt auch nicht, die Ausgabe bleibt genauso leer, wie bei mir. Nutzt im übrigen auch den system-call.

Bin für Hilfe immernoch sehr dankbar.
Vielen Dank euch beiden trotzdem.
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Ich hatte da mal ein Skript names DiskSisters geschrieben, welches unter dem sys-Apache läuft. Kannst hier ja mal nachlesen. Idee in PHP ist: exec("ping -c 1 IP-Adresse") .... Kannst ja auch gerne mit meiner WebShell probieren ...

Itari
 

flutsch

Benutzer
Mitglied seit
15. Okt 2008
Beiträge
93
Punkte für Reaktionen
0
Punkte
6
Hi,

danke für den Link. Ich habe jetzt durch Zufall rausgefunden, dass es tatsächlich an den Rechten liegt. Ich lasse meinen Apache als user "apache2" ausführen und den habe ich einfach mal so angelegt. Wenn ich mit jetzt als dieser User einlogge und sudo versuche, nimmt er mir das root passwort nicht an und ping normal ausführen geht wegen der rechte nicht. Meine Frage ist jetzt, wie kann ich ping doch ausführen, ohne den Apache als root laufen zu lassen, was ja IMHO nicht mal geht bzw. als welchen User habt ihr euren Apache laufen?

Danke, Flutsch
 
Zuletzt bearbeitet:

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Also der sys-apache läuft schon als 'root' so, sonst könnte man ja nicht damit den DS Manager laufen lassen. Ich hatte oben ja gesagt, dass ich das Skript als 3rd-party-apps unter dem sys-Apache laufen lass. Alle meine 3rd-party-apps sind so, daher ja auch die Anpassungen ... und daher auch immer gefährlich und möglichst nur lokal usw. usw. usw. (alles schon mal geschrieben ...)

Itari
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Hi,

danke für den Link. Ich habe jetzt durch Zufall rausgefunden, dass es tatsächlich an den Rechten liegt. Ich lasse meinen Apache als user "apache2" ausführen und den habe ich einfach mal so angelegt. Wenn ich mit jetzt als dieser User einlogge und sudo versuche, nimmt er mir das root passwort nicht an und ping normal ausführen geht wegen der rechte nicht. Meine Frage ist jetzt, wie kann ich ping doch ausführen, ohne den Apache als root laufen zu lassen, was ja IMHO nicht mal geht bzw. als welchen User habt ihr euren Apache laufen?

Danke, Flutsch
Also ich kann als "Nicht Root" User den ping Befehl ohne Probleme auf der Konsole absetzen. Müsste also ohne root Rechte möglich sein
 

flutsch

Benutzer
Mitglied seit
15. Okt 2008
Beiträge
93
Punkte für Reaktionen
0
Punkte
6
Ist es aber leider nicht. Ich habe jetzt schon rausgefunden, dass das ping Programm an sich zu öffnen geht, nur der eigtl ping geht nicht. Das soll wohl laut Google daran liegen, dass man als normaler User keine Raw-Sockets öffnen darf - hat jemand ne Idee, wie ich dieses Verhalten ändern kann?
 

flutsch

Benutzer
Mitglied seit
15. Okt 2008
Beiträge
93
Punkte für Reaktionen
0
Punkte
6
Hi Leute,

sorry wegen des neuen Posts, aber es dient IMHO der Übersicht.
Also ich hab es gerade hinbekommen. Die Lösung war so einfach wie Genial.
Ich loggte mich al s"root" ein und machte ein chmod 4777 /bin/ping
Die 4 sorgt wohl dafür, dass das Programm immer mit Root-Rechte ausgeführt wird.

Danke für eure Hilfe.
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Die 4... setzt das "set-user-id-bit", was soviel bedeutet, dass die effektive User-ID des Prozesses gleich der ID des Eigentümers der Datei gesetzt wird. (Die 2... würde das "set-group-id-bit" und die 1... das "sticky-bit" setzen.) Sowas sollte man möglichst vermeiden, weil es ein Sicherheitsrisiko darstellt, aber in diesem Fall ist es überschaubar. Allerdings warum so umständlich; lass dein PHP doch per sys-Apache laufen, dann hast doch schon alles.

Ansonsten ist die Untersagung der raw-sockets wohl ein Feature (ich kenne Unix und Linux-Versionen wo das alles kein Problem ist), welches zum Zwecke der Sicherheit des Linux eingeführt worden ist.

Manchmal stößt man auf diese Art von Konflikten: auf der einen Seite schreien viele nach sicheren Systemen, auf der anderen Seite will man Dinge tun (warum auch immer), die gegen diese Sicherheitsbetrebungen laufen. Der Mensch ist halt nicht zufrieden zu stellen an und für sich :D

Itari
 

flutsch

Benutzer
Mitglied seit
15. Okt 2008
Beiträge
93
Punkte für Reaktionen
0
Punkte
6
*fluch*

Jetzt geht zwar der Ping an sich super, aber sobald man einen Host pingt, der offline ist, hört das Skript nicht mehr auf. Es lädt dann ewig weiter und zeigt keine Ausgabe an. Auf der Konsole selbst funktioniert es gut. Da bricht er nach einiger Zeit ab. Hab auch mal die Execution time angepasst - aber das ignoriert er scheinbar auch. Hab auch mal das Skript von itari genutzt - gleiches Problem.
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
*fluch*

Jetzt geht zwar der Ping an sich super, aber sobald man einen Host pingt, der offline ist, hört das Skript nicht mehr auf. Es lädt dann ewig weiter und zeigt keine Ausgabe an. Auf der Konsole selbst funktioniert es gut. Da bricht er nach einiger Zeit ab. Hab auch mal die Execution time angepasst - aber das ignoriert er scheinbar auch. Hab auch mal das Skript von itari genutzt - gleiches Problem.
Ich denke das liegt daran, dass PHP auf den Return Wert der ping Funktion wartet. Hast du als PHP funktion mal passthru() verwendet? Diese Funktion sollte jeglichen Output von Ping sofort auf den Client Schirm bringen
Das Setzten der max_execution_time wird in deinem Fall nix bringen, weil
Hinweis: Die set_time_limit()-Funktion und die max_execution_time Konfigurationsdirektive beschränken nur die Ausführungszeit des Skripts selbst. Zeit die für Aktivitäten außerhalb des Skripts aufgebracht wird wie z.B. die Ausführung von Systemaufrufen mit system(), Streamoperationen, Datenbankabfragen usw. werden nicht in die Berechnung der Ausführungszeit mit einbezogen.
d.h. sogar mit einer maximalen Laufzeit von 1 Sekunde wird ein Script bei einem hängigen Return eines Aufrufs wie system() solange weiterlaufen, bis system() einen entsprechenden return Wert gesendet hat
 

flutsch

Benutzer
Mitglied seit
15. Okt 2008
Beiträge
93
Punkte für Reaktionen
0
Punkte
6
Hi,

danke für die Antwort - die Sache mit der Execution Time hab ich leider auch grad gelesen gehabt. Also der Passthru Befehl geht auch nicht. Itrai, wie meinst du das mit dem PHP über den Sys-apache laufen lassen? Ich kann Dir nicht ganz folgen, was genau du meinst.
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Ich denke, der ping sollte nach einer gewissen Zeit abbrechen. Das macht er auch (getestet), aber das kann manchmal lange dauern. Deswegen wäre es sinnvoll, eine zusätzliche Option beim Aufruf mitzugeben, z. B. Timeout nach 3 Sekunden:

ping -c 1 -w 3 IP-Adresse

Itari
 

flutsch

Benutzer
Mitglied seit
15. Okt 2008
Beiträge
93
Punkte für Reaktionen
0
Punkte
6
Das hab ich auch schon gemacht, das geht auch alles wunderbar, aber eben nur in der Konsole und nicht mit dem Skript, das lädt unendlich lange weiter (hab's nach 30min abgebrichen).
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Ich habe den ping vorhin mit meiner Webshell (PHP-Skript) ausprobiert und da ging es super gut.

Itari
 

flutsch

Benutzer
Mitglied seit
15. Okt 2008
Beiträge
93
Punkte für Reaktionen
0
Punkte
6
Na okay, also wenn jetzt niemand noch ne brauchbare Idee hat, werd' ich wohl ohne Ping leben müssen.

Danke euch allen trotzdem sehr für die aufgebrachte Mühe.
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Es scheint als würde der ping bei nicht existentem Host nicht korrekt funzen im Zusammenspiel mit PHP.
Als Lösung bliebe dir die Ping Funktion mittels php Socket Funktionen selber zu schreiben. Das dürfte dann aber ziemlich aufwändig werden
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Es scheint als würde der ping bei nicht existentem Host nicht korrekt funzen im Zusammenspiel mit PHP.

Also ich hab den ping mit der Webshell abgesetzt. Auch auf nicht-existente IP-Adressen. Die Web-Shell (Link weiter oben) ist (!) ein PHP-Skript und der ping wird dabei per exec() aufgerufen (allerdings mit return-Value) und damit geht es. Was auch immer jetzt noch für Probleme zu diskutieren wären, am PHP liegt es wohl nicht.

Itari
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat