Go Down

Topic: login et password avec Telnet.... (Read 6145 times) previous topic - next topic

Jean-François

J'ai modifié un bout de code pour essayer de me connecter en Telnet sur un PC....

J'y arrive.... des fois  :smiley-mr-green:

Mon soucis est que je n'arrive pas à synchroniser la réponse du login et du password avec leurs demande respective, la plupart du temps, le password est écrit avant que la demande en soit faite, ce qui me donne :

Quote
connecting to server...
connected
ÿýÿýÿûÿû

login: root
root
Password:




et avec d'autres essais (en changeant le code) :

Quote
connecting to server...
connected
ÿýÿýÿûÿû

login: root
root
Password:

root



BusyBox v1.21.0.git (2012-09-09 13:41:47 CEST) built-in shell (ash)
Enter 'help' for a list of built-in commands.


J'ai passé la matinée à essayer de différente manière de faire tomber juste le password, en mettant des if, des flags, en testant le dernier char dans le buffer.... mais le résultat est toujours foireux  :smiley-mr-green:

Voici le code expurgé de mes essais:

Code: [Select]

void loop(){
  if (client.connected()) { 
    checke_page();
   client.println("root");
  }
  else if (millis() - lastAttemptTime > requestInterval) {
    // if you're not connected, and two minutes have passed since
    // your last connection, then attempt to connect again:
    connectToServer();
  }

}

// lit ce qui se trouve sur la page
void checke_page(){
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
  }
}

// connection au serveur
void connectToServer() {
  flag=0;
  // attempt to connect, and wait a millisecond:
  Serial.println("connecting to server...");
  if (client.connect(server, 23)) {
    Serial.println("connected");
  }
  // remettre le compteur a zero pour la prochaine connexion:
  lastAttemptTime = millis();
}   


Comment pourrais je attendre l'invitation du login et du password pour remplir les champs, en cas d'interruption de la connection la relancer avec le login et tout le baratin ?
Il faut qu'un fois logguer, je puisse envoyer des commandes prédéfinies ou lire le contenu d'un fichier.
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

barbudor

1) il ne me semble pas que dans ton code tu attende les invites "login:" et "password:"
Du doit pouvoir utiliser les methods findXxxx() ou readXxxUntil() :

Code: [Select]
  bool find(char *target);   // reads data from the stream until the target string is found
  // returns true if target string is found, false if timed out (see setTimeout)

  bool find(char *target, size_t length);   // reads data from the stream until the target string of given length is found
  // returns true if target string is found, false if timed out

  bool findUntil(char *target, char *terminator);   // as find but search ends if the terminator string is found

  bool findUntil(char *target, size_t targetLen, char *terminate, size_t termLen);   // as above but search ends if the terminate string is found

  size_t readBytesUntil( char terminator, char *buffer, size_t length); // as readBytes with terminator character
  // terminates if length characters have been read, timeout, or if the terminator character  detected
  // returns the number of characters placed in the buffer (0 means no valid data found)


Si tu veux être sûr de ce qu'elles font, le code est dans Stream.cpp

2) utilise un automate


Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Jean-François

#2
Jan 20, 2013, 04:38 pm Last Edit: Jan 20, 2013, 04:42 pm by Jean-François Reason: 1
Effectivement, ce code n'attend rien....  :smiley-mr-green:, mais j'avais fait des essais dans ce sens  :smiley-mr-green:

un automate,... comme ceux d'infobarquee ?



XD XD
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

barbudor

Appelé aussi "Machine d'état"

Code: [Select]
enum { WAIT_CONNECT, WAIT_LOGIN, WAIT_PASSWORD, RUNNING } Etat;

void loop()
{
  switch( Etat )
  {
  case WAIT_CONNECT:
    //... ici le code pour se connecter au serveur telnet
    // et quand connecté :
    Etat = WAIT_LOGIN;
    break;
  case WAIT_LOGIN:
    // ... ici le code pour attendre "login:"
    // et quand reçu "login:"
    // envoyer le login puis
    Etat = WAIT_PASSWORD;
    break
... etc , je suis trop fainéant pour continuer
}


Sans oublier la gestion des cas d'erreurs tels que timeout, deconnection, etc ....
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Jean-François

Bien la machine d'état  XD, mais avant de l'utiliser, il faut que je puisse me connecter cerrectement.... :smiley-mr-green:

Un nouvel essai avec une librairie qui était en .pde  :smiley-mr-green: :

Code: [Select]
/*
* SimpleClientTextFinder
*
*/

#include <SPI.h>    
#include <Ethernet.h>
#include <TextFinder.h>

byte mac[] = {
 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,3);
IPAddress server(192,168,1,64);

EthernetClient client;
TextFinder finder( client);

const unsigned long requestInterval = 15000;  // delay between requests
unsigned long lastAttemptTime = 0;   // last time you connected to the server, in milliseconds

void setup()
{
 Ethernet.begin(mac, ip);
 Serial.begin(9600);
 Serial.println("connecting...");  
 Serial.println(Ethernet.localIP());
 delay(2000);  
}

void loop()
{
 if (client.connected()) {
  // checke_page();
   if(finder.find("login: ")){    
     client.println("root");  
   }
   if(finder.find("Password: ")){    
     client.println("root");      
   }
   checke_page();
 }
 else if (millis() - lastAttemptTime > requestInterval) {
   // if you're not connected, and two minutes have passed since
   // your last connection, then attempt to connect again:
   connectToServer();
 }
}

// lit ce qui se trouve sur la page
void checke_page(){
 if (client.available()) {
   char c = client.read();
   Serial.print(c);
 }
 // if the server's disconnected, stop the client:
 if (!client.connected()) {
   Serial.println();
   Serial.println("disconnecting.");
   client.stop();
 }
}

void connectToServer() {
 // attempt to connect, and wait a millisecond:
 Serial.println("connecting to server...");
 if (client.connect(server, 23)) {
   Serial.println("connected");    
 }
 // remettre le compteur a zero pour la prochaine connexion:
 lastAttemptTime = millis();
}


Essai qui ne fonctionne pô  :smiley-sweat:
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

infobarquee

bonjour,
ca y est il copie mes coincs :)
sinon tu peux faire une chose comme ca
Quote

ouverture connexion
delay(2000);
inscription du login
delay(2000);
inscription du mdp
delay(2000);

Jean-François

J'ai déjà essayé ta solution infobarquee et c'est pas un problème de tempo, mais plus "d'étape".

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

infobarquee


J'ai déjà essayé ta solution infobarquee et c'est pas un problème de tempo, mais plus "d'étape".


déjà, est ce qu'en manuel ca fonctionne?
car la solution de find est bonne, expect en bash de mémoire.
as tu vérifié les ports et les logs sur ton server?

EDIT :
ton server est sous quel OS?
si linux, telnet-server est il installé?

Jean-François

#8
Jan 21, 2013, 11:56 am Last Edit: Jan 21, 2013, 12:16 pm by Jean-François Reason: 1
En manuel ça fonctionne... c'est le premier truc que j'essaye afin de bien comprendre la cinématique et l'enchainement des commandes.

J'ai fait une machine d'état (merci barbudor) et ça fonctionne jusqu'à un certain point.


Code: [Select]
enum { WAIT_CONNECT, WAIT_LOGIN, WAIT_PASSWORD, WAIT_INVIT, RUNNING }
Etat = WAIT_CONNECT;

void loop()
{
 switch( Etat )
 {
 case WAIT_CONNECT:
   //... ici le code pour se connecter au serveur telnet
   Serial.println("connection au serveur telnet...");
   if (client.connect(server, 23)) {
     Serial.println("connecté...");
     Etat = WAIT_LOGIN;  
   }
   // remettre le compteur a zero pour la prochaine connexion:
   lastAttemptTime = millis();
   break;
 case WAIT_LOGIN:
   if (client.available()) {
     char c = client.read();
     Serial.print(c);
     stringOne+=c;
   }
   if (!client.connected()) {
     Serial.println();
     Serial.println("déconnecté....");
     client.stop();
     Etat = WAIT_CONNECT;
   }
   // ... ici le code pour attendre "login:"
   if(stringOne.endsWith("login: ")){    
     client.print("root\n");  
     Etat = WAIT_PASSWORD;
   }
   break;
 case WAIT_PASSWORD:
   if (client.available()) {
     char c = client.read();
     Serial.print(c);
     stringOne+=c;
   }
   if (!client.connected()) {
     Serial.println();
     Serial.println("déconnecté....");
     client.stop();
     Etat = WAIT_CONNECT;
   }
   // ... ici le code pour attendre "login:"
   if(stringOne.endsWith("Password:")){    
     client.print("root\n");  
     Etat = WAIT_INVIT;
   }
   break;
 case WAIT_INVIT:
   if (client.available()) {
     char c = client.read();
     Serial.print(c);
     stringOne+=c;
   }
   if (!client.connected()) {
     Serial.println();
     Serial.println("déconnecté....");
     client.stop();
     Etat = WAIT_CONNECT;
   }
   // ... ici le code pour attendre l'invit de commande"
   if(stringOne.endsWith("# ")){    
     Etat = RUNNING;
     delay(100);
   }
   break;
 case RUNNING:
   // ... ici le code pour faire la commande
   client.print("date\n");
   delay(100);
   Etat = WAIT_INVIT;
   break;    
 }
}


Je vais jusqu'à l'invitation de commande symbolisée par "#", la commande passe plusieurs fois puis l'affichage se bloque sur "#"

Quote
Attente de l'attribution de l'adresse IP:
Mon IP:192.168.1.105
connection au serveur telnet...
connecté...
ÿýÿýÿûÿû

login: root
Password:


BusyBox v1.21.0.git (2012-09-09 13:41:47 CEST) built-in shell (ash)
Enter 'help' for a list of built-in commands.

# date
Mon Jan 21 11:15:04 UTC 2013
# date
Mon Jan 21 11:15:04 UTC 2013
# date
Mon Jan 21 11:15:05 UTC 2013
# date
Mon Jan 21 11:15:05 UTC 2013
# date
Mon Jan 21 11:15:05 UTC 2013
# date
Mon Jan 21 11:15:06 UTC 2013
# date
Mon Jan 21 11:15:06 UTC 2013
#
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

infobarquee

hummmm,
ca ressemble à un ban.
trop de commandes rapprochées et ton ip est blacklistée.
tu as quoi dans le syslog? peut être la solution.
sinon trouves tu l'ip du nono dans iptables -l ou -l n (j'ai un doute).

Jean-François

#10
Jan 21, 2013, 01:06 pm Last Edit: Jan 21, 2013, 01:25 pm by Jean-François Reason: 1
Avec #netstat

Quote
# netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
...
tcp        0    134 192.168.1.64:23         192.168.1.105:1025      ESTABLISHED
...


La commande netstat ne fait qu'un renvoi puis elle s'arrête, avec ls ça faisait environ 30 renvoi

Si j'utilise netstat depuis une console distante, je peux faire une répétition manuellement toutes les 1/2 seconde, voir plus rapide, et je n'ai pas de problème d'arrêt.
Avec l'arduino, même en mettant des delay() de 3-5 secondes, cela ne change rien.
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Artouste


Avec #netstat

Quote
# netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
...
tcp        0    134 192.168.1.64:23         192.168.1.105:1025      ESTABLISHED
...


La commande netstat ne fait qu'un renvoi puis elle s'arrête, avec ls ça faisait environ 30 renvoi

Si j'utilise netstat depuis une console distante, je peux faire une répétition manuellement toutes les 1/2 seconde, voir plus rapide, et je n'ai pas de problème d'arrêt.
Avec l'arduino, même en mettant des delay() de 3-5 secondes, cela ne change rien.

Salut JF
juste en passant, parce que ce n'est pas ma specialité les reseaux  :smiley-mr-green:
mais tu utilise quoi sur l'arduino ? un shield ethernet w1500 ?
si oui, peut etre voir du coté du nombre de sessions ouvertes et/ou de debit, j'avais fait un test (faut que je retrouve le topic) ça ne volait pas tres haut !  8)

Jean-François

J'utilise le truc officiel...  :smiley-mr-green: je crois que c'est le machin "Wquelquechose" en effet  XD
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Pac2Kro

4 connexions simultanées, je crois.

Jean-François

dans ce cas de figure, je n'ai qu'une connexion active avec le serveur.
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Go Up