Źródło:
Komentarze (0)
| | źródło pochodzi od: sympozjon Opis: Klasa obsługuje połączenia z telnetem. Napisana przez Francuza i z francuskimi komentarzami (lol), ale przejrzysta i logiczna. Język: php |
<?
/*
Fichier : scriptTelnet.inc (fichier d'include dźclarant la cl
asse ScriptTelnet)
Role de la cl
asse : Gźrer un script se dźroulant via une socket telnet
Exemple d'utilisation, ne tenant p
as compte des codes retour des mźthodes :
$script = new ScriptTelnet;
$script->
setHote(
"unhote.quelquepart.fr");
$script->
setPrompt(
">");
$script->
connecter();
$script->
lireJusqua(
"ogin: ");
$script->
ecrire(
"Jojo"));
$script->
lireJusqua(
"word: ");
$script->
ecrire(
"monpasse");
$script->
attendrePrompt();
$script->
ecrire(
"ps");
$script->
attendrePrompt();
$script->
deconnecter();
Auteur : Marc Ennaji
*/
define (
"TELNET_ERREUR",
0);
define (
"TELNET_OK",
1);
define (
"TELNET_DEMANDE_CONFIRMATION",
2);
define (
"LIBELLE_CONFIRMATION", "[confirm]");
Cl
ass ScriptTelnet
{
var
$socket = NULL;
var
$hote = "";
var
$port =
"23";
var
$libelleErreur = "";
var
$codeErreur = "";
var
$prompt =
"$ ";
var
$log = NULL;
// handle de fichier
var
$repertoireLog= "";
var
$nomFichierLog = "";
var
$test;
//------------------------------------------------------------------------
function connecter()
{
$this->socket =
fsockopen(
$this->hote,
$this->port);
if (!
$this->socket)
{
$this->libelleErreur =
"Impossible d'etablir la connexion telnet : " . strerror ($this->socket) . "n";
return TELNET_ERREUR;
}
socket_set_timeout(
$this->socket,
5,
0);
return TELNET_OK;
}
//------------------------------------------------------------------------
function lireJusqua(
$chaine)
{
$NULL =
chr(
0);
$IAC =
chr(
255);
$buf = '';
if (!
$this->socket)
{
$this->libelleErreur =
"socket telnet non ouverte";
return TELNET_ERREUR;
}
while (
1)
{
$c =
$this->
getc();
if (
$c === false)
// plus de caracteres a lire sur la socket
{
if (
$this->
contientErreur(
$buf))
return TELNET_ERREUR;
$this->libelleErreur =
" La chaine attendue : '" . $chaine . "', n'a pas źtź trouvźe dans les donnźes reŻues : '" . $buf . "'" ;
$this->
logger(
$this->libelleErreur);
return TELNET_ERREUR;
}
if (
$c ==
$NULL ||
$c == "
continue;
if (
$c ==
$IAC)
// Interpreted As Command
{
$c =
$this->
getc();
if (
$c !=
$IAC)
// car le 'vrai' caractere 255 est doublź pour le differencier du IAC
if (!
$this->
negocierOptionTelnet(
$c))
return TELNET_ERREUR;
else
continue;
}
$buf .=
$c;
// indiquer ŕ l'utilisateur de la classe qu'il a une demande de confirmation
if (
substr(
$buf,strlen(
$buf)-
strlen(LIBELLE_CONFIRMATION)) == LIBELLE_CONFIRMATION)
{
$this->
logger(
$this->getDernieresLignes(
$buf));
return TELNET_DEMANDE_CONFIRMATION;
}
if ((
substr(
$buf,strlen(
$buf)-
strlen(
$chaine))) ==
$chaine)
{
// on a trouve la chaine attendue
$this->
logger(
$this->getDernieresLignes(
$buf));
if (
$this->
contientErreur(
$buf))
return TELNET_ERREUR;
else
return TELNET_OK;
}
}
}
//------------------------------------------------------------------------
function getc()
{
return fgetc(
$this->socket);
}
//------------------------------------------------------------------------
function negocierOptionTelnet(
$commande)
{
// on negocie des options minimales
$IAC =
chr(
255);
$DONT =
chr(
254);
$DO =
chr(
253);
$WONT =
chr(
252);
$WILL =
chr(
251);
if ((
$commande ==
$DO) || (
$commande ==
$DONT))
{
$opt =
$this->
getc();
//echo "wont ".ord($opt)."n";
fwrite(
$this->socket,
$IAC.
$WONT.
$opt);
}
else if ((
$commande ==
$WILL) || (
$commande ==
$WONT))
{
$opt =
fgetc(
$this->socket);
//echo "dont ".ord($opt)."n";
fwrite(
$this->socket,
$IAC.
$DONT.
$opt);
}
else
{
$this->libelleErreur =
"Erreur : commande inconnue ".ord($commande)."n";
return false;
}
return true;
}
//------------------------------------------------------------------------
function ecrire(
$buffer,
$valeurLoggee = "",
$ajouterfinLigne = true)
{
if (!
$this->socket)
{
$this->libelleErreur =
"socket non ouverte";
return TELNET_ERREUR;
}
if (
$ajouterfinLigne)
$buffer .=
"n";
if (
fwrite(
$this->socket,
$buffer) <
0)
{
$this->libelleErreur =
"erreur d'ecriture sur la socket telnet";
return TELNET_ERREUR;
}
if (
$valeurLoggee != "")
// cacher les valeurs confidentielles dans la log (mots de passe...)
$buffer =
$valeurLoggee .
"n";
if (!
$ajouterfinLigne)
// dans la log (mais pas sur la socket), rajouter tout de meme le caractere de fin de ligne
$buffer .=
"n";
$this->
logger(
"> " .
$buffer);
return TELNET_OK;
}
//------------------------------------------------------------------------
function deconnecter()
{
if (
$this->socket)
{
if (!
fclose(
$this->socket))
{
$this->libelleErreur =
"erreur a la fermeture de la socket telnet";
return TELNET_ERREUR;
}
$this->socket = NULL;
}
$this->
setLog(false,"");
return TELNET_OK;
}
//------------------------------------------------------------------------
function contientErreur(
$buf)
{
$messagesErreurs[] =
"nvalid";
// Invalid input, ...
$messagesErreurs[] =
"o specified";
// No specified atm, ...
$messagesErreurs[] =
"nknown";
// Unknown profile, ...
$messagesErreurs[] =
"o such file or directory";
// sauvegarde dans un repertoire inexistant
$messagesErreurs[] =
"llegal";
// illegal file name, ...
foreach (
$messagesErreurs as $erreur)
{
if (strpos (
$buf,
$erreur) === false)
continue;
// une erreur est dźtectźe
$this->libelleErreur =
"Un message d'erreur a źtź dźtectź dans la rźponse de l'hôte distant : " .
"<BR><BR>" . $this->getDernieresLignes($buf,"<BR>") . "<BR>";
return true;
}
return false;
}
//------------------------------------------------------------------------
function attendrePrompt()
{
return $this->
lireJusqua(
$this->prompt);
}
//------------------------------------------------------------------------
function setPrompt(
$s) {
$this->prompt =
$s;
return TELNET_OK; }
//------------------------------------------------------------------------
function setHote(
$s) {
$this->hote =
$s;}
//------------------------------------------------------------------------
function setPort(
$s) {
$this->port =
$s;}
//------------------------------------------------------------------------
function getDerniereErreur() {
return $this->libelleErreur; }
//------------------------------------------------------------------------
function setLog(
$activerLog,
$traitement)
{
if (
$this->log &&
$activerLog)
return TELNET_OK;
if (
$activerLog)
{
$this->repertoireLog =
"/log/" . date("m");
if (!
file_exists(
$this->repertoireLog))
// repertoire mensuel inexistant ?
{
if (
mkdir(
$this->repertoireLog,
0700) === false)
{
$this->libelleErreur =
"Impossible de crźer le repertoire de log " .
$this->repertoireLog;
return TELNET_ERREUR;
}
}
global
$HTTP_SERVER_VARS;
$this->nomFichierLog =
date(
"d") . "_" .
date(
"H:i:s") . "_" .
$traitement .
"_" .
$HTTP_SERVER_VARS[
"PHP_AUTH_USER"]
.
".log";
$this->log =
fopen(
$this->repertoireLog .
"/" . $this->nomFichierLog,"a");
if (
empty(
$this->log))
{
$this->libelleErreur =
"Impossible de crźer le fichier de log " .
$this->nomFichierLog;
return TELNET_ERREUR;
}
$this->
logger(
"----------------------------------------------rn");
$this->logger(
"Dźbut de la log de l'utilisateur " . $HTTP_SERVER_VARS["PHP_AUTH_USER"] .
", adresse IP " . $HTTP_SERVER_VARS["REMOTE_ADDR"] . "rn");
$this->
logger(
"Connexion telnet sur " . $this->hote . ", port " . $this->port . "rn");
$this->
logger(
"Date : " . date("d-m-Y"). " ŕ " . date("H:i:s") . "rn");
$this->
logger(
"Type de traitement effectuź : " . $traitement . "rn");
$this->
logger(
"----------------------------------------------rn");
return TELNET_OK;
}
else
{
if (
$this->log)
{
$this->
logger(
"----------------------------------------------rn");
$this->
logger(
"Fin de la logrn");
fflush(
$this->log);
if (!
fclose(
$this->log))
{
$this->libelleErreur =
"erreur a la fermeture du fichier de log";
return TELNET_ERREUR;
}
$this->log = NULL;
}
return TELNET_OK;
}
}
//------------------------------------------------------------------------
function logger(
$s)
{
if (
$this->log)
fwrite(
$this->log,
$s);
}
//------------------------------------------------------------------------
function getDernieresLignes(
$s,
$separateur=
"n")
{
// une reponse telnet contient (en principe) en premiere ligne l'echo de la commande utilisateur.
// cette methode renvoie tout sauf la premiere ligne, afin de ne pas polluer les logs telnet
$lignes =
split(
"n",
$s);
$resultat = "";
$premiereLigne = true;
while(list(
$key,
$data) =
each(
$lignes))
{
if (
$premiereLigne)
$premiereLigne = false;
else
if (
$data != "")
$resultat .=
$data .
$separateur;
}
$resultat ==
substr(
$resultat,strlen(
$resultat)-
1);
// enlever le dernier caractere de fin de ligne
return $resultat;
}
//------------------------------------------------------------------------
}
// Fin de la classe
?>
</body>
</html>
powrótTagi do źródła:
Telnet, obsługa sieci, php
Nikt jeszcze nie skomentował tego źródła.