使用批处理脚本在Windows 7上自动执行telnet端口测试

时间:2013-12-14 13:05:22

标签: windows batch-file automation telnet

我使用的是Windows 7 x64。使用bat脚本,我需要检查是否能够使用telnet连接到服务器上的某些特定端口。如果连接成功,服务器将显示一个菜单,或者显示如下消息:正在连接到xxxxx ...无法打开与主机的连接,在端口xxxxx上:连接失败。

出于我的目的,服务器有几个要测试的端口,我不希望通过登录或导航菜单使事情变得复杂。我只想要一个简单的输出来指示连接是否成功。检查退出状态不起作用。我不想使用Visual Basic。知道如何使用bat脚本检查连接状态吗?目前,我直观地检查,并使用以下脚本打开连接

@ECHO OFF
setlocal EnableDelayedExpansion

echo.
SET /P host_name="Please enter the hostname: "
echo Please enter the port numbers followed by the Enter key: 
echo.
set num=0

:Loop
set /a num=num+1
SET /P mwa_port%num%=""
if "!mwa_port%num%!"=="" (goto Start)
goto Loop

:Start
set /a num=num-1
for /L %%i in (1,1,%num%) do (
 echo Trying to log into port !mwa_port%%i! of %host_name%
 start /min "" "C:\Windows\System32\telnet.exe" %host_name% !mwa_port%%i!
 REM echo Exit Code is %errorlevel%
)

:End
endlocal
echo.
SET /P leave="Press any key to exit.."

以下是脚本的示例输出:

Please enter the hostname : abcdefg.hijkl.mnop
Please enter the port numbers followed by the Enter key:

10001
10002
10003
10004
10005

Trying to log into port 10001 of abcdefg.hijkl.mnop
Trying to log into port 10002 of abcdefg.hijkl.mnop
Trying to log into port 10003 of abcdefg.hijkl.mnop
Trying to log into port 10004 of abcdefg.hijkl.mnop
Trying to log into port 10005 of abcdefg.hijkl.mnop

Press any key to exit..

然后以最小化状态打开5个telnet窗口,每个窗口都有一个成功登录的菜单

3 个答案:

答案 0 :(得分:3)

遗憾的是你不能使用netcat - 所有的开源选项都在你的环境中禁止吗?

即使没有开源工具,您仍然可以使用PowerShell完成此任务。

这是一个示例PS脚本,它将尝试连接到$ remoteHost上的端口23,并在成功时退出0,并在失败时退出1。 (如果在连接后需要做更多工作,可以在网上找到一些更复杂的PowerShell telnet客户端示例,例如this one。)

将代码放在文件“foo.ps1”中,然后使用“ powershell -File foo.ps1 ”在cmd.exe(或来自.bat文件)中运行。退出时,退出代码将存储在%errorlevel%。

注意您可能需要修改PowerShell脚本执行策略(或使用"-ExecutionPolicy Bypass" cmdline option)以允许执行脚本 - 有关详细信息,请参阅this documentation from MSFT

param(
    [string] $remoteHost = "arbitrary-remote-hostname",
    [int] $port = 23
     )

# Open the socket, and connect to the computer on the specified port
write-host "Connecting to $remoteHost on port $port"
try {
  $socket = new-object System.Net.Sockets.TcpClient($remoteHost, $port)
} catch [Exception] {
  write-host $_.Exception.GetType().FullName
  write-host $_.Exception.Message
  exit 1
}

write-host "Connected.`n"
exit 0

答案 1 :(得分:1)

您可以使用netcat,会话日志:

    C:\Users\User>nc -v -t stackoverflow.com 23
    stackoverflow.com [198.252.206.16] 23 (telnet): TIMEDOUT

    C:\Users\User>echo %errorlevel%
    1

    C:\Users\User>nc -v -t stackoverflow.com 25
    stackoverflow.com [198.252.206.16] 25 (smtp) open
    220 SMTP Relay SMTP
    421 SMTP Relay SMTP session timeout. Closing connection

    C:\Users\User>echo %errorlevel%
    0

答案 2 :(得分:0)

Checking for exit status didn't work.是什么意思?

如果您取消 - REM退出代码打印行,则在解析ERRORLEVEL循环时,errorlevel的值将为FOR - 在执行之前。

显示每次调用telnet时需要的值

 ...
 "C:\Windows\System32\telnet.exe" %host_name% !mwa_port%%i!
 echo Exit Code is !errorlevel!

其中!errorlevel!errorlevel的运行时值。

很可能,您希望取消telnet输出,因此可以有效地附加>nul和/或2>nul以使其安静下来。可能你需要为telnet提供响应 - 而不是我的区域......

现在 - 如果errorlevel没有返回可用值,是否有可以观察到的telnet响应来区分您感兴趣的状态?