使用c的telnet客户端,用于自动备份一系列路由器

时间:2011-08-02 16:30:20

标签: c ftp winsock telnet

我有400台路由器,约。通过使用控制台,我可以通过telnet访问每一个,并通过键入一系列命令,我可以生成备份并使用FTP将其复制到我的计算机。

我想自动执行此任务,因为它真的很烦人。

我已经在互联网上阅读了有关此主题的所有内容。

我知道用C语言编程我正在使用Windows。所以我读了所有关于WINSOCK和套接字的内容,我正在尝试实现我的程序。

我有这个问题,当我使用recv功能时它会一直向我显示奇怪的字符,我不知道这意味着什么以及如何解决它我甚至不知道我是不是想做什么只使用套接字和C.

如果有可能,你可以告诉我如何发送我有这种方式的命令,或者指出我对文件的方式,告诉我如何做到这一点。

这里是我的代码的基础,我怀疑我应该学习如何在c中协商telnet

#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 个答案:

答案 0 :(得分:2)

您需要处理telnet协商。

在netcat中有一个小实现(我的意思是霍比特人的许可版本,而不是GNU),被描述为“回答任何看起来像telnet协商的东西,不会/不会。”您可能可以从中学习,但需要几分钟才能弄清楚它是如何工作的,并与其余代码接口。

您还可以使用脚本中的netcat或从C程序将其作为外部进程启动。

就此而言,根据BSD许可证找到一个telnet客户端并不难,您可以通过满足相当温和的合规性要求来借用代码。这可能是一个更复杂的程序,但它可能有更清晰的内部抽象。

答案 1 :(得分:1)

我知道这有点避免这个问题,但我认为C是错误的工具(自动化系统管理任务)。使用Python's telnetlib会更容易,即使你花了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()