3

我可以运行一个命令来查看端口是否打开:

portqry -n servername -e 80

我想针对服务器列表运行它:

  1. DEV1 80
  2. DEV2 80
  3. DEV3 80
  4. 测试1 80
  5. 测试2 80
  6. 产品 80

我想使用单个 Windows 批处理脚本来测试它们,看看哪些端口是打开的,哪些是关闭的。(而且我不希望它在第一个关闭的端口上掉下来)。

我的问题是:是否有一个Windows 批处理脚本来查看一系列服务器/端口是否打开?

附加:我知道还有其他问题询问如何检查端口是否打开。它们都不是关于以可靠的方式为一系列端口编写脚本。

4

3 回答 3

8

干得好。向前支付。:) 要直接回答您的问题,只需使用for循环遍历您的服务器并portqry在每个服务器上执行。 编辑:您找到的 PowerShell 片段对于摆脱 PortQry 依赖项很有用。

@echo off
setlocal

set "servers=dev1 dev2 dev3 test1 test2 test2:8080 prod prod:443"

for %%I in (%servers%) do (
    for /f "tokens=1,2 delims=:" %%a in ("%%I") do (
        set "port=%%~b"
        if not defined port set "port=80"
        setlocal enabledelayedexpansion
        call :handshake "%%~a" "!port!" && (
            echo %%a port !port!: OK
        ) || (
            echo %%a port !port!: Error
        )
        endlocal
    )
)

goto :EOF

:handshake <server> <port>
powershell "$t=new-object Net.Sockets.TcpClient;$c=$t.BeginConnect('%~1',%~2,{},{});if($c.AsyncWaitHandle.WaitOne(1000)){$t.EndConnect($c);exit 0};exit 1"
exit /b %ERRORLEVEL%

这是使用PortQry 2.0的原始解决方案:

@echo off
setlocal

set "servers=dev1 dev2 dev3 test1 test2 test2:8080 prod prod:443"

for %%I in (%servers%) do (
    for /f "tokens=1,2 delims=:" %%a in ("%%I") do (
        set "port=%%~b"
        if not defined port set "port=80"
        setlocal enabledelayedexpansion
        portqry -n "%%~a" -e "!port!" >NUL 2>NUL && (
            echo %%a port !port!: OK
        ) || (
            echo %%a port !port!: Error
        )
        endlocal
    )
)

如果您正在测试的所有内容都是 Web 服务,那么以不同的方式进行此操作可能更有意义。您可以使用Microsoft.XMLHTTPCOM 对象摆脱这种portqry依赖关系;并且因此获得的响应将与 HTTP 服务更相关。(例如,如果您的 VNC 服务器在端口 8080 上运行,您希望 Web 服务正在侦听,portqry那么当您需要它返回失败时,可能会返回成功。)

无论如何,将其保存为 .bat 脚本和盐以供品尝。

@if (@CodeSection == @Batch) @then

@echo off
setlocal

set "servers=dev1 dev2 dev3 test1 test2 test2:8080 prod prod:443"

for %%I in (%servers%) do (
    for /f "tokens=1,2 delims=:" %%a in ("%%I") do (
        set "port=%%~b"
        if not defined port set "port=80"
        setlocal enabledelayedexpansion
        cscript /nologo /e:JScript "%~f0" "%%~a" "!port!" && (
            echo %%a port !port!: OK
        ) || (
            echo %%a port !port!: Error
        )
        endlocal
    )
)

goto :EOF

@end // end batch / begin JScript chimera

var server = WSH.Arguments(0),
    port = WSH.Arguments(1),
    protocol = port == 443 ? 'https' : 'http',
    URL = protocol + '://' + server + ':' + port + '/',
    XHR = WSH.CreateObject('Microsoft.XMLHTTP');

XHR.open('GET', URL);
XHR.setRequestHeader('User-Agent','XMLHTTP/1.0');
XHR.send('');
while (XHR.readyState != 4) WSH.Sleep(25);
WSH.Quit(XHR.status - 200);
于 2015-04-09T01:42:16.960 回答
1

这就是我最终将上面的 VBScript 替换为 - 一个名为的porttest.ps1文件powershell -f porttest.ps1

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"
$tcpobject = new-Object system.Net.Sockets.TcpClient 
$connect = $tcpobject.BeginConnect($remoteHost,$port,$null,$null) 
#Configure a timeout before quitting - time in milliseconds 
$wait = $connect.AsyncWaitHandle.WaitOne(1000,$false) 
If (-Not $Wait) {
    'Timeout'
    exit 1
} Else {
    $error.clear()
    $tcpobject.EndConnect($connect) | out-Null 
        If ($Error[0]) {
            Write-warning ("{0}" -f $error[0].Exception.Message)
            exit 1
        } Else {
            'Port open!'
            exit 0
        }
    }
于 2015-04-09T12:48:41.010 回答
0

与上述不同的是,这根本不需要 powershell,并且应该适用于所有版本的 windows,前提是已安装 telnet 客户端 ( dism /online /Enable-Feature /FeatureName:TelnetClient)

如果有人可以解决如何停止 telnet 命令输出任何内容,请添加评论,因为如果我添加重定向它会拒绝运行。我相信 telnet 需要一个标准输出并且不能被重定向。

为此,只需将两个 127.0.0.1 IP 地址更改为您要扫描的主机。

break>Results.txt & (for /l %a in (1,1,49152) do @taskkill /im telnet.exe /f >NUL 2>&1 & @start /b telnet.exe 127.0.0.1 %a & for /f %i in ('netstat -n ^| findstr /r /c:"TCP[ ][ ]*127.0.0.1:%a[ ][ ]*.*ESTABLISHED" ^| findstr /n ".*" ^| findstr "^1:"') do @echo "TCP Port Open: %a" >> Results.txt) & taskkill /im telnet.exe /f >NUL 2>&1

完成后,要获得结果,您可以键入

type Results.txt
于 2018-08-24T02:02:33.057 回答