Lookinkglass - cisco - ping - traceroute - fsockopen()

Description

Ce code Php a pour but de prendre la main sur un routeur Cisco et de passer des commandes.
Les commandes permetent l'execution d'un ping, d'un traceroute, et de la visualisation de l'occupation mémoire et processeur du routeur.

Une démo du code est disponnible à l'adresse suivante :
http://www.frameip.com/lookingglass/

----------------------
http://www.frameip.com
Pour ceux qui aiment TCPIP
----------------------

Source / Exemple :


<?php

// ********************************************
// Nom du script : lookingglass.php
// Auteur : SebF@frameIP.com.pas.de.spam
// Date de création : 15 mars 2004
// Licence : Ce script est libre de toute utilisation.
//           La seule condition existante est de faire référence au site www.frameip.com afin de respecter le travail d'autrui.
// ********************************************

// ********************************************
// Affichage de l'entête html
// ********************************************
echo
	'
	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

	<html>

	<head>

	<LINK REL="StyleSheet" HREF="../style.css" TYPE="text/css">

	<title>FrameIP, Pour ceux qui aiment IP - Script Lookingglass</title>

	<META http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
	<META NAME="AUTHOR" CONTENT="www.frameip.com">
	<META NAME="COPYRIGHT" CONTENT="Copyright (c) 2003 by framip">
	<META NAME="KEYWORDS" CONTENT="lookingglass, ping, tracert, traceroute, icmp, cisco, bgp, route, show, enable, en, routeur, temps de reponse, test, proc, cpu, mem, hist, conf t, terminal, length">
	<META NAME="DESCRIPTION" CONTENT="Frameip, pour ceux qui aiment IP - Script Lookingglass">
	<META NAME="ROBOTS" CONTENT="INDEX, FOLLOW">
	<META NAME="REVISIT-AFTER" CONTENT="1 DAYS">
	<META NAME="RATING" CONTENT="GENERAL">
	<META NAME="GENERATOR" CONTENT="powered by frameip.com - webmaster@frameip.com">
	
	</head>

	<body>
	';

// *****************************
// Récupération des champs
// *****************************
$ping_ip_demande=$_POST['ipaddress'];
$choix_de_la_commande=$_POST['valeur_bouton'];

// *****************************
// Création de la commande à partir du bouton selectionné
// *****************************
if ($choix_de_la_commande=="bouton_ping")
	$commande_cisco="ping ".$ping_ip_demande."\n";
else if ($choix_de_la_commande=="bouton_traceroute")
	$commande_cisco="traceroute ".$ping_ip_demande."\n";
else if ($choix_de_la_commande=="bouton_cpu")
	$commande_cisco="sh proc cpu hist\n";
else if ($choix_de_la_commande=="bouton_mem")
	$commande_cisco="sh mem stat hist\n";
else
	$commande_cisco="\n";

// **********************************************
// Récupération de la date et heure
// **********************************************
$annee=date("Y");
$mois=date("m");
$jour=date("d");
$heure=date("H");
$minute=date("i");
$seconde=date("s");

// **********************************************
// Récupération de l'IP cliente
// **********************************************
$ip_client=getenv("REMOTE_ADDR");

// **********************************************
// Récupération du Ptr de l'IP cliente
// **********************************************
$ptr=gethostbyaddr("$ip_client");
if ($ptr==$ip_client)
	$ptr="Pas de ptr";

// **********************************************
// Récupération du port TCP source
// **********************************************
$port_source=getenv("REMOTE_PORT");

// **********************************************
// Récupération de l'IP du browser
// **********************************************
$ip_browser=getenv("HTTP_X_FORWARDED_FOR");

// *****************************
// Initiation des variables
// *****************************
$routeur_ip="routeur.frameip.com";
$prompt_cisco="Routeur_SebF>";

// *****************************
// Interdie la saisie d'une ip privée
// *****************************
if (est_ce_une_ip_privee($ping_ip_demande)==true)
	lookingglass_erreur(1);

// *****************************
// Ouverture de la session TCP
// *****************************
$id_de_la_socket=@fsockopen($routeur_ip,23,&$errno,&$errstr,2);

// *****************************
// Valide si l'ouverture de session TCP a eu lieu
// *****************************
if($id_de_la_socket)
	{
	// ********************************************
	// Présentation des résultats
	// ********************************************
	echo 	'
		<p align="center">
			<font size="4" color="#008000">
				<b>
					Lookingglass
				</b>
			</font>
		</p>
		';

	// *****************************
	// Configuration du timeout maximum à 17 pour être à -1 de celui de l'hébergeur
	// *****************************
	@socket_set_timeout($id_de_la_socket,17);

	// *****************************
	// Passage de la socket en mode non bloquant
	// *****************************
	@stream_set_blocking($id_de_la_socket,false);

	// *****************************
	// Reception
	// *****************************
	reception($id_de_la_socket,"Password: ",false);

	// *****************************
	// Envoi du password
	// *****************************
	fputs ($id_de_la_socket, "password\n");

	// *****************************
	// Reception
	// *****************************
	reception($id_de_la_socket,$prompt_cisco,false);

	// *****************************
	// Indication au routeur que le buffer de reception est illimité
	// *****************************
	fputs ($id_de_la_socket, "terminal length 0\n");

	// *****************************
	// Reception
	// *****************************
	reception($id_de_la_socket,$prompt_cisco,false);

	// *****************************
	// Affichage du prompt
	// *****************************
	echo $prompt_cisco;

	// *****************************
	// Envoi de la commande
	// *****************************
	fputs ($id_de_la_socket, $commande_cisco);

	// *****************************
	// Reception
	// *****************************
	reception($id_de_la_socket,$prompt_cisco,true);

	// ********************************************
	// Fin du script général
	// ********************************************
	fin_du_script();
	}
else
	lookingglass_erreur(2);

function reception($id_de_la_socket,$chaine_attendue,$affichage)
  // Argument 1 : $id_de_la_socket est de type SOCKET. Il représente l'id de la socket à analyser.
  // Argument 2 : $chaine_attendue est de type char xx[xx]. Il représente la chaine de caractère indiquant la fin de la reception.
  // Argument 3 : $affichage est de type bool. Il indique si l'echo des caractères reçu doit être affiché.
	{
	// *****************************
	// Initiation des variables
	// *****************************
	$chaine_recue="";
	$tempo="";
	$condition_de_sortie=0;

	// *****************************
	// Boucle de reception
	// *****************************
	while($condition_de_sortie==0)
		{
		// *****************************
		// Valide si la chaine attendue est réceptionnée ou la fin du tampon
		// *****************************
		if (strpos($chaine_recue,$chaine_attendue)!=false||@feof($id_de_la_socket))
			$condition_de_sortie=1;

		// *****************************
		// Reception des données de 1280 octets, mais peu importe dû au mode non bloquant
		// *****************************
		$tempo=@fgets($id_de_la_socket,1024);

		// *****************************
		// Force l'affiche
		// *****************************
		flush();

		// *****************************
		// Remplace le code de retour charriot pour correspondre à la norme html
		// *****************************
		$tempo=str_replace("\n","<br>",$tempo);

		// *****************************
		// Affichage des données recues
		// *****************************
		if ($affichage==true)
			echo $tempo;

		// *****************************
		// Concatenation des donnée recue afin de pourvoir comparer par rapport à la chaine attendue de sortie
		// *****************************
		$chaine_recue.=$tempo;
		}
	}

function est_ce_une_ip_privee($adresse_ip)
  // Argument 1 : $adresse_ip est de type char xx[nn]. Il représente l'adresse IP à comparer.
  // Return     : La valeur retournée est de type bool. Il représente true si l'IP est de privée.
	{
	// ********************************************
	// Validation que la variable $adresse_ip est bien une IP
	// ********************************************
	if (ip2long($adresse_ip)==-1)
		return (false);		// !!!!! Attention je concidère les IP non valide comme une ip non privée !!!!!

	// ********************************************
	// Vérification si l'IP est compris dans le network 10/8
	// ********************************************
	if ( (ip2long($adresse_ip)>=ip2long("10.0.0.0")) && (ip2long($adresse_ip)<=ip2long("10.255.255.255")) )
		return (true);

	// ********************************************
	// Vérification si l'IP est compris dans le network 192.168/16
	// ********************************************
	if ( (ip2long($adresse_ip)>=ip2long("192.168.0.0")) && (ip2long($adresse_ip)<=ip2long("192.168.255.255")) )
		return (true);

	// ********************************************
	// Vérification si l'IP est compris dans le network 172.16/19
	// ********************************************
	if ( (ip2long($adresse_ip)>=ip2long("172.16.0.0")) && (ip2long($adresse_ip)<=ip2long("172.31.255.255")) )
		return (true);

	return (false);
	}

// ********************************************
// Fonction d'affichage de l'erreur de saisie
// ********************************************
function lookingglass_erreur($erreur) // $erreur représente le numéro d'erreur.
	{
	// ********************************************
	// Affichage de titre
	// ********************************************
	echo
		'
		<p align="center">
			<b>
				<font size="5" color="#008000">
					Erreur
				</font>
			</b>
		</p>
		';

	// ********************************************
	// Affichage de l'erreur
	// ********************************************
	echo
		'
		<p>
		';

	// ********************************************
	// Message personnalisé
	// ********************************************
	if ($erreur==1)
		echo 'Désolé, pour des raisons de sécurité, l\'équipe FrameIP ne peut pas vous permettre d\'utiliser les adresses privées.';
	elseif ($erreur==2)
		echo 'Désolé, impossible d\'ouvrir la session TCP à destination du routeur.';
	
	// ********************************************
	// Fin du script général
	// ********************************************
	fin_du_script();
	}

function fin_du_script()
	{
	// ********************************************
	// Affiche de l'Url
	// ********************************************
	echo '
		<p align="right">
			<a target="_blank" href="http://www.frameip.com">
				www.frameip.com
			</a>
		</p>
		';

	// ********************************************
	// Fin de la page Html
	// ********************************************
	echo
		'
		</body>

		</html>
		';

	// ********************************************
	// Fin du script général
	// ********************************************
	exit(0);
	}

?>

Conclusion :


Vennez voir le fonctionnement ici :
http://www.frameip.com/lookingglass/

----------------------
http://www.frameip.com
Pour ceux qui aiment TCPIP
----------------------

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.