7.2-RELEASE-p2
Задача следующая:
нужна программка которая подключалась к свичам и делала какието действия, аналог на perle работает на ура, но там я испльзую библиотеку телнета,а в С нашел только такой вариант, если есть какая то библиотека для С подскажите буду признатилен)
#include <stdio.h>
#include <netdb.h>
#include <time.h>
#include <arpa/telnet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>char Buffer[204800];
char out_buf[BUFSIZ];
int hSocket,i, rd;int main()
{
char *arg_host = "192.168.14.2";
int sock;
struct sockaddr_in addr;
struct hostent *srvinfo;
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock < 0)
{
perror("socket");
exit(1);
}addr.sin_family = AF_INET;
addr.sin_port = htons(23); //
srvinfo = gethostbyname(arg_host);
addr.sin_addr = *(struct in_addr *) srvinfo->h_addr;
if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
{
perror("connect");
exit(2);
}sleep(1);
memset(Buffer,0, sizeof(Buffer));
rd=recv(sock, Buffer, sizeof(Buffer), 0);
printf("Recieved %d bytes: %s\n", rd, Buffer);
sleep(1);memset(out_buf,0, sizeof(out_buf));
sprintf(out_buf, "%s", "Admin\r\n");//printf(out_buf);
rd = send(sock, (void*)&out_buf, sizeof(out_buf), 0);
sleep(1);
memset(Buffer,0, sizeof(Buffer));
rd = recv(sock, Buffer, sizeof(Buffer), 0);
printf("Recieved %d bytes: %s\n",rd, Buffer);sleep(1);
memset(out_buf,0, sizeof(out_buf));
sprintf(out_buf, "%s", "password\r\n");//printf(out_buf);
rd = send(sock, (void*)&out_buf, sizeof(out_buf), 0);
sleep(1);
memset(Buffer,0, sizeof(Buffer));
rd = recv(sock, Buffer, sizeof(Buffer), 0);
printf("Recieved %d bytes: %s\n",rd, Buffer);
close(sock);return 0;
}
когда запускаю выдает:
server# ./telcli
Recieved 26 bytes: ��������UserName:
Recieved 39 bytes: Admin
Password:
UserName:
UserName:
Recieved 43 bytes: password
Password:authentication failedserver#
такое ощущение что "\r\n" нажатие Enter не работает, вернее срабатывает один раз.
почему не работает?
Заранее всем спасибо!!!
>в С нашел только такой вариант, если есть какая то библиотека для
>С подскажите буду признатилен)Протокол telnet предполагает обмен некими служебными данными сразу после установления соединения, возможно дело в этом - ваши логин/пароль могут частично потеряться на этом этапе. Неплохая библиотека для C/C++, реализующая telnet (и многие другие протоколы) - libcurl.
>Протокол telnet предполагает обмен некими служебными данными сразу после установления соединения, возможно
>дело в этом - ваши логин/пароль могут частично потеряться на этом
>этапе. Неплохая библиотека для C/C++, реализующая telnet (и многие другие протоколы)
>- libcurl.Спасибо за помощь), буду искать что это и с чем едят)
а проблему поборол)
вот что изменил:
sprintf(out_buf, "%s", "Admin\rpassword");//printf(out_buf);и sprintf(out_buf, "%s", "show\r");//printf(out_buf);
"\r" - как я понял это Enter
:)))
>Протокол telnet предполагает обмен некими служебными данными сразу после установления соединения, возможно
>дело в этом - ваши логин/пароль могут частично потеряться на этом
>этапе. Неплохая библиотека для C/C++, реализующая telnet (и многие другие протоколы)
>- libcurl.по поводу curl telnet, все работает но авторизации пока нет(((, на родном форуме тоже про это писали, типо в будующем) возможно.
NOTE: the telnet protocol does not specify any way to login with a specified user and password so curl can't do that automatically. To do that, you need to track when the login prompt is received and send the username and password accordingly.
>NOTE: the telnet protocol does not specify any way to login with
>a specified user and password so curl can't do that automatically.
>To do that, you need to track when the login prompt
>is received and send the username and password accordingly.Ну да, всё правильно. Вы же знаете, каким приглашением ваш свич запрашивает логин/пароль? Ждёте, пока он их запросит и выдаёте ему то, что нужно. Похоже на то, что вы делали в первом посте, только более корректно по отношению к протоколу telnet. А вообще,
> а проблему поборол)
разве у вас всё уже не заработало? Так в чём тогда проблема?
>Ну да, всё правильно. Вы же знаете, каким приглашением ваш свич запрашивает
>логин/пароль? Ждёте, пока он их запросит и выдаёте ему то, что
>нужно. Похоже на то, что вы делали в первом посте, только
>более корректно по отношению к протоколу telnet. А вообще,
>разве у вас всё уже не заработало? Так в чём тогда проблема?) Чето я не понял)!
через libcurl можно соединяться с телнетом? вернее соединяться можно, а вот с авторизацией проблема.Если можно ПРИМЕР, потому как что я не делал, но лог и расс мне приходилось вводить вручную.
Буду признателен!!!