2017-01-07 14 views
5

this question बंद है (जहां मैं पहले जवाब देना चाहता था) मैं इसे खोल रहा हूं।बैच फ़ाइल के साथ और थर्ड पार्टी सॉफ़्टवेयर के बिना रिमोट सर्वर पर बंदरगाह खुला है या नहीं?

कुछ मशीनों पर इसे बाइनरी इंस्टॉल/डाउनलोड करने के लिए मना किया गया है, इसलिए मैं जानना चाहता हूं कि रिमोट मशीन पर एक पोर्ट केवल मूल विंडोज स्क्रिप्ट क्षमताओं का उपयोग करके खुला है या नहीं।

+1

यह सब क्या जुआ है? क्या आप इसे हटा सकते हैं और एक उचित सवाल पूछ सकते हैं? – Clive

उत्तर

13

परेशान रूप से, विंडोज एक दूरस्थ सर्वर पर बंदरगाह खुला है या नहीं यह जांचने के लिए सरल उपकरण प्रदान नहीं करता है।

एक विकल्प टेलनेट है, लेकिन इसे आउटपुट रीडायरेक्ट या कैप्चर होने पर बंद होने पर इसे स्क्रिप्ट नहीं किया जा सकता है। एक बार एक समय पर 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> 

मशीनों नेट ढांचे के बिना मैं दूरदराज के बंदरगाहों की जाँच करने के लिए किसी भी देशी विधि नहीं जानते का सवाल है।

3

यदि आप केवल टीसीपी पोर्ट की जांच करना चाहते हैं तो आप Test-NetConnection का उपयोग कर सकते हैं। यदि टीसीपी पोर्ट को परिभाषित करने के लिए -Port पैरामीटर प्रदान करता है।

+2

हाँ। मुझे पता है - लेकिन यह एक शक्तिशक्ति 4 सेमीडी है और मैं इसे यथासंभव पिछड़ा संगत बनाना चाहता हूं। + 1 वैसे भी। – npocmaka

संबंधित मुद्दे