клиент telnet, использующий c, для автоматизации резервного копирования серии маршрутизаторов - PullRequest
2 голосов
/ 02 августа 2011

у меня 400 роутеров, ок. и используя консоль, я могу по telnet получить доступ к каждой из них, и, набрав ряд команд, я могу создать резервную копию и скопировать ее на свой компьютер с помощью FTP.

Я хочу автоматизировать эту задачу, потому что она действительно раздражает.

Я прочитал все, что мог об этой теме в Интернете.

Я знаю, чтобы программировать на C, и я использую Windows. Поэтому я прочитал все о WINSOCK и сокетах и ​​пытаюсь реализовать свою программу.

У меня есть эта проблема, когда я использую функцию recv, она продолжает показывать мне странные символы, я не знаю, что это значит и как ее решить, и я даже не знаю, возможно ли то, что я пытаюсь сделать используя только сокеты и C.

В случае, если это возможно, вы можете сказать мне, как отправлять команды, которые у меня есть, таким образом, или указать мне путь документа, который показывает мне, как это сделать.

Здесь идет основа моего кода, я подозреваю, что я должен узнать о том, как договориться о Telnet в c

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>


#pragma comment(lib, "Ws2_32.lib")
#pragma comment(lib, "wsock32.lib")
#pragma comment(lib, "libws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")


int main ()
{
    const char direcciones[400]="xx.x.x.xx";
    WSADATA wsaData;
    SOCKET sock;
    struct hostent *host;
    struct sockaddr_in direc;
    int conex;
    int len;
    char *sendbuf1="USER admin\n\r";
    char *sendbuf2="PASS \n\r";
    char *sendbuf3="\n\r";
    char *sendbuf4="export file=";

    char recvbuf[512];
    int cont;

    // Initialize Winsock
    WSAStartup(MAKEWORD(2,2), &wsaData);
    conex = WSAStartup(MAKEWORD(2,2), &wsaData);
    if (conex != 0)
    {
    printf("WSAStartup failed: %d\n", conex);
    return 1;
    }

    host=gethostbyaddr(&direcciones[0],4,AF_INET);
    printf("\tOfficial address: %s\n", host->h_addr);
    system("pause");

    sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if (sock==-1)
    {
        printf("error al crear el socket\n");
        return(-1);

    }
    direc.sin_family=AF_INET;
    direc.sin_port=htons(23);
    direc.sin_addr=*((struct in_addr*)host->h_addr);
    memset(direc.sin_zero,0,8);

    conex = connect(sock,(SOCKADDR *) & direc,sizeof(direc));
    if (conex==SOCKET_ERROR)
    {
    printf("no se ha podido conectar con el servidor\n");
    conex = closesocket(sock);
        if (conex == SOCKET_ERROR)
            wprintf(L"closesocket function failed with error: %ld\n", WSAGetLastError());
    WSACleanup();
    return 1;
    }
    else printf("coneccion correcta a puerto telnet\n");

system("pause");                    //esto hay que quitarlo despues

conex = recv(sock,recvbuf,512, 0);
printf("se recibio %i bytes\n",conex);
printf("dato recibido: %s\n",&recvbuf);


conex = send( sock, sendbuf1,strlen(sendbuf1), 0 );


conex = recv(sock,recvbuf,512, 0);
printf("se recibio %i bytes\n",conex);
printf("dato recibido: %s\n",&recvbuf);


conex = closesocket(sock);
if(conex==SOCKET_ERROR)
{
    wprintf(L"funcion closesocket fallo con error: %ld\n", WSAGetLastError());
    WSACleanup();
    return 1;
}

WSACleanup();
return 0;

}

`

Ответы [ 2 ]

2 голосов
/ 02 августа 2011

Вам нужно будет обработать переговоры по Telnet.

В netcat есть небольшая реализация (под которой я имею в виду разрешительно лицензированную версию Хоббита, а не GNU), которая описывается как «Отвечать на все, что похоже на согласование telnet с помощью« не / не будет »». из которого вы, возможно, сможете узнать, хотя потребуется несколько минут, чтобы понять, как он работает и взаимодействует с остальным кодом.

Вы также можете использовать netcat из скрипта или запустить его как внешний процесс из программы на Си.

В этом отношении несложно найти клиента telnet под лицензией BSD, из которого можно заимствовать код, выполняя довольно мягкие требования соответствия. Вероятно, это более сложная программа, но она может иметь более четкие внутренние абстракции.

1 голос
/ 02 августа 2011

Я знаю, что это своего рода уклонение от вопроса, но я действительно думаю, что C - неподходящий инструмент для работы (автоматизация задач системного администрирования).Было бы проще использовать telnetlib Python , даже если вам нужно потратить 30 минут на изучение небольшого Python, чтобы заставить его работать.Проверьте, насколько это просто (взято из документации по Python):

import getpass
import sys
import telnetlib

HOST = "localhost"
user = raw_input("Enter your remote account: ")
password = getpass.getpass()

tn = telnetlib.Telnet(HOST)

tn.read_until("login: ")
tn.write(user + "\n")
if password:
    tn.read_until("Password: ")
    tn.write(password + "\n")

tn.write("ls\n")
tn.write("exit\n")

print tn.read_all()
...