如何检查端口是不是在带有批处理文件且没有第三方软件的远程服务器上打开? [关闭]
Posted
技术标签:
【中文标题】如何检查端口是不是在带有批处理文件且没有第三方软件的远程服务器上打开? [关闭]【英文标题】:How to check if port is open on a remote server with batch file and without third party software? [closed]如何检查端口是否在带有批处理文件且没有第三方软件的远程服务器上打开? [关闭] 【发布时间】:2017-05-22 05:08:13 【问题描述】:由于this question 已关闭(我打算先回答),我正在打开这个。
在某些机器上禁止安装/下载二进制文件,所以我想知道如何检查远程机器上的端口是否仅使用本机 Windows 脚本功能打开。
【问题讨论】:
【参考方案1】:令人沮丧的是,Windows 没有提供简单的工具来检查远程服务器上的端口是否打开。
一个选项是 telnet,但当它的输出被重定向或捕获时它关闭时无法编写脚本。曾几何时,Windows 机器上安装了一个 MSWinsock.Winsock.1 COM 对象,可以在脚本中使用,但仅此而已。 PortQry 和 PsPing 是很棒的工具,但您仍然需要下载它们(尽管它是由 Microsoft 提供的)。
所以最简单的方法是依赖 PowerShell。 这是一个简单的 .bat 脚本的代码,在内部使用 Powershell 来完成工作:
@echo off
::Must be without quotes. If you intend to use command line arguments use %~1
set "host=google.com"
set /a port=443
for /f %%a in ('powershell "$t = New-Object Net.Sockets.TcpClient;try$t.Connect("""%host%""", %port%)catch;$t.Connected"') do set "open=%%a"
:: or simply
:: powershell "$t = New-Object Net.Sockets.TcpClient;try$t.Connect("""%host%""", %port%)catch;$t.Connected"
echo Open: %open%
有些机器没有安装 PowerShell 的 .NET 框架,所以在这种情况下,可以使用 msbuild 将 C# 代码嵌入到批处理脚本中:
<!-- :
@echo off
:: checks if a port on a remote server is open
:: returns errorlevel 1 if it's closed
setlocal
for %%h in (/h /help -help -h "") do (
if /I "%~1" equ "%%~h" (
goto :printHelp
)
)
if "%~2" equ "" goto :printHelp
set "HOST=%~1"
set /a PORT=%~2
:::::: Starting C# code :::::::
:: searching for msbuild location
for /r "%SystemRoot%\Microsoft.NET\Framework\" %%# in ("*msbuild.exe") do set "msb=%%#"
if not defined msb (
echo No .NET framework installed
endlocal & exit /b 10
)
rem :::::::::: calling msbuid :::::::::
call %msb% /nologo /noconsolelogger "%~dpsfnx0"
rem ::::::::::::::::::::::::::::::::::::
endlocal & exit /b %errorlevel%
:printHelp
echo Checks if port is open on a remote server
echo(
echo Usage:
echo %~nx0 host port
echo(
echo If the port is not accessible an errorlevel 1 is set
endlocal & exit /b 0
-->
<Project ToolsVersion="$(MSBuildToolsVersion)" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="_"><_/></Target>
<UsingTask TaskName="_" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v$(MSBuildToolsVersion).dll" >
<Task>
<Using Namespace="System" />
<Using Namespace="System.Net.Sockets" />
<Code Type="Method" Language="cs"><![CDATA[
public override bool Execute()
String host=Environment.GetEnvironmentVariable("HOST").ToLower();
int port=Int32.Parse(Environment.GetEnvironmentVariable("PORT"));
Console.WriteLine("Checking host 0 and port 1",host,port);
using(TcpClient client = new TcpClient())
try
client.Connect(host, port);
catch(Exception)
Console.WriteLine("Closed");
return false;
client.Close();
Console.WriteLine("Open");
return true;
]]>
</Code>
</Task>
</UsingTask>
</Project>
对于没有 .NET 框架的机器,我不知道任何本地方法来检查远程端口。
使用示例(如果脚本另存为checkport.bat
):
C:\>checkport.bat google.com 443
Checking host google.com and port 443
Open
C:\>checkport.bat google.com 666
Checking host google.com and port 666
Closed
还可以检查checkPortJS.bat - 它创建一个依赖于 jscript.net 的小型可执行文件,并且可以与相同的命令行界面一起使用。可能更便携,因为它可以在旧系统上使用并且代码更易于阅读。
【讨论】:
【参考方案2】:这些命令可以在 Powershell 中使用:
New-Object System.Net.Sockets.TcpClient("123.12.12.123", "22")
New-Object System.Net.Sockets.UdpClient("123.12.12.123", "22")
【讨论】:
【参考方案3】:如果您只想检查 TCP 端口,您可以使用Test-NetConnection。如果提供-Port
参数来定义 TCP 端口。
【讨论】:
是的。我知道 - 但这是一个 powershell 4 cmd let,我想让它尽可能向后兼容。+1 无论如何。以上是关于如何检查端口是不是在带有批处理文件且没有第三方软件的远程服务器上打开? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章