Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

gugabguerra

Dar TELNET via PHP

Recommended Posts

Pessoal, tenho pouca experiência em programação em geral, mas tenho alguma noção.

 

Deixa eu explicar: Faço Suporte numa operadora de telefonia móvel, onde temos aproximadamente 80 centrais de comutação espalhadas por todo o Brasil. Meu acesso é direto da rede corporativa da empresa à 3 roteadores que faceiam estes equipamentos.

 

Preciso fazer uma interface web que dê telnet nos roteadores e execute uma sequência de comandos.

 

Atualmente utilizo um cliente telnet que acessa os roteadores. Por exemplo, para acessar uma central do Rio de Janeiro a sequência é a seguinte:

-Telnet 10.125.4.14

-após estabelecida a conexão o roteador pede Password e eu escrevo "1234"

-então tenho um prompt já dentro do roteador "rotossrj01ipa> "

-aqui digito o nome da central, por exemplo, "MSC01BRB" (que é um alias para um endereço IP ou X.25)

-aí vem outro prompt perguntando USER, e eu escrevo meu usuário no equipamento MSC01BRB

-em seguida um prompt pedindo PASSWORD, onde digito minha senha no mesmo MSC01BRB

-depois de autenticado vem um prompt onde eu começo a trabalhar, digitando comandos aleatórios

 

Após este último prompt, preciso escrever comandos e preciso que a resposta destes comandos apareçam na tela do browser.

 

Como posso fazer isso? Até agora consigo que os comandos sejam executados, mas não consigo que o resultado apareça na tela.

 

Obrigado galera!

Compartilhar este post


Link para o post
Compartilhar em outros sites

@gugabguerra,

 

Já tentou com fsockopen ?

 

Estabeleça uma conexão com o servidor utilizando a porta 23.

 

Agora, se você puder utilizar SSH, veja esse link: http://forum.imasters.com.br/index.php?/topic/386538-conexao-ssh-com-php-usando-state-design-pattern/

Compartilhar este post


Link para o post
Compartilhar em outros sites

@gugabguerra,

 

Já tentou com fsockopen ?

 

Estabeleça uma conexão com o servidor utilizando a porta 23.

 

Agora, se você puder utilizar SSH, veja esse link: http://forum.imasters.com.br/index.php?/topic/386538-conexao-ssh-com-php-usando-state-design-pattern/

 

Tô usando um script pronto e uma página pra chamar esse script:

 

<?php
/*
PHPTelnet 1.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,$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='10.125.4.14';
		
		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];

				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("\n",$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("/^.*?\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).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;
		}
	}
}

return;
?>

então tenho a página com os comandos, chamando esse script aí em cima

<?php
require_once "PHPTelnet.php";
$telnet = new PHPTelnet();
$result = $telnet->Connect('10.125.4.14','','nokia123');
$telnet->DoCommand('nokia123', $result);
$telnet->DoCommand("10.126.150.97", $result);
$telnet->DoCommand("SYSTEM", $result);
$telnet->DoCommand("SYSTEM", $result);
$telnet->DoCommand("ZNBI:::550310000000:;", $result);
echo $result;
$telnet->DoCommand("ZZZZZZZZ;", $result);
$telnet->Disconnect();
?>

 

o resultado da execução dessa página é o seguinte:

 

ZNBI:::550310000000:; LOADING PROGRAM VERSION 8.2-0 MSCi MSS00LEM 2010-04-12 14:15:02 INTERROGATE OR SEARCH GLOBAL TITLE ANALYSIS DIGITS: 550310000000 RESULT: 00001 ... 00007 /*** ANALYSIS DOES NOT EXIST ***/ COMMAND EXECUTED SCCP GLOBAL TITLE ANALYSIS HANDLING COMMAND < 

quando deveria ser:

 

ZNBI:::550310000000:;
LOADING PROGRAM VERSION 8.2-0

MSCi      MSS00LEM                  2010-04-12  14:16:25

INTERROGATE OR SEARCH GLOBAL TITLE ANALYSIS


DIGITS: 550310000000
RESULT: 00001 ... 00007



/*** ANALYSIS DOES NOT EXIST ***/


COMMAND EXECUTED
Percebe a diferença?

Tá perdendo as quebras de linha... só preciso acertar essa visualização.

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

@gugabguerra,

 

Você está visualizando esse resultado pelo navegador ???

 

Se estiver, esse é o comportamento esperado já que no navegador as quebras de linha não são interpretadas, se você abrir o código fonte da página gerada, você verá que as quebras de linha estão lá.

 

Para que a exibição no navegador seja como no terminal você poderá utilizar a função n2lbr() em conjunto com a tag <pre> </pre> do html.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, outra questão.. as vezes a rede pode ser meio lenta, e nesses casos estou recebendo o seguinte erro:

Fatal error: Maximum execution time of 30 seconds exceeded in C:\htdocs\sistemas\telnet\PHPTelnet.php on line 108

 

A linha 108 é a seguinte:

                        $r.=fread($this->fp,1000);

Alguma idéia?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, outra questão.. as vezes a rede pode ser meio lenta, e nesses casos estou recebendo o seguinte erro:

Fatal error: Maximum execution time of 30 seconds exceeded in C:\htdocs\sistemas\telnet\PHPTelnet.php on line 108

 

A linha 108 é a seguinte:

                        $r.=fread($this->fp,1000);

Alguma idéia?

 

 

 

Pesquisa sobre o max_execution_time no http://br.php.net

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala mixupa,

 

Te achei... hhehehehe.

 

Acho que para o problema de time out podemos usar a função m_settimeout ( resource $conn , int $seconds )....

 

Vamos testar?

 

Abraços...

 

In order to prevent my script timing out (I was processing images which was taking some time) I added this into my loop:

 

set_time_limit(25);

 

This resets the time limit - in this example giving it another 25 seconds to complete the task.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, resgatando esse assunto, tenho outra duvida:

 

Os resultados dos comandos em Telnet sempre são complexos... agora preciso tratá-los e utilizar algumas informações. Por exemplo:

ZNBI:::550310000000:;
LOADING PROGRAM VERSION 8.2-0

MSCi      MSS00LEM                  2010-04-12  14:16:25

INTERROGATE OR SEARCH GLOBAL TITLE ANALYSIS


DIGITS: 550310000000
RESULT: 00001 ... 00007



/*** ANALYSIS DOES NOT EXIST ***/


COMMAND EXECUTED

Esse resultado acima, significa que o digito 550310000000 não existe.

 

Como eu posso por exemplo, procurar a palavra "DIGITS:" e pegar a próxima informação à direita e armazená-la para posteriormente exibi-la? Depois pegar o resultado na última linha antes de COMMAND EXECUTED, onde diz ANALYSIS DOES NOT EXIST... não consigo ver como eu posso "navegar" em tantas linhas de texto.

 

No final das contas, não quero que na página venha o resultado bruto do comando, quero tratar a informação e mostrar na página somente "Digito tal existe ou não existe".

 

Obrigado!

 

Pessoal, ninguém consegue essa? Ainda tô com dificuldade, parado na ultima mensagem... obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.