Cliente SSH em PHP compatível com MikroTik

Posted on Posted in tutorial

Este pedaço de código, uma função do PHP de cliente SSH, eu desenvolvi para o “authentic” para solucionar o problema de gerenciamento remoto de roteadores (MikroTik em especial) que mesmo tendo APIs de desenvolvimento, não se comportaram tão bem quanto o cliente SSH.

Introdução

Esta função depende do PHP com extensão ssh2 (www.php.net/manual) e a extensão pode ser instalada por PEAR, ou baixada e `phpized` por aqui.

Código

function cfgssh ($host, $login, $pass, $cmnd, $port=22, $filter=FALSE) {
	$headr = array(	'kex'	=>	'diffie-hellman-group1-sha1'	);
	set_time_limit(4);

	if(!$sock = ssh2_connect($host, $port, $headr)) return(FALSE);
	if(!ssh2_fingerprint($sock)) return(FALSE);
	if(!ssh2_auth_password($sock, $login, $pass)) return(FALSE);

	if($rsrc = ssh2_exec($sock, $cmnd)) {
		stream_set_blocking($rsrc, 1);
		$gets = fgets($rsrc);
		if($filter) {
			if($filter=='TUDO') {
				$outs = "";
				while($gets) {
					$outs.= $gets . "\n";
					$gets = fgets($rsrc);
				}	$gets = $outs;
			} else {
				while($gets) {
					if(strstr($gets, $filter)) break;
					else $gets = fgets($rsrc);
				}
			}
		}	fclose($rsrc);
	} else $gets = "command not executed";

	if(strstr($gets, 'bad command name') OR
		strstr($gets, 'expected end of command') OR
		strstr($gets, 'command not executed') OR
		strstr($gets, "sed: can't read") OR
		strstr($gets, 'No such command'))
		return(FALSE);
	if($gets==FALSE) return(TRUE);
	return($gets);
}

Observações

Argumentos

  • host: IP a ser acessado (não pode ser nome de domínio, use “gethostbyname($nomededominio)” para obter o IP);
  • login: Nome do usuário a conectar;
  • pass: Senha do usuário a conectar;
  • cmnd: Comando a ser executado;
  • port: (opcional) Porta de conexão SSH;
  • filter: (opcional) Palavra ou frase a ser exibida a partir do resultado, sem filtro retorna somente a primeira linha, com filtro “TUDO”, retorna todas linhas;

headr

Este cabeçalho é o padrão do RouterOS, ele torna possível acessar qualquer equipamento MikroTik, sem interferir no funcionamento desta função para outros servidores SSH.

fgets

Este é o melhor método para receber conteúdo de um socket SSH (principalmente MikroTik), não adianta tentar socket_read, fread, etc…

bad command name

Toda lista de frases a serem verificadas neste bloco, são frases de erro que fazem a função retornar FALSO, pois quando um comando SSH retorna “ZERO” (0) significa que o comando foi executado com sucesso.

Considerações

O código foi escrito aqui para melhor visualização, e pode conter algum erro de digitação, qualquer coisa corrijam-me.

Qualquer dúvida, implementação, sugestão, sintam-se a vontade.

Este código é 100% de minha autoria e está sob licença GPLv3.

Leave a Reply

Your email address will not be published. Required fields are marked *