Ecrire mdp sesion telnet

Signaler
Messages postés
5
Date d'inscription
mardi 7 juin 2011
Statut
Membre
Dernière intervention
21 juillet 2011
-
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
-
Bonjour à tous,

Je travail avec visualc++ 2008 et les windows form.
Sur ma form, j'ai un bouton permettant d'ouvrir une session telnet sur un switch, voici le code que j'ai fais:

STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );

CreateProcess( TEXT("telnet.exe"),
TEXT("telnet 192.168.2.15"),
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si,
&pi );

Ceci me lance une session telnet jusqu'au moment de taper le mdp. Je voudrais pouvoir le renseigner automatiquement (pour gain de temp), pour que l'utilisateur arrive directement authentifié.
J'ai essayer d'utiliser cout(), writeconsole() mais sans resultat...

Merci d'avance à ceux qui pourront m'aider.
Max

2 réponses

Messages postés
5
Date d'inscription
mardi 7 juin 2011
Statut
Membre
Dernière intervention
21 juillet 2011

D'après mes recherches de ce matin, ça semble assez compliqué voir impossible avec la méthode que j'utilise, le problème est le suivant:
si j'utilise une socket(car j'ai vu qu'avec une socket c'était faisable), une fois l'authentification terminé (automatiquement avec login/mdp), sera t-il possible d'ouvrir une console pour prendre la main sur le switch en question sur la session ouverte?
Merci d'avance.
Max
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
Bonjour,

Désolé pour la réponse tardive.
Habituellement, on utilise un pipe pour envoyer du texte à un outil en ligne de commande. Plus moche, on peut passer par un fichier et utiliser la redirection du dos (<), ce qui revient plus ou moins au même.

Mais telnet est insensible à cette stratégie. Cela est probablement dû à la façon dont il lit les entrées de l'utilisateur.

Toutefois, on trouves sur le net des vbscripts automatisant telnet via SendKeys. Le gros problème de cette méthode est que les touches sont envoyées à la fenêtre active. Autrement dit, il ne faut surtout pas que l'utilisateur fasse quoique ce soit pendant l'exécution du script, car si une autre fenêtre devient active, c'est elle qui récupérera le caractères.

Il est donc préférable d'utiliser PostMessage pour désigner la fenêtre précisément.

Le code ci-dessous ne fait que lancer un telnet, exécuter "help" et laisser la console ouverte, car je n'ai pas de serveur telnet sous la main.

Application GUI en C.
Pour compiler sous gcc, ajouter -nostartfiles -nodefaultlibs -nostdlib -ffreestanding dans les options du lieur.
Pour compiler sous VC, s'arranger pour que le lieur ignore toutes les librairies par défaut (/nodefaultlib).
Sous VC, en cas d'erreur LNK2001 : __chkesp symbole externe non résolu -> Enlever /GZ des options de compilation
#ifdef UNICODE
#define _T(x) L ## x
typedef unsigned short TCHAR;
#else
#define _T(x) x
typedef char TCHAR;
#endif

#include <windows.h>

HWND _hTelnetHwnd;         /* Handle de la fenêtre de telnet    */
DWORD _nTelnetPid;         /* PID de telnet                     */

DWORD __stdcall Err_ShowLast(TCHAR* lpTitle)
{
  DWORD nLastError;
  LPTSTR lpMessageBuffer;

  nLastError = GetLastError();

  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
                NULL, nLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (void*)&lpMessageBuffer, 0, NULL);

  MessageBox(NULL, lpMessageBuffer, lpTitle, MB_OK | MB_ICONERROR);

  LocalFree(lpMessageBuffer);

  return nLastError;
}

void* __stdcall Mem_Set(void* lpArea, BYTE nValue, DWORD nSize)
{
  BYTE* lpByteArea;
  DWORD nI;

  lpByteArea = (BYTE*)lpArea;
  for (nI = 0; nI < nSize; nI++)
    lpByteArea[nI] = nValue;
  return lpArea;
}

/**
 * Callback d'énumération des fenêtre pour trouver celle de la calculatrice
 */
BOOL __stdcall RetrieveTelnetWindow(HWND hwnd, LPARAM lParam)
{
  DWORD nPid;   /* Récupération du PID associé à la fenêtre                   */
  BOOL bFound;  /* Fenêtre trouvée ?                                          */

  GetWindowThreadProcessId(hwnd, &nPid);
  if (nPid == _nTelnetPid)
  {
    _hTelnetHwnd = hwnd;
    bFound = TRUE;
  }
  else
    bFound = FALSE;

  /* On arrête l'énumération si on a trouvé */
  return ! bFound;
}

void __stdcall PostString(HWND hwnd, TCHAR* lpString)
{
  int nI;
  int nLength;

  nLength = lstrlen(lpString);

  for (nI = 0; nI < nLength; nI++)
  {
    PostMessage(hwnd, WM_CHAR, lpString[nI], 0);
  }
  PostMessage(hwnd, WM_KEYDOWN, VK_RETURN, 0);
  Sleep(10);
}

int __cdecl WinMainCRTStartup()
{
  STARTUPINFO startupInfo;
  PROCESS_INFORMATION processInfo;
  TCHAR lpCommandLine[512];         /* Le paramètre lpCommandLine de CreateProcessW ne doit pas être read-only */
  DWORD nResult;

  nResult = 1;

  /* Préparation des infos de lancement du processus avec affichage de la fenêtre */
  Mem_Set(&startupInfo, 0, sizeof(startupInfo));
  startupInfo.cb = sizeof(startupInfo);
  startupInfo.dwFlags = STARTF_USESHOWWINDOW;
  startupInfo.wShowWindow = SW_SHOW;

  /* Lancement du processus */
  lstrcpy(lpCommandLine, _T("telnet"));
  if (! CreateProcess(NULL, lpCommandLine, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &startupInfo, &processInfo))
  {
    Err_ShowLast(_T("Cannot create process"));
    goto the_end;
  }

  _nTelnetPid = processInfo.dwProcessId;

  /* Récupération d'un handle sur la fenêtre de la calculatrice */
  while (_hTelnetHwnd == 0)
  {
    EnumWindows(RetrieveTelnetWindow, 0);
    Sleep(1);
  }

  PostString(_hTelnetHwnd, _T("help"));

  nResult = 0;

  CloseHandle(processInfo.hThread);
  CloseHandle(processInfo.hProcess);
the_end:
  ExitProcess(nResult);
  return 0;
}