webentwicklung-frage-antwort-db.com.de

Wie überprüfe ich, ob der Port auf einem Remote-Server mit Batch-Datei und ohne Software von Drittanbietern geöffnet ist?

Da diese Frage geschlossen ist (wo ich zuerst antworten wollte), öffne ich diese.

Auf einigen Computern ist es verboten, Binärdateien zu installieren/herunterzuladen, daher möchte ich wissen, wie ich überprüfen kann, ob ein Port auf einem Remotecomputer nur mit systemeigenen Windows-Skriptfunktionen geöffnet ist.

6
npocmaka

Erschreckenderweise bietet Windows keine einfachen Tools zum Überprüfen, ob der Port auf einem Remoteserver geöffnet ist.

Eine Option ist Telnet, aber es kann kein Skript erstellt werden, da es geschlossen wird, wenn seine Ausgabe umgeleitet oder erfasst wird. Es war einmal ein MSWinsock.Winsock.1 COM-Objekt auf Windows-Computern installiert, das in einem Skript verwendet werden konnte, aber nicht mehr. PortQry und PsPing sind wunderbare Tools, aber Sie müssen sie noch herunterladen (obwohl sie von Microsoft bereitgestellt werden).

Am einfachsten ist es also, sich auf PowerShell zu verlassen.
Hier ist der Code für ein einfaches .bat Skript, das intern Powershell verwendet, um die Arbeit zu erledigen:

@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%

Auf einigen Computern ist .NET Framework ohne PowerShell installiert. In diesem Fall kann C # -Code mit msbuild in ein Stapelskript eingebettet werden:

<!-- :
    @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>

Was die Maschinen ohne .NET Framework betrifft, kenne ich keine systemeigene Methode zum Überprüfen von Remote-Ports.

16
npocmaka

Wenn Sie nur TCP Ports prüfen möchten, können Sie Test-NetConnection verwenden. If bietet einen -Port -Parameter zum Definieren des TCP -Ports.

5
Moerwald

Diese Befehle könnten in Powershell verwendet werden:

New-Object System.Net.Sockets.TcpClient("123.12.12.123", 22)
New-Object System.Net.Sockets.UdpClient("123.12.12.123", 22)
0
Erdem KAYA