• 主页
  • Windows SDK/API
  • 基础类
  • ActiveX
  • 数据库及相关技术
  • 网络及通讯开发
  • VCL组件使用和开发

分享 最近碰到的telnet程序自动登录的解决方法

CppFile 2011-11-03 09:32:57
最近着手写一个程序,自动登录到交换机,获取端口的mac地址,并逐级找出该mac的终端接在交换机的那个端口,本来以为不麻烦的,没想到,刚上手就发现有问题了

本来控制台程序用管道重定向程序的输入和输出,然后里面的内容就能自动获取了,但是实际上,我发现,在cmd下运行,dir命令,通过管道可以获取内容,但是一旦运行了telnet.exe ,立刻就无法获取信息了

放狗搜索,最后有一个帖子说,处于安全原因,微软的telnet.exe不允许管道重定向。。。。

好吧,换一种思路。。

微软的telnet.exe可以在命令行下运行telnet.exe /help,通过-f abc.log参数可以指定telnet的日志,你所有的操作都会记录在这里面,这样就解决了输出问题,就剩下输入问题了

通过vbs脚本可以解决这个问题,类似

set ws=wscript.createobject("wscript.shell")
wscript.sleep 1000


ws.SendKeys "telnet{enter}"
Wscript.sleep 500

ws.SendKeys "set logfile aa.log{enter}"
Wscript.sleep 1000

ws.SendKeys "o 192.168.1.1{enter}"
Wscript.sleep 1000
ws.SendKeys "root{enter}"
wscript.sleep 1000
ws.SendKeys "password{enter}"


这样有个缺点,就是在运行脚本的时候,不能做别的事情,否则焦点切换了,字符就会发送到别的程序上。。。。


解决方法就是使用CreateProcess来创建一个隐藏的telnet.exe,然后用FindWindos找出这个窗口,发送消息给他,就能实现

见代码


	AnsiString strPath;
STARTUPINFO StartInfo;
PROCESS_INFORMATION procStruct;
memset(&StartInfo, 0, sizeof(STARTUPINFO));
StartInfo.cb = sizeof(STARTUPINFO);

StartInfo.dwFlags =STARTF_USESHOWWINDOW;
StartInfo.wShowWindow = SW_HIDE;
strPath = "telnet.exe -f aaa.log 192.168.1.1";

bool b = CreateProcess(NULL, strPath.c_str(), NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &StartInfo, &procStruct);
if (b)
{
Sleep(1000);
if (hTelnet = ::FindWindow("ConsoleWindowClass", "Telnet 192.168.1.1")) // 找到控制台句柄
{

。。。。。


}

}


	Sleep(100);
PostMessage(hTelnet, WM_CHAR, 'A' , 0); // ' 发送一个 字符


在需要登录多个交换机的时候,可以将这些过程封装在线程中,这样就不会感觉到操作界面的延迟了

这几天研究出的东西,并不复杂,但是在网上似乎大家都是用脚本来解决的,所以写出来与大家共享。。。
...全文
185 点赞 收藏 8
写回复
8 条回复
tanta 2012年07月05日
我也遇到了这个问题。。。
回复 点赞
laowang2 2011年11月04日
回复 点赞
cgl_lgs 2011年11月03日
不过直接用FindWindow似乎不太保险,最好还是枚举窗体并看其属于不属于你Create的Process:)
回复 点赞
cgl_lgs 2011年11月03日
类似于telnet的还有runas等跟安全相关的程序:)
回复 点赞
fbmsyu 2011年11月03日
我做过类似的,用indytelnet控件连接的。也可以实现。
回复 点赞
zzbinfo 2011年11月03日
不错不错,记号,留用
回复 点赞
cgl_lgs 2011年11月03日
[Quote=引用 5 楼 cppfile 的回复:]当然,如果用户手工打开一个telnet,那就可能找错。。[/Quote]就是这个意思:)
回复 点赞
CppFile 2011年11月03日
不过直接用FindWindow似乎不太保险,最好还是枚举窗体并看其属于不属于你Create的Process:)
-----------------
在我这里是没有这个问题的,因为我FindWindow的时候,填入了2个参数,分别是类名和标题,所以不会有相同的,当然,如果用户手工打开一个telnet,那就可能找错。。
回复 点赞
发动态
发帖子
C++ Builder
创建于2007-08-02

2563

社区成员

10.2w+

社区内容

C++ Builder相关内容讨论区
社区公告
暂无公告