thaddaeus93
Goto Top

SSH-Verbindung mit PHP funktioniert (teilweise) nicht..

Hallo zusammen,

zunächst habe ich folgendes vor:
Ich möchte über PHP/SSH zwei WLAN-Access-Points ansteuern und auf diesen SSH-Befehle ausführen (z.B. zum Ein/Ausschalten einer SSID). Ich habe einen Debian-Server (6.0) mit Apache2/PHP5 und libssh2 installiert.

Wenn ich auf den eigenen Server über SSH zugreife (über das PHP-Script), dann funktioniert es tadellos. Wenn ich jedoch den Access-Point ansteuern möchte, lädt die Seite ewig und es tut sich nichts...

Hier der Code des PHP-Script's:

<?php

// Bitte aendern passen Sie die folgenden Variablen an:
$server['ip'] = "172.22.31.149"; 	// IP des Servers  
$server['sshport'] = 22;   		// SSH Port (Standart: 22)  
$server['user'] = "admin"; 		// Benutzername  
$server['pw'] = "admin"; 		// Passwort des Benutzers  

$command = "get ssid"; 			// Dieser Befehl wird auf dem SSH Server ausgeführt!  

// ab hier wenn möglich nichts mehr veraendern
if($ssh = ssh2_connect($server['ip'], $server['sshport'] ))   
{
	if(ssh2_auth_password($ssh, $server['user'], $server['pw']))   
	{
		echo("Verbindung und Anmeldung erfolgreich!<br /><br />");  
		$stream = ssh2_exec($ssh, $command);
		stream_set_blocking($stream, true);
		$data = '';  
		while($buffer = fread($stream, 4096)) 
		{
			$data .= $buffer;
		}
		fclose($stream);
		print $data;
	 }
	 else 
	 {
		 echo "Fehler: Es konnte keine Verbindung zum ausgew&auml;hlten Server hergestellt werden. Benutzername oder Passwort falsch.";  
	 }
}
else 
{
echo "Fehler: Es konnte keine Verbindung zum ausgew&auml;hlten Server hergestellt werden. Server-IP oder SSH Port falsch.";  
}

?>

Die Verbindung über PUTTY zum AccessPoint (bzw. zu beiden Access-Points) geht einwandfrei - nur leider nicht über das Script ;-(
Ich vermute den Fehler fast nicht direkt bei dem Script, sondern eher bei SSH..

Vielen Dank schon mal für Eure Hilfe!

Content-ID: 258575

Url: https://administrator.de/contentid/258575

Ausgedruckt am: 27.11.2024 um 03:11 Uhr

colinardo
colinardo 28.12.2014 aktualisiert um 17:52:54 Uhr
Goto Top
Hallo thaddaeus93,
versuch mal bei ssh_connect die entsprechenden Methoden für den
Schlüsselaustausch explizit mitzugeben:
http://php.net/manual/de/function.ssh2-connect.php

Die für deinen angesprochenen Accesspoint ausgehandelten Parameter kannst du ja im Connection-Status der Putty-Verbindung ablesen. Eventuell unterstützen die APs hier nur Protokolle die libssh2 nicht unterstützt, oder es gibt da ein Kompatibilitätsproblem.

Um was für APs handelt es sich denn überhaupt ?

Und auch mal das ErrorReporting von PHP im Script aktivieren.
error_reporting(E_ALL);

Wenn's ganz hart kommt auch mal Wireshark auf dem Debian mitlaufen lassen.

Grüße Uwe
thaddaeus93
thaddaeus93 28.12.2014 um 20:12:50 Uhr
Goto Top
Hallo colinardo,

vielen Dank für deine Tipps!

Ich habe zunächst die Zeile für den Verbindungsaufbau geändert - laut php.net sollte libssh2 alle gängigen Verfahren unterstützen:

...
$method = array("kex");  

// ab hier wenn möglich nichts mehr veraendern
if($ssh = ssh2_connect($server['ip'], $server['sshport'], $method))   
{
	if(ssh2_auth_password($ssh, $server['user'], $server['pw']))   
....

Auffällig ist, dass der AccessPoint ein anderes Verfahren benutzt, als der Linux-Server:

AccessPoint:
b6c5e006e3c5474dbebc3127cf4e1dec

Server:
65ce630d284ce6c3f7b34a9d2f69f8ed

Das Einschalten des Error-Reportings hat leider keine weiteren Erkentnisse gebracht - der Server gibt gar keine Meldung zurück (Scheinbar eine Fehlfunktion?)

Gruß
Frank
colinardo
colinardo 28.12.2014 aktualisiert um 22:14:37 Uhr
Goto Top
$method = array("kex"); 
das ist hier aber falsch umgesetzt. Les die Seite nochmal genauer face-wink

Häng dich mal mit Wireshark in die Leitung und studiere die Logs des AP und die Syslogs des Debian-Systems.

Grüße Uwe
thaddaeus93
thaddaeus93 28.12.2014 um 22:15:29 Uhr
Goto Top
Hallo Uwe,

die Methode habe ich jetzt nochmal überarbeitet (.....)

......
$methods = array(
'kex' => 'diffie-hellman-group1-sha1',  
'hostkey' => 'ssh-dss');  

// ab hier wenn möglich nichts mehr veraendern
if($ssh = ssh2_connect($server['ip'], $server['sshport'], $methods))   
....

Im Log des AP's konnte ich leider gar nichts finden (Das Logfile ist auch nicht sehr "üppig")..
Folgendes ist mir aufgefallen:

Sobald ich mehrfach versuche, über das nicht funktionierende PHP-Script eine Verbindung zum AP aufzubauen, "blockiert" der Access-Point. Ich komme dann nichtmal mehr über PUTTY auf den AP ("Connection refused").

Nach einer Weile geht es dann wieder...
Wegen Wireshark muss ich mal schauen face-wink

Gruß
Frank
colinardo
colinardo 28.12.2014 aktualisiert um 22:18:14 Uhr
Goto Top
Noch zur Info: Folgende pur in PHP geschriebene SSH Bibliothek könnte was für dich sein:
http://phpseclib.sourceforge.net/

Mit der Bibliothek hatte ich hier bisher keinerlei Probleme. Und der unschlagbare Vorteil, du benötigst keinerlei Modul für den Apache, das Einbinden der PHP-Datei genügt.
colinardo
colinardo 28.12.2014 aktualisiert um 22:29:21 Uhr
Goto Top
Sobald ich mehrfach versuche, über das nicht funktionierende PHP-Script eine Verbindung zum AP aufzubauen, "blockiert" der Access-Point. Ich komme dann nichtmal mehr über PUTTY auf den AP ("Connection refused").
Das wird dann die Firewall bzw. ein Sicherheitsmechanissmus des APs sein, oder die maximale Anzahl an offenen nicht geschlossen Sessions ist erreicht, dann blockt der jeden weiteren Verbindungsversuch bis die halb offenen Sessions durch ein Timeout geschlossen werden.

Um welche APs handelt es sich wenn man zum zweiten mal Fragen darf ? face-smile
thaddaeus93
thaddaeus93 28.12.2014 um 22:42:48 Uhr
Goto Top
Danke für den Tipp!

Leider funktioniert es noch so gar nicht.. Aber da werde ich morgen nochmal schauen face-wink
thaddaeus93
thaddaeus93 28.12.2014 um 22:43:57 Uhr
Goto Top
Okay, ja sowas hatte ich mir schon gedacht...
Es sind zwei D-Link DAP-2553 face-smile
thaddaeus93
thaddaeus93 28.12.2014 um 22:44:57 Uhr
Goto Top
Ein Cisco-Switch (SG300 28p) habe ich auch noch zum testen - hier verhält es sich aber genauso, wie bei den Access-Points...
stefaan
stefaan 28.12.2014 um 23:29:15 Uhr
Goto Top
Servus,

alternativ Telnet, wenn das Netz vertrauenswürdig ist.
Oder du baust den Weg übers Webinterface nach (HTTP-GETs und POSTs).

Grüße, Stefan
colinardo
colinardo 28.12.2014, aktualisiert am 29.12.2014 um 09:31:45 Uhr
Goto Top
Zitat von @thaddaeus93:

Ein Cisco-Switch (SG300 28p) habe ich auch noch zum testen - hier verhält es sich aber genauso, wie bei den Access-Points...
Das hört sich jetzt aber eher nach einer fehlerhaft konfigurierten Firewall auf dem Debian-System an wenn du nur mit dem lokal laufenden SSH-Daemon connecten kannst und mit sonst keinem anderen SSH-Server.
Also Firewall erst mal komplett ausschalten, und mal eine andere Kiste mit einem Testlinux mit SSH aufsetzen mit dem du dich verbindest.

Sind irgendwelche anderen Devices/Switches/Firewalls zwischen dem Debian-System und den APs die Einfluss auf die Verbindung haben könnten ?

Und hast du schon mal mit fsockopen() versucht dich auf Port 22 zu verbinden ?
Wenn das nämlich nicht klappt hast du ein Netzwerkproblem!
thaddaeus93
thaddaeus93 29.12.2014 um 10:06:15 Uhr
Goto Top
Hallo Stefan,

ja, das wäre auch eine Möglichkeit.. Leider unterstützt das der AP soweit ich weiß nicht & SSH ist ja auch sicherer face-wink

Das mit dem Webinterface würde bei den Access-Points gut klappen - nicht aber bei dem Cisco-Switch..

Gruß
Frank
thaddaeus93
thaddaeus93 29.12.2014 um 10:12:57 Uhr
Goto Top
Hallo Uwe,

ich habe noch einen anderen Debian-Server (Asterisk) am Laufen - mit dem konnte ich mich ohne Probleme verbinden und "uname -r" ausführen, dann hat er die Kernel-Version angezeigt. Scheint also eher kein Firewall-Problem zu sein..

Gruß
Frank
colinardo
colinardo 29.12.2014 aktualisiert um 14:25:22 Uhr
Goto Top
Dann häng mal an die Befehle einen Zeilenumbruch an \n eventuell hängt ja nur die Befehlszeile und wartet auf einen zusätzlichen Return - normalerweise sollte das ja die Bibliothek automatisch machen, aber probieren kann man es ja mal.

Ansonsten wie gesagt Wireshark ...der sollte Licht ins Dunkel bringen.

Eine erfolgreiche SSH2-Verbindung sieh da bspw. folgendermaßen aus:

97e3ddd6c436af4bb1b30c50395b1c29
thaddaeus93
thaddaeus93 30.12.2014 um 11:37:50 Uhr
Goto Top
Hallo Uwe,

das mit der Bibliothek war ein sehr guter Tipp! (ist auch wesentlich einfacher als über libssh2)..

Ich habe mal probeweise das Script auf einem XAMPP-Server (unter Windows Server 2008) laufen lassen - uns siehe da: Die SSH-Verbindung steht!

7598d7c90d20723bf20c8862ded654a1

Nur leider gibt der AccessPoint auf meinen Befehl "get ssid" nichts zurück..
Aber das "WAP->" kommt definitiv vom AccessPoint.. Wenn ich ihn über Putty aufrufe, meldet er sich auch mit "WAP->"..

Ich vermute fast einen "Denkfehler" bei der ganzen Sache..

Hier mein "neuer" Quellcode:
<?php
include('Net/SSH2.php');  
echo("<h2>SSH-Verbindung zum AccessPoint</h2><br />");  
$ssh = new Net_SSH2('172.22.31.149');  
if (!$ssh->login('admin', 'Test123')) {  
    exit('Login Failed');  
}

function packet_handler($str)
{
    echo $str;
}

$ssh->exec('get ssid', 'packet_handler');  

?>
colinardo
colinardo 30.12.2014 aktualisiert um 12:10:39 Uhr
Goto Top
Schon den den Output-Buffer "geflusht"
http://stackoverflow.com/questions/23409125/phpseclib-real-time-output- ...
Scheint als wäre der Befehl den du absetzt das Hauptproblem, der scheint sich nicht richtig zu beenden.