Usare Ping In Script Batch

Tempo fa avevo presentato un articolo che mostra come utilizzare il comando ping all’interno di un batch script:

http://www.morzello.com/dblog/articolo.asp?articolo=41

Come spiegato, il comando restituisce sempre lo stesso errorlevel, rendendo vano un eventuale tentativo di capire se il ping è andato a buon fine o meno all’interno di uno script.

Oggi presento una variante che consente di ottenere lo stesso risultato senza dover scrivere codice vbscript.

Di seguito trovate un piccolo file .BAT (o .CMD) che potete utilizzare per testare l’esito di un ping:

ping nomeserver | findstr "TTL="
echo %errorlevel%

Mentre il comando ping restituisce sempre lo stesso errorlevel, findstr discrimina l’uscita a seconda che nell’output esista o meno una corrispondenza utile. A questo punto possiamo testare l’uscita del comando findstr invece che di ping.

Alla prossima.

Sono io oppure il sito è proprio giù?

Ieri mi è capitato di impazzire nel tentativo di capire se il sito di Google fosse giù o se più semplicemente era la mia connessione ad avere problemi.

Poi ho trovato un modo semplice e veloce di fare una verifica.

In pratica ho demandato ad un sito posto dall’altro capo del mondo di fare una richiesta al server da parte mia. Si tratta di un metodo alternativo all’uso di ping e traceroute vari dal momento che non fa uso di traffico icmp.

Per chi volesse fare un giro sul sito in questione, di seguito troverà il link:

http://downforeveryoneorjustme.com/

Per chi volesse testare direttamente la destinazione dall’url può digiare il link nel formato:

http://downforeveryoneorjustme.com/nomesito dove per nomesito si intende il nome dell’host.

Per Google ad esempio potreste scrivere:

http://downforeveryoneorjustme.com/www.google.com

Alla prossima.

Un frontend per Ping e WOL in Windows

Nei precedenti articoli di questo blog si è parlato di come sfruttare il protocollo wol ed il comando ping di windows per gestire l’accensione e lo spegnimento di un computer remoto.

Poichè si è fatto uso di script a riga di comando, ho ricevuto alcune email in cui viene richiesta una possibile soluzione “a finestre”.

Purtroppo il mio tempo a disposizione non è molto ma sfruttando comunque il linguaggio di scripting (vbscript) sono riuscito a fare un piccolo applicativo in grado di mostrare lo stato (acceso/spento) di computer appartenenti alla stessa rete con la possibilità di usare il protocollo wol nel caso in cui questi risultassero spenti.

L’esempio che segue consiste in una pagina html di tipo Microsoft (R) HTML Application host (con estensione hta)


<HTML>
<HEAD>
<TITLE>Pannello di Controllo</TITLE>

<HTA:APPLICATION
     ID=”objPannello”
     APPLICATIONNAME=”Pannello di Controllo”
     SCROLL=”No”
     SINGLEINSTANCE=”yes”
>

<SCRIPT LANGUAGE=”VBScript”>
<!–
  option Explicit
  dim strTR
  dim aServer(5)

  aServer(0)=”tizio.local”
  aServer(1)=”caio.local”
  aServer(2)=”sempronio.local”
  aServer(3)=”cesare.local”
  aServer(4)=”cleopatra.local”
  aServer(5)=”antonio.local”
  
  strTR=”<tr>” & _
    ”<td>+SERVERNAME+</td>” & _
    ”<td>+STATUS+</td>” & _
    ”<td>+COMMAND+</td>” & _
    ”</tr>”

  

  function ServerView(ServerName)

    dim objShell, objExec
    dim strPingResult
  
    Set objShell = CreateObject(“WScript.Shell”)
    Set objExec = objShell.Exec(“ping -n 2 -w 1000 ” & ServerName)

    strPingResult = UCase(objExec.StdOut.ReadAll)
    
    ServerView= ( CBool(InStr(UCase(strPingResult), ” TTL=”)))

  end function

  function ServerCommand(ServerName)
    dim objShell
    Set objShell = CreateObject(“WScript.Shell”)  
    objShell.run(“wol.bat ” & replace(ServerName,”.local”,”"))

  end function

–>

</SCRIPT>
</HEAD>
<BODY >
<H3>Pannello di Controllo</H3>
<HR>
<FORM NAME=”ValidForm”>  

<table width=”100%”>
<tr>

<td width=”50%”><b>Server</b></td>
<td width=”20%”><b>Status</b></td>

<td width=”30%”><b>Comandi</b></td>

</tr>

<SCRIPT LANGUAGE=”VBScript”>
<!–
  dim Ciclo
  dim strOutPut, strServerStatus

  dim blserverStatus

  Self.ResizeTo 575,475

  for Ciclo=lbound(aServer) to ubound(aServer)
    blServerStatus=ServerView(aServer(Ciclo))
    if blServerStatus then
      strServerStatus=”ON”
      strCommand=”Attivo”
    else
      strServerStatus=”OFF”
      strCommand=”<INPUT onclick=’ServerCommand(“”" & aServer(Ciclo) & “”")’ NAME=’” & aServer(Ciclo) & “‘ TYPE=’BUTTON’ VALUE=’Attiva’>”
      ’msgbox “<INPUT onclick=’ServerCommand(“”" & aServer(Ciclo) & “”")’ NAME=’” & aServer(Ciclo) & “‘ TYPE=’BUTTON’ VALUE=’Attiva’>”
    end if
    strOutput= replace(strTR,”+SERVERNAME+”,aServer(Ciclo))
    strOutput= replace(strOutput,”+STATUS+”,strServerStatus)
    strOutput= replace(strOutput,”+COMMAND+”,strCommand)  

    document.write strOutput
  next

–>
</script>

</table>
<hr>
<INPUT NAME=”Submit” TYPE=”BUTTON” VALUE=”Aggiorna” onclick=”Location.Reload(True)”>
</FORM>
</BODY>
</HTML>

Potete nominare questo file come volete, purchè mantenga l’estensione hta, altrimenti windows non ne consentirà l’esecuzione.

Prima di concludere volevo ricordare che per maggiori informazioni sul wol, potete dare una occhiata questo articolo.

Alla prossima.

Un ping per Windows con Errorlevel

Tempo fa ho pubblicato un articolo nel quale si fa uso del comando ping per capire se un computer è acceso oppure no.

Purtroppo il comando ping di windows, almeno nella versione in mio possesso, non ha una gestione degli ERRORLEVEL in uscita; in pratica alla fine della esecuzione, restituisce sempre il medesimo valore, sia che il ping abbia successo o meno, rendendo vane le possibilità di impiegarlo all’interno di uno script.

Di seguito presento un breve listato scritto in vbscript che esegue il comando ping e restituisce un codice di errore in modo da poterlo sfruttare all’interno di un file batch dos.

‘######################################
‘ServerPing.vbs ver 1.0
‘di Benintende Vittorio

‘Questo software viene rilasciato sotto
‘licenza GPL e senza garanzia alcuna.
‘######################################

‘Il seguente codice esegue un Ping e tiene
‘traccia dell’output generato per capire
‘l’esito del comando.

‘Poichè quando il comando va a buon fine
‘contiene sempre il TTL del pacchetto
‘inviato, se l’output contiene “TTL=” nella
‘sequenza di caratteri allora si presume che
‘il ping abbia raggiunto la destinazione.

‘Di seguito due esempi esplicativi:

‘Esempio 1:
‘Esecuzione di Ping 192.168.0.1 con 32 byte di dati:

‘Risposta da 192.168.1.20: Host di destinazione irraggiungibile.
‘Risposta da 192.168.1.20: Host di destinazione irraggiungibile.
‘Risposta da 192.168.1.20: Host di destinazione irraggiungibile.
‘Richiesta scaduta.

‘Statistiche Ping per 192.168.0.1:
‘ Pacchetti: Trasmessi = 4, Ricevuti = 3, Persi = 1 (25% persi),
‘Tempo approssimativo percorsi andata/ritorno in millisecondi:
‘ Minimo = 0ms, Massimo = 0ms, Medio = 0ms

‘Esempio 2:
‘Esecuzione di Ping 192.168.0.1 con 32 byte di dati:

‘Risposta da 192.168.0.1: byte=32 durata=73ms TTL=64
‘Risposta da 192.168.0.1: byte=32 durata=87ms TTL=64
‘Risposta da 192.168.0.1: byte=32 durata=103ms TTL=64
‘Risposta da 192.168.0.1: byte=32 durata=68ms TTL=64

‘Statistiche Ping per 192.168.0.1:
‘ Pacchetti: Trasmessi = 4, Ricevuti = 4, Persi = 0 (0% persi),
‘Tempo approssimativo percorsi andata/ritorno in millisecondi:
‘ Minimo = 68ms, Massimo = 103ms, Medio = 82ms

option explicit

dim strMyComputer
Dim objExec, objArgs, objShell
Dim strPingResults
dim lngPos

‘command line
Set objArgs = WScript.Arguments

For lngPos = 0 to objArgs.Count – 1
Select Case UCase(objArgs(lngPos))
Case Else
if cbool(len(trim(objArgs(lngPos)))) then strMyComputer=objArgs(lngPos)
End Select

Next

If not cbool(len(Trim(strMyComputer))) then wscript.quit(100)

Set objShell = CreateObject(“WScript.Shell”)
Set objExec = objShell.Exec(“ping -n 2 -w 1000 ” & strMyComputer)

strPingResults = UCase(objExec.StdOut.ReadAll)

wscript.quit(Not CBool(InStr(UCase(strPingResults), ” TTL=”)))

Per pingare l’indirizzo IP 192.168.0.1 da console ad esempio è sufficiente impartire la seguente istruzione:

cscript ServerPing.vbs 192.168.0.1

Ad esempio è possibile utilizzare il precedente script per accedere a condivisioni di rete solo quando queste sono raggiungibili:

::
:: abilita gli shares se i server sono attivi
::

@ECHO OFF
SET LOGFILE=”%APPDATA%\_share.log”
SET DOMAIN=miodominio
SET SERVER1=tizio
SET SERVER2=caio
SET SERVER3=sempronio

ECHO ———- >> %LOGFILE%
DATE /T >> %LOGFILE%
TIME /T >> %LOGFILE%
ECHO Looking for shares at %SERVER1% >> %LOGFILE%

cscript ServerPing.Vbs %SERVER1%.%DOMAIN% >NUL 2>&1

IF ERRORLEVEL 0 GOTO SETSERVER1
GOTO SERVER2

:SETSERVER1
ECHO Try to mount M: Drive (share1 on %SERVER1%) >> %LOGFILE%
NET USE M: \\%SERVER1%.%DOMAIN%\share1 >NUL 2>&1
ECHO Exit with error %ERRORLEVEL% >> %LOGFILE%

ECHO Try to mount L: Drive (share_nascosto$ on %SERVER1%) >> %LOGFILE%
NET USE L: \\%SERVER1%.%DOMAIN%\share_nascosto$ >NUL 2>&1
ECHO Exit with error %ERRORLEVEL% >> %LOGFILE%

ECHO Try to mount N: Drive (foto on %SERVER1%) >> %LOGFILE%
NET USE N: \\%SERVER1%.%DOMAIN%\foto >NUL 2>&1
ECHO Exit with error %ERRORLEVEL% >> %LOGFILE%

:SERVER2
ECHO Looking for shares at %SERVER2% >> %LOGFILE%

cscript ServerPing.Vbs %SERVER2%.%DOMAIN% >NUL 2>&1

IF ERRORLEVEL 0 GOTO SETSERVER2
GOTO SERVER3

:SETSERVER2
ECHO Try to mount O: Drive (share1 on %SERVER2%) >> %LOGFILE%
NET USE O: \\%SERVER2%.%DOMAIN%\share1 >NUL 2>&1
ECHO Exit with error %ERRORLEVEL% >> %LOGFILE%

:SERVER3

IF %COMPUTERNAME%==%SERVER3% GOTO GOEXIT

ECHO Looking for shares at %SERVER3% >> %LOGFILE%

cscript ServerPing.Vbs %SERVER3%.%DOMAIN% >NUL 2>&1

IF ERRORLEVEL 0 GOTO SETSERVER3
GOTO GOEXIT

:SETSERVER3
ECHO Try to mount P: Drive (Share1 on %SERVER3%) >> %LOGFILE%
NET USE P: \\%SERVER3%.%DOMAIN%\share1 >NUL 2>&1
ECHO Exit with error %ERRORLEVEL% >> %LOGFILE%

:GOEXIT

SET LOGFILE=
SET DOMAIN=
SET SERVER1=
SET SERVER2=
SET SERVER3=

Con questo ho finito.
Alla prossima.