परेशान रूप से, विंडोज एक दूरस्थ सर्वर पर बंदरगाह खुला है या नहीं यह जांचने के लिए सरल उपकरण प्रदान नहीं करता है।
एक विकल्प टेलनेट है, लेकिन इसे आउटपुट रीडायरेक्ट या कैप्चर होने पर बंद होने पर इसे स्क्रिप्ट नहीं किया जा सकता है। एक बार एक समय पर MSWinsock.Winsock.1 COM ऑब्जेक्ट्स विंडोज मशीनों पर स्थापित किया गया था जो किसी स्क्रिप्ट में उपयोग किया जा सकता था, लेकिन अब नहीं। PortQry और PsPing एक शानदार उपकरण हैं लेकिन आपको अभी भी उन्हें डाउनलोड करना होगा (माइक्रोसॉफ्ट द्वारा प्रदान किए जाने के बावजूद)।
तो सबसे आसान तरीका 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 के बिना नेट ढांचा स्थापित इसलिए इस मामले सी # कोड में जोड़ा जा सकता है:
यहाँ एक सरल .bat स्क्रिप्ट के लिए कोड, आंतरिक रूप से PowerShell का उपयोग काम करवाने के लिए है एक बैच स्क्रिप्ट msbuild का उपयोग कर:
<!-- :
@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>
मशीनों नेट ढांचे के बिना मैं दूरदराज के बंदरगाहों की जाँच करने के लिए किसी भी देशी विधि नहीं जानते का सवाल है।
यह सब क्या जुआ है? क्या आप इसे हटा सकते हैं और एक उचित सवाल पूछ सकते हैं? – Clive