分享 最近碰到的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:)