gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:18:26 26 4
gpt4 key购买 nike

我有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;

}

`

最佳答案

您需要处理 telnet 协商。

在 netcat 中有一个小实现(我指的是 Hobbit 的许可版本,而不是 GNU 的),它被描述为“回答任何看起来像 telnet 协商的事情不要/不会”。您可能可以从中学习,尽管需要几分钟才能弄清楚它是如何工作的以及与其余代码的接口(interface)。

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

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

关于c - 使用 c 的 telnet 客户端,用于自动备份一系列路由器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6915371/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com