读书人

分享 最近碰到的telnet程序自动登录的

发布时间: 2012-04-13 13:50:24 作者: rapoo

分享 最近碰到的telnet程序自动登录的解决方法
最近着手写一个程序,自动登录到交换机,获取端口的mac地址,并逐级找出该mac的终端接在交换机的那个端口,本来以为不麻烦的,没想到,刚上手就发现有问题了

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

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

好吧,换一种思路。。

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

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

VB code
set ws=wscript.createobject("wscript.shell")wscript.sleep 1000ws.SendKeys "telnet{enter}"Wscript.sleep 500ws.SendKeys "set logfile aa.log{enter}"Wscript.sleep 1000ws.SendKeys "o 192.168.1.1{enter}"Wscript.sleep 1000ws.SendKeys "root{enter}"wscript.sleep 1000ws.SendKeys "password{enter}"


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


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

见代码


C/C++ code
    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")) // 找到控制台句柄        {                        。。。。。                    }    }


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


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

这几天研究出的东西,并不复杂,但是在网上似乎大家都是用脚本来解决的,所以写出来与大家共享。。。


[解决办法]
不错不错,记号,留用
[解决办法]
我做过类似的,用indytelnet控件连接的。也可以实现。
[解决办法]
类似于telnet的还有runas等跟安全相关的程序:)
[解决办法]
不过直接用FindWindow似乎不太保险,最好还是枚举窗体并看其属于不属于你Create的Process:)

读书人网 >C++ Builder

热点推荐