2011-08-02 24 views
2

我有400台路由器,通过使用控制台,我可以通过telnet访问他们每个人,并且通过输入一系列命令我可以生成备份并使用FTP将其复制到我的计算机。使用c的telnet客户端,用于自动备份一系列路由器

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

我已经在互联网上阅读了关于此主题的所有信息。

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

我有这个问题,当我使用recv函数时,它不断显示我奇怪的字符,我不知道这意味着什么以及如何解决它,我甚至不知道我想要做什么是可能的只是插座和C.

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

在这里不用我的代码的基础上,我怀疑应该了解如何在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; 

} 

`

+0

andressanchez,欢迎来到SO。请发布您的代码,以便我们可以帮助您。我编辑了你的问题,让它看起来更好。 – 2011-08-02 16:35:10

+0

400路由器呃?你在哪里工作?谷歌?这似乎是一个相当大的数量没有思科路由器和安全设备管理器.... http://www.cisco.com/en/US/products/sw/secursw/ps5318/index.html –

+7

调查[期望](http://www.nist.gov/el/msid/expect.cfm)。 – nmichaels

回答

2

你需要处理telnet协商谈判的telnet。

在netcat中有一个小实现(我的意思是Hobbit的许可版本,而不是GNU的),被描述为“回答任何看起来像telnet协商的东西,不/不会”。您可能可以从中学习,但需要几分钟的时间才能找出它的工作原理并与其他代码进行交互。

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

对于这个问题,在BSD许可证下找到一个telnet客户端并不难,你可以通过满足相当温和的合规性要求来借用代码。这可能是一个更复杂的程序,但它可能有更清晰的内部抽象。

+0

由于某些原因,当我写这个我假设远程系统不会要求登录身份验证;实际上可能并非如此,我不认为netcat会处理它。 –

+1

如果你只是过滤出转义序列,大多数(所有?)telnet服务器实现都可以工作 - 检查协议定义的rfc http://www.faqs.org/rfcs/rfc854.html – Soren

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() 
+0

哦严酷!我想我应该知道更好的... :) – mgalgs

+1

+1来抵消downvote。不使用一些已经写好的telnet代码是愚蠢的,这将在半分钟内在* nix shell中使用'expect'来完成。 – ninjalj

+1

我认为这是有用的答案 - 建议改变方法也可能有益。 –