web-dev-qa-db-fra.com

Comment envoyer une requête ping à plusieurs serveurs et renvoyer l'adresse IP et les noms d'hôte à l'aide d'un script de traitement par lots?

Je dois donc utiliser batch uniquement pour cela. Fondamentalement, les noms de hôte du serveur sont tous répertoriés dans un fichier txt. J'ai utilisé le code suivant pour cingler tous les serveurs et afficher leurs résultats dans un fichier txt. 

For /f %%i in (testservers.txt) do ping -n 1 %%i >>pingtest.txt

Ce qui précède a envoyé une requête ping à tous les serveurs. Maintenant, je veux sortir les adresses IP et les noms d’hôtes dans un fichier séparé. Comment puis-je faire cela? Je sais que je peux exécuter une boucle for en recherchant des mots tels que "TTL", puis le 3ème jeton (pour l'IP) et des mots tels que "PINGING" pour le deuxième jeton (HOSTNAME). . Mais j'ai des erreurs et je ne peux pas l'afficher correctement. La raison pour laquelle je veux exporter les adresses IP et les noms d’hôte dans un fichier différent est de dresser une liste des serveurs DOWN et UP. 

L'aide sera appréciée. :)

EDIT: Pour que ce ne soit pas déroutant, je voulais vous faire savoir qu'il y a 3 fichiers différents, testservers.txt contient les HOSTNAMES, pingtest.txt a des résultats de ping, et result.txt aura les IP ainsi que les noms d'hôte avec leur statut actuel en tant que DOWN ou UP.

6
Gutsygibbon

Eh bien, il est regrettable que vous n’ayez pas posté votre propre code également, afin qu’il puisse être corrigé.
Quoi qu'il en soit, voici ma propre solution à ceci:

@echo off
setlocal enabledelayedexpansion

set OUTPUT_FILE=result.txt
>nul copy nul %OUTPUT_FILE%
for /f %%i in (testservers.txt) do (
    set SERVER_ADDRESS=ADDRESS N/A
    for /f "tokens=1,2,3" %%x in ('ping -n 1 %%i ^&^& echo SERVER_IS_UP') do (
        if %%x==Pinging set SERVER_ADDRESS=%%y
        if %%x==Reply set SERVER_ADDRESS=%%z
        if %%x==SERVER_IS_UP (set SERVER_STATE=UP) else (set SERVER_STATE=DOWN)
    )
    echo %%i [!SERVER_ADDRESS::=!] is !SERVER_STATE! >>%OUTPUT_FILE%
)

La boucle externe parcourt les hôtes et la boucle interne analyse la sortie ping. Les deux premières instructions if traitent les deux cas possibles de résolution d'adresse IP:

  1. Le nom d'hôte est l'adresse IP de l'hôte.
  2. L'adresse IP de l'hôte peut être résolue à partir de son nom.

Si l'adresse IP de l'hôte ne peut pas être résolue, l'adresse est réglée sur "ADRESSE N/A".

J'espère que cela t'aides.

19
Eitan T

Il est difficile d'analyser pingtest.txt pour chaque nom d'hôte et résultat avec batch, car le nom et le résultat figurent sur des lignes différentes.

Il est beaucoup plus facile de tester directement le résultat (le code d'erreur renvoyé) de chaque commande PING au lieu de le rediriger vers un fichier. Il est également plus efficace de placer la construction entière entre parenthèses et de rediriger la sortie finale une seule fois.

>result.txt (
  for /f %%i in (testservers.txt) do ping -n 1 %%i >nul && echo %%i UP||echo %%i DOWN
)
4
dbenham

Essaye ça 

$servers = Get-Content test.txt

$reg=""

foreach ($server in $servers) 

{

$reg=$reg+$server+"`t"+([System.Net.Dns]::GetHostAddresses($server) | foreach {echo $_.IPAddressToString})+"`n"

 }
$reg >reg.csv
0
Naveen Sharma

Cela a très bien fonctionné. Je viens d’ajouter l’option -a à ping pour résoudre le nom de domaine. Merci https://stackoverflow.com/users/4447323/wombat

@Écho off setlocal enabledelayedexpansion set OUTPUT_FILE = result.csv

>nul copy nul %OUTPUT_FILE%
echo HOSTNAME,LONGNAME,IPADDRESS,STATE >%OUTPUT_FILE%
for /f %%i in (testservers.txt) do (
    set SERVER_ADDRESS_I=UNRESOLVED
    set SERVER_ADDRESS_L=UNRESOLVED
    for /f "tokens=1,2,3" %%x in ('ping -n 1 -a %%i ^&^& echo SERVER_IS_UP') do (
    if %%x==Pinging set SERVER_ADDRESS_L=%%y
    if %%x==Pinging set SERVER_ADDRESS_I=%%z
        if %%x==SERVER_IS_UP (set SERVER_STATE=UP) else (set SERVER_STATE=DOWN)
    )
    echo %%i [!SERVER_ADDRESS_L::=!] !SERVER_ADDRESS_I::=! is !SERVER_STATE!
    echo %%i,!SERVER_ADDRESS_L::=!,!SERVER_ADDRESS_I::=!,!SERVER_STATE! >>%OUTPUT_FILE%
)
0
mkemp

J'ai travaillé sur le code donné plus tôt par Eitan-T et retravaillé pour sortir en fichier CSV. Les résultats trouvés dans le code précédent ne donnaient pas toujours les valeurs correctes, je l’ai donc amélioré.

testservers.txt

SOMESERVER
DUDSERVER

résultats.csv

HOSTNAME    LONGNAME                    IPADDRESS   STATE 
SOMESERVER  SOMESERVER.DOMAIN.SUF       10.1.1.1    UP 
DUDSERVER   UNRESOLVED                  UNRESOLVED  DOWN 

pingtest.bat

 @echo off
    setlocal enabledelayedexpansion
    set OUTPUT_FILE=result.csv

    >nul copy nul %OUTPUT_FILE%
    echo HOSTNAME,LONGNAME,IPADDRESS,STATE >%OUTPUT_FILE%
    for /f %%i in (testservers.txt) do (
        set SERVER_ADDRESS_I=UNRESOLVED
        set SERVER_ADDRESS_L=UNRESOLVED
        for /f "tokens=1,2,3" %%x in ('ping -n 1 %%i ^&^& echo SERVER_IS_UP') do (
        if %%x==Pinging set SERVER_ADDRESS_L=%%y
        if %%x==Pinging set SERVER_ADDRESS_I=%%z
            if %%x==SERVER_IS_UP (set SERVER_STATE=UP) else (set SERVER_STATE=DOWN)
        )
        echo %%i [!SERVER_ADDRESS_L::=!] !SERVER_ADDRESS_I::=! is !SERVER_STATE!
        echo %%i,!SERVER_ADDRESS_L::=!,!SERVER_ADDRESS_I::=!,!SERVER_STATE! >>%OUTPUT_FILE%
    )
0
Wombat

@Écho off

set workdir = {votre répertoire de travail par exemple - C:\work} set iplist =% workdir%\IP-list.txt

setlocal enabledelayedexpansion
set OUTPUT_FILE=%workdir%\result.csv

>nul copy nul %OUTPUT_FILE%
echo HOSTNAME,LONGNAME,IPADDRESS,STATE >%OUTPUT_FILE%
for /f %%i in (%iplist%) do (
    set SERVER_ADDRESS_I=UNRESOLVED
    set SERVER_ADDRESS_L=UNRESOLVED
    for /f "tokens=1,2,3" %%x in ('ping -a -n 1 %%i ^&^& echo SERVER_IS_UP') do (
    if %%x==Pinging set SERVER_ADDRESS_L=%%y
    if %%x==Pinging set SERVER_ADDRESS_I=%%z
        if %%x==SERVER_IS_UP (set SERVER_STATE=UP) else (set SERVER_STATE=DOWN)
    )
    echo %%i [!SERVER_ADDRESS_L::=!] !SERVER_ADDRESS_I::=! is !SERVER_STATE!
    echo %%i,!SERVER_ADDRESS_L::=!,!SERVER_ADDRESS_I::=!,!SERVER_STATE! >>%OUTPUT_FILE%
)
0
Marcuscus

le problème avec ping est que si l'hôte n'est pas actif, votre ordinateur local répondra souvent que l'hôte cinglé n'est pas disponible. Le code d'erreur de ping sera donc 0 et votre code s'exécutera par erreur car il ne reconnaît pas l'état hors tension.

mieux le faire de cette façon

ping -n 4 %1 | findstr TTL
if %errorlevel%==0 (goto :eof) else (goto :error)

de cette façon, vous cherchez une chaîne typique ttl qui est toujours dans le résultat de ping bien fait et vérifiez l'erreur sur ce findstr au lieu d'irriter le ping

globalement cela ressemble à ceci:

@echo off
SetLocal


set log=path/to/logfile.txt
set check=path/to/checkfile.txt

:start
echo. some echo date >>%log%

:check
for /f %%r in (%check%) do (call :ping %%r)
goto :eof

:ping
ping -n 4 %1 | findstr TTL
if %errorlevel%==0 (goto :eof) else (goto :error)

:error
echo. some errormessage to >>%log%
echo. some blat to mail?

:eof
echo. some good message to >>%log%
0
peet

Cela fonctionne pour le système d'exploitation espagnol.

Le script accepte deux paramètres:

  • un fichier avec la liste des IP ou des domaines
  • fichier de sortie

script.bat listofurls.txt output.txt

@echo off
setlocal enabledelayedexpansion
set OUTPUT_FILE=%2
>nul copy nul %OUTPUT_FILE%
for /f %%i in (%1) do (
    set SERVER_ADDRESS=No se pudo resolver el Host
    for /f "tokens=1,2,3,4,5" %%v in ('ping -a -n 1 %%i ^&^& echo SERVER_IS_UP') 
    do (
        if %%v==Haciendo set SERVER_ADDRESS=%%z
        if %%v==Respuesta set SERVER_ADDRESS=%%x
        if %%v==SERVER_IS_UP (set SERVER_STATE=UP) else (set SERVER_STATE=DOWN)
    )
    echo %%i [!SERVER_ADDRESS::=!] is !SERVER_STATE! >>%OUTPUT_FILE%
    echo %%i [!SERVER_ADDRESS::=!] is !SERVER_STATE!
)
0
Pablo Videla