WinFuture-Forum.de: Telnet-befehl Per Script Senden - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Telnet-befehl Per Script Senden


#1 Mitglied ist offline   MaDDiN 

  • Gruppe: aktive Mitglieder
  • Beiträge: 997
  • Beigetreten: 18. Juni 03
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Stink Tönis

geschrieben 08. Juli 2008 - 20:54

Hiho Leute,

ich hab da mal ne' Frage:

Kann man mit einem Script Telnet-Befehle an einen Router senden?
Hintergrund ist, dass ich meinen Homeserver gerne per Wake-on-Lan aus dem Ruhezustand holen will.
Mit Puttytel und dem Befehl "wol up MAC" geht das wunderbar.

Da ich aber z.B. auf der Arbeit kein Putty benutzen kann, wollte ich das ganze per Script lösen, da ich mal gehört habe, dass man PHP und Telnet irgendwie zusammen benutzen kann. Allerdings auch so wie ich mir das vorstelle?

Das Script sollte sich beim Router anmelden können (mit Passwort) und den Befehl "wol up MAC" absetzen können.

Machbar, oder nur in meiner kleinen utopischen Traumwelt möglich?

Gruß
Martin
0

Anzeige



#2 Mitglied ist offline   Diewie 

  • Gruppe: aktive Mitglieder
  • Beiträge: 409
  • Beigetreten: 18. Juni 06
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Geisenhausen / München

geschrieben 08. Juli 2008 - 21:03

Für Telnet mit PHP gibt es sogar schon fertige Klassen. Mit dieser hier: http://www.geckotribe.com/php-telnet/ habe ich bereits gearbeitet und sie funktionierte sehr gut.
Sie dürfte auch deinen Anforderungen entsprechen. Ggf. wenn dein Router keinen Username braucht, dann musst du halt den entsprechenden Teil in der Klasse verändern.

Gruß,
Stefan
0

#3 Mitglied ist offline   MaDDiN 

  • Gruppe: aktive Mitglieder
  • Beiträge: 997
  • Beigetreten: 18. Juni 03
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Stink Tönis

geschrieben 09. Juli 2008 - 21:29

Danke, dass sieht schonmal nach etwas aus, was ich gebrauchen kann :D .

Allerdings kann ich mich nicht auf meinen Router einloggen. Bekomme immer die Meldung "Connection failed". Vermutlich weil der Router keinen Usernamen zum einloggen benötigt.

Nur leider bekomme ich es nicht hin, das Script entsprechend umzuschreiben. Löschen der entsprechenden Zeilen, in denen "$user" vorkommt, bringt mich schonmal nicht weiter :D .

Hast Du vielleicht einen Tipp für mich?
0

#4 Mitglied ist offline   Diewie 

  • Gruppe: aktive Mitglieder
  • Beiträge: 409
  • Beigetreten: 18. Juni 06
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Geisenhausen / München

geschrieben 10. Juli 2008 - 15:17

Ich habe zum Debuggen dieses Fehlers kurz das Skript umgeschrieben. Was gibt dieses Skript dir aus? Wie sehen die Prompts vom Router aus?

<?php

$telnet = new PHPTelnet();

$result = $telnet->Connect('127.0.0.1','password');

if ($result == 0) {
	$telnet->DoCommand('ls', $result);
	echo $result;
	$telnet->Disconnect();
}

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,$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,23)) {
				fputs($this->fp,$this->conn1);
				$this->Sleep();
				
				fputs($this->fp,$this->conn2);
				$this->Sleep();
				$this->GetResponse($r);
				$r=explode("\n",$r);
				$this->loginprompt=$r[count($r)-1];
				
				echo "\nDEBBUG: Loginprompt erkannt: ".$r[count($r)-1]; //DEBUG
				echo "\n";

				fputs($this->fp,"$pass\r");
				if ($this->use_usleep) usleep($this->loginsleeptime);
				else sleep(1);
				$this->GetResponse($r);
				$r=explode("\n",$r);
				
				if (($r[count($r)-1]=='')||($this->loginprompt==$r[count($r)-1])) {
					echo "\nDEBBUG: Login-Fehler, Prompt erkannt: ".$r[count($r)-1]; //DEBUG
					$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("/^.*?\n(.*)\n[^\n]*$/","$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).c
hr(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).c
hr(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;
		}
	}
}

?>


Gruß,
Stefan
0

#5 Mitglied ist offline   prunkster 

  • Gruppe: aktive Mitglieder
  • Beiträge: 282
  • Beigetreten: 22. Mai 08
  • Reputation: 5
  • Geschlecht:Männlich

geschrieben 10. Juli 2008 - 15:47

vllt benutzt der router den benutzernamen administrator... ist zumindest bei vielen fritzboxen und deren nachbauten so...
Eingefügtes Bild <--- Workstation@Home

My Blog: hier
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0