Telnet mit PHP

Hi,

da ich eine komfortable Möglichkeit gesucht habe, telnet-Anweisungen mit IPS auszuführen, bin ich hierauf gestoßen.
Damit ist es mit PHP möglich, genauso wie mit echtem telnet zu handlen.

Befehle ausführen mit der Zeile:

$telnet->DoCommand('Kommando', $result);

…super easy :wink:
Ich habe die Zeile:

$result = $telnet->Connect('www.somewhere.com','login name','password');

zu

$result = $telnet->Connect($server,$port,$loginname,$passwort);

erweitert und das Script im Anhang dementsprechend abgeändert, sodass man auch Ports außerhalb des telnet-Standardports (23) übergeben kann.
In meinem dringenden Fall war es Port 9090 für die Squeezebox.

Ach ja, ganz vergessen…
Das Script im Anhang, muss dazu in den „IPS-Ordner\scripts“ entpackt werden.

PHPTelnet.zip (1.45 KB)

Hallo,

wenn auch länger her…
Ich möchte per Telnet Änderungen in der Telefonanlage machen. Habe das Scipt aus dem Anhang von nancilla benutzt. Nun möchte ich ohne Login die Zeichenfolge „ENTER83201121ENTER“ absetzen. Ich laufe immer auf einen Fehler:

Fatal error: Maximum execution time of 30 seconds exceeded in [Scripte\PHPTelnet\PHPTelnet] on line 108

<?

require_once "40561.ips.php";

$befehl = chr(13).chr(42).chr(56).chr(51).chr(50).chr(48).chr(42).chr(49).chr(49).chr(50).chr(48).chr(13);

$telnet = new PHPTelnet();

// if the first argument to Connect is blank,
// PHPTelnet will connect to the local host via 127.0.0.1
$result = $telnet->Connect('192.168.2.53',23,'','');
echo $result;
if ($result == 0) {
$telnet->DoCommand($befehl, $result);
// NOTE: $result may contain newlines
echo $result;
//$telnet->DoCommand('another command', $result);
//echo $result;
// say Disconnect(0); to break the connection without explicitly logging out
$telnet->Disconnect();
}


?>

Das der Inhalt des Anhangs:

<?php
/*
PHPTelnet 1.1
by Antone Roundy
adapted from code found on the PHP website
public domain
*/

class PHPTelnet {
	var $show_connect_error=1;

	var $use_usleep=0;	// change to 1 for faster execution
		// don't change to 1 on Windows servers unless you have PHP 5
	var $sleeptime=125000;
	var $loginsleeptime=1000000;

	var $fp=NULL;
	var $loginprompt;

	var $conn1;
	var $conn2;

	/*
	0 = success
	1 = couldn't open network connection
	2 = unknown host
	3 = login failed
	4 = PHP version too low
	*/
	function Connect($server,$port,$user,$pass) {
		$rv=0;
		$vers=explode('.',PHP_VERSION);
		$needvers=array(4,3,0);
		$j=count($vers);
		$k=count($needvers);
		if ($k<$j) $j=$k;
		for ($i=0;$i<$j;$i++) {
			if (($vers[$i]+0)>$needvers[$i]) break;
			if (($vers[$i]+0)<$needvers[$i]) {
				$this->ConnectError(4);
				return 4;
			}
		}

		$this->Disconnect();

		if (strlen($server)) {
			if (preg_match('/[^0-9.]/',$server)) {
				$ip=gethostbyname($server);
				if ($ip==$server) {
					$ip='';
					$rv=2;
				}
			} else $ip=$server;
		} else $ip='127.0.0.1';

		if (strlen($ip)) {
			if ($this->fp=fsockopen($ip,$port)) {
				fputs($this->fp,$this->conn1);
				$this->Sleep();

				fputs($this->fp,$this->conn2);
				$this->Sleep();
				$this->GetResponse($r);
				$r=explode("
",$r);
				$this->loginprompt=$r[count($r)-1];

				fputs($this->fp,"$user\r");
				$this->Sleep();

				fputs($this->fp,"$pass\r");
				if ($this->use_usleep) usleep($this->loginsleeptime);
				else sleep(1);
				$this->GetResponse($r);
				$r=explode("
",$r);
				if (($r[count($r)-1]=='')||($this->loginprompt==$r[count($r)-1])) {
					$rv=3;
					$this->Disconnect();
				}
			} else $rv=1;
		}

		if ($rv) $this->ConnectError($rv);
		return $rv;
	}

	function Disconnect($exit=1) {
		if ($this->fp) {
			if ($exit) $this->DoCommand('exit',$junk);
			fclose($this->fp);
			$this->fp=NULL;
		}
	}

	function DoCommand($c,&$r) {
		if ($this->fp) {
			fputs($this->fp,"$c\r");
			$this->Sleep();
			$this->GetResponse($r);
			$r=preg_replace("/^.*?
(.*)
[^
]*$/","$1",$r);
		}
		return $this->fp?1:0;
	}

	function GetResponse(&$r) {
		$r='';
		do {
			$r.=fread($this->fp,1000);
			$s=socket_get_status($this->fp);
		} while ($s['unread_bytes']);
	}

	function Sleep() {
		if ($this->use_usleep) usleep($this->sleeptime);
		else sleep(1);
	}

	function PHPTelnet() {
		$this->conn1=chr(0xFF).chr(0xFB).chr(0x1F).chr(0xFF).chr(0xFB).
			chr(0x20).chr(0xFF).chr(0xFB).chr(0x18).chr(0xFF).chr(0xFB).
			chr(0x27).chr(0xFF).chr(0xFD).chr(0x01).chr(0xFF).chr(0xFB).
			chr(0x03).chr(0xFF).chr(0xFD).chr(0x03).chr(0xFF).chr(0xFC).
			chr(0x23).chr(0xFF).chr(0xFC).chr(0x24).chr(0xFF).chr(0xFA).
			chr(0x1F).chr(0x00).chr(0x50).chr(0x00).chr(0x18).chr(0xFF).
			chr(0xF0).chr(0xFF).chr(0xFA).chr(0x20).chr(0x00).chr(0x33).
			chr(0x38).chr(0x34).chr(0x30).chr(0x30).chr(0x2C).chr(0x33).
			chr(0x38).chr(0x34).chr(0x30).chr(0x30).chr(0xFF).chr(0xF0).
			chr(0xFF).chr(0xFA).chr(0x27).chr(0x00).chr(0xFF).chr(0xF0).
			chr(0xFF).chr(0xFA).chr(0x18).chr(0x00).chr(0x58).chr(0x54).
			chr(0x45).chr(0x52).chr(0x4D).chr(0xFF).chr(0xF0);
		$this->conn2=chr(0xFF).chr(0xFC).chr(0x01).chr(0xFF).chr(0xFC).
			chr(0x22).chr(0xFF).chr(0xFE).chr(0x05).chr(0xFF).chr(0xFC).chr(0x21);
	}

	function ConnectError($num) {
		if ($this->show_connect_error) switch ($num) {
		case 1: echo '<br />[PHP Telnet] <a href="http://www.geckotribe.com/php-telnet/errors/fsockopen.php">Connect failed: Unable to open network connection</a><br />'; break;
		case 2: echo '<br />[PHP Telnet] <a href="http://www.geckotribe.com/php-telnet/errors/unknown-host.php">Connect failed: Unknown host</a><br />'; break;
		case 3: echo '<br />[PHP Telnet] <a href="http://www.geckotribe.com/php-telnet/errors/login.php">Connect failed: Login failed</a><br />'; break;
		case 4: echo '<br />[PHP Telnet] <a href="http://www.geckotribe.com/php-telnet/errors/php-version.php">Connect failed: Your server\'s PHP version is too low for PHP Telnet</a><br />'; break;
		}
	}
}
?>

Habe ich einen Denkfehler? Zumindest wird doch syntaktisch nicht reklamiert.

Hallo Andreas,

ich habe das damals nur kurzzeitig benutzt, weil zu unperformant war.

Warum legst du dir nicht einen Clientsocket (IP 192.168.2.53, Port 23) an und sendest die Befehle mit

CSCK_SendText(ID_Clientsocket, '$befehl');

?

Hallo,

schnell mal in der Halbzeitpause:

das habe ich in meinem fünften Versuch auch getan. Lt. Debug geht auch alles gut. Ich habe nur eine Antwort vermisst. Jetzt habe ich die Anlage noch mal neugestartet und nun läuft es! Zumindest mit einem Versuch.

Script etwa so:

<?


$dst = "192.168.2.53"; # IP der Anlage
$socket = 43270 /*[Client Socket - Telnet Anlage]*/;


error_reporting(0);

$ping = Sys_Ping($dst, 1000);
if ($ping ==false)
	{
   echo "Anlage ist nicht erreichbar!";
   die();
   }

$status = IPS_GetInstance($socket );
if ($status['InstanceStatus']>102)
	{
   CSCK_SetOpen($socket , true);
   IPS_ApplyChanges($socket );
   $status = IPS_GetInstance($socket );
   if ($status['InstanceStatus']>102)
		{
      echo "Anlage ist nicht erreichbar!";
      die();
      }
    }

CSCK_SetOpen($socket , true);

//$befehl = chr(13).chr(42).chr(56).chr(51).chr(50).chr(48).chr(42).chr(49).chr(49).chr(50).chr(49).chr(13);

CSCK_SendText($socket ,chr(13));
IPS_Sleep(1000);
CSCK_SendText($socket ,chr(42));
IPS_Sleep(1000);
CSCK_SendText($socket ,chr(56));
IPS_Sleep(1000);
CSCK_SendText($socket ,chr(51));
IPS_Sleep(1000);
CSCK_SendText($socket ,chr(50));
IPS_Sleep(1000);
CSCK_SendText($socket ,chr(48));
IPS_Sleep(1000);
CSCK_SendText($socket ,chr(42));
IPS_Sleep(1000);
CSCK_SendText($socket ,chr(49));
IPS_Sleep(1000);
CSCK_SendText($socket ,chr(49));
IPS_Sleep(1000);
CSCK_SendText($socket ,chr(50));
IPS_Sleep(1000);
CSCK_SendText($socket ,chr(49));
IPS_Sleep(1000);
CSCK_SendText($socket ,chr(13));
IPS_Sleep(1000);

CSCK_SetOpen($socket , false);

?>

Danke. Die Frage, die mich bewegt, warum geht das mit Deinem ersteren Vorschlag nicht? Habe ich auch schon nach Reset versucht. Trotzdem erstmal danke.

Liveticker is on;)

Ich habe nur eine Antwort vermisst.

Registervariable einsetzen und auswerten.

Die Frage, die mich bewegt, warum geht das mit Deinem ersteren Vorschlag nicht? Habe ich auch schon nach Reset versucht.

Musst du jedes Zeichen einzeln befehlen und auf Antwort warten um das nächste abzusetzen?
Das geht aus deiner ersten Frage nicht hervor.
Aber dann brauchst du die Auswertung/Antwort über die Registervariable, bevor du zwischen jedem Sende-Befehl eine Sekunde Wartezeit setzt.

Hallo ich würe diesen Fred hier gerne mal wieder etwas beleben.
Ich habe eine Software auf einer Fritz-Box laufen. DIese möchte ich jetzt per telnet ansteuern und Werte zurück bekommen.

Ich brauch hier eure Hilfe.

Was habe ich bis jetzt :

Socket zur Fritzbox : i.O.

Habe das letzte Skript genommen in die I/O Instanz angelegt und angepasst.
Socket öffent sich auch.
Wie kann ich jetzt „Text“ senden bzw. empfangen ?

Danke für die Hilfe …

Siehe u.a. -> http://www.ip-symcon.de/forum/f52/newbie-fuer-newbies-register-variablen-10754/#post89045

Und noch ein Fritzsachen…
http://www.ip-symcon.de/forum/f53/scripts-fuer-fritzbox-repeater-fritzfon-ab-v2-5-php-5-4-x-16190/

ich bekomme immer login falsch aber ich kann den Fehler nicht Finden

:smiley: Erklärbär :smiley:

Folgendes moechte ich umsetzten .

eine Telnet Verbindung aufbauen ,dann ein Skript aus fuehren welches die Webcam auf meiner Coolstream einbindet.

wenn ich das uber die Konsole ausfuehre klappt das auch.


Trying 192.168.178.155...
Connected to coolstream.fritz.box.
Escape character is '^]'.

coolstream login: root
Password: 
/var # /var/plugins/tuxwet/tuxwetter 'PICTURE=Haustür Bild,http://192.168.178.34:82/snapshot.cgi?user=xxx&pwd=xxx''

es wird auf dem TV direkt das @Plugin Tuxwetter gestartet welches dann Bilder anzeigen kann.

???

wie fange ich jetzt an

Client Socket anlegen ? auf die Ip 192.168.178.155:23 habe ich.

aber wie muss ich jetzt das skript anlegen welches die Telnet Befehle beinhaltet ?

So Fehler eliminiert


$fp=pfsockopen("192.168.178.155",23, $errstr, $errno, 5);

{
fputs($fp,"xxx\r");
sleep(2);
fputs($fp,"xxx\r");
sleep(2);
fputs($fp,"/var/plugins/tuxwet/tuxwetter 'PICTURE=Haustuer,|JPG30|http://192.168.178.34:82/snapshot.cgi?user=xxx&pwd=xxx'"."
");
sleep(5);



}

Jetzt schaltet bei Bewegungserkennung das TV Bild auf die Webcam

Heizungssteuerung \17 Plugwise Steckdosen \ 2x Coolstream Neo \ 3x Squeezebox Boom \ Webcam\ Roomba 770 mit Wlan \conradt.me

== http://www.solitairechamp.net/ ==