¿Cómo puedo probar en mi script si estoy en mi red doméstica?

3

Necesito ejecutar un archivo por lotes cuando desbloqueo la computadora y, en parte, debe probar si estoy o no en mi red doméstica.

Mi solución actual implica hacer ping al HTPC y suponer que si se puede encontrar, entonces estoy en casa. Soy consciente de que esta no es la mejor solución; para empezar, si el HTPC está apagado, fallará.

rem Ping the HTPC 4 times, pausing every 5 seconds.
for /l %%A in (1,1,4) do (
    timeout 5 >NUL
    ping MyHTPC -n 3 | find "TTL=" > NUL
    if not ERRORLEVEL 1 goto working
)
rem The HTPC cannot be found, so we're probably somewhere else    
[other code here]
exit

:working
rem The HTPC can be found, so we're probably at home
[other code here]

¿Hay una forma más robusta de hacer esto?

Richard
fuente
¿Podrías hacer algo como esto? pastebin.com/rTFNtp75 donde agregue la dirección de su enrutador mac como la variable $ mac. Puedes conseguir esto corriendo arp -a
HelpingHand
@EMK Eso es básicamente lo que escribí en mi respuesta, pero usando un poco de magia oscura de PowerShell / WMI. Se puede hacer solo con los comandos CMD (ipconfig / find / arp y usando FOR para analizar la puerta de enlace de la información de ipconfig).
Tonny

Respuestas:

3

He estado allí, hecho eso.

Primero verifique / espere si su red está realmente conectada en el primer lugar y si tiene TCPIP activado. (En el caso de que la conexión de Wi-Fi se realice después del inicio de sesión, es posible que su secuencia de comandos comience antes de que realmente funcione.)
La salida "ipconfig" (SIN el parámetro / all) solo mostrará las interfaces que estén UP y la dirección IP de la puerta de enlace predeterminada.

Luego haga ping a la puerta de enlace predeterminada, que debería ser su enrutador (supongo que siempre está encendido).
Luego grep la salida de "arp -a" para ver si la dirección MAC de su enrutador está allí. (Si utiliza tanto la verificación por cable como la inalámbrica para ambas direcciones MAC. Probablemente NO sean las mismas).
Esta verificación de la dirección MAC también detecta el caso en el que se encuentra en la red de otra persona donde el enrutador tiene la misma dirección IP que tiene en casa.

Y no hay necesidad de hacer esto 4 veces con retrasos (supongo que es un intento de que el HTPC deje de estar en modo de suspensión si es necesario). Solo 1 ping (que bajo Windows hace 4 pings con 1 segundo de retraso de todos modos) al enrutador es suficiente.
El enrutador responderá (para que pueda verificar el MAC) o no lo hace, en cuyo caso algo está realmente mal con la red y, de todos modos, es inutilizable.

El código a continuación se prueba en Windows 10. Estoy bastante seguro de que funcionará en cualquier versión de Windows NT.

@echo off
set mymac=ac-9e-17-96-6e-60

set delayedexpansion=on

rem Pull the default gateways from ipconfig and extract the one with a value.
rem Carefull! There is 1 extra space before the ip-address.

for /F "delims=: tokens=2 usebackq" %%a in ( `ipconfig ^| find /I "default gateway"` ) do (
  if NOT "%%a."==" ." set IP=%%a
)
echo Default gateway:%IP%

rem Ping it to make sure it appears in arp -a output
ping -n 1 %IP% >nul

rem Filter the line with the ip-address and MAC from arp -a and take action if found
arp -a | find /I "%IP%" | find /I "%mymac%"
if errorlevel 1 (echo Not found: Not at home) else ( echo I'm at home)
Tonny
fuente
Funciona muy bien, gracias! La razón por la que lo hice 4 veces con demoras fue porque a veces el WiFi no se conectaba lo suficientemente rápido, por lo que el script esperaría hasta 20 segundos para que estuviera listo.
Richard
@Richard La otra alternativa es hacer un bucle de For / F en mi versión hasta que se establezca la IP. Eso requeriría una construcción muy fea de GOTO sin embargo. Si no le importa que los 20 segundos de retraso, su solución a ese problema está bien.
Tonny
No debería set delayedexpansion=on ser setlocal EnableDelayedExpansion ? Las versiones recientes de Windows tienen Getmax.exe para recuperar el MAC.
LotPings
@LotPings Sí, debería ser setlocal. No noté el error porque siempre lo he habilitado por defecto. Getmac obtiene su propio mac. No la del router.
Tonny