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;
}