Hola
Tengo hecho un script en linux que comprueba si un gateway esta funcionando y en caso de que no responda pues el script cambia de gateway.
Lo que quiero es utilizar este Script en windows pero no se en que lenguaje script para windows implementarlo
Tengo conocimientos de VB y estaba animado a hacerlo en VBScript pero por lo que he leido este tipo de lenguaje esta orientado para las paginas html y no se si se puede utilizar si no se embebe en estas paginas
¿Esto es asi?
¿Podriais recomendarme algun lenguaje en el que pueda implementar el script y que no me obligue a instalar nada a mayores en los equipos windows?
Gracias y un saludo
Vbs se puede usar como un lenguaje independiente de una pagina html.... si te fijas bien, basta con poner msgbox "esto es una prueba"
, en cualquier editor de texto, como el notepad, y guardarlo con la extension vbs, y listo...
salu2
ok, gracias por tu respuesta
Lo intentare hacer entonces con vbscript
salu2
Un leguaje de scripting mas basico es batch, podrias usar el comando ipconfig, ping y route. Si te entendido bien con estos comandos podras hacer el script que tenias en linux.
Si tengo tiempo lo hare yo y lo posteo, la idea esta bien.
te pego mi codigo por si te sirve de ayuda:
ahi te va:
#! /bin/sh
a=0
r1="169.254.0.27"
r2="169.254.0.200"
while true
do
ping -c 4 169.254.1.1 > /dev/null
case $? in
0)
logger "Hay red, todo Ok"
echo "todo ok"
a=0;;
*)
ping -c 4 `route -n | grep UG | awk '{print $2}'` > /dev/null
case $? in
0)
if [ `route -n | grep UG | awk '{print $2}'` = "$r1" ]
then
echo "Eliminando 0.27 red interna ok"
route del -net `route -n | grep UG | awk '{print $1}'` netmask 255.255.255.0
echo "...eliminada"
echo "Añadiendo nuevo GW"
route add -net 169.254.1.0 netmask 255.255.255.0 gw 169.254.0.200
echo "Nuevo GW añadido"
else
echo "Eliminando 0.200"
route del -net `route -n | grep UG | awk '{print $1}'` netmask 255.255.255.0
echo "...eliminada"
echo "Añadiendo nuevo GW"
route add -net 169.254.1.0 netmask 255.255.255.0 gw 169.254.0.27
echo "Nuevo GW añadido"
fi;;
*)
if [ `route -n | grep UG | awk '{print $2}'` = "$r1" ]
then
ping -c 4 $r2 > /dev/null
case $? in
0)
echo "Eliminando 0.27.Fallo en r1"
route del -net `route -n | grep UG | awk '{print $1}'` netmask 255.255.255.0
echo "...eliminada"
echo "Añadiendo nuevo GW"
route add -net 169.254.1.0 netmask 255.255.255.0 gw $r2
echo "Nuevo GW añadido";;
*)
echo "Error en la red interna.";;
esac
else
ping -c 4 $r1 > /dev/null
case $? in
0)
echo "Eliminando 0.27.Fallo en r2"
route del -net `route -n | grep UG | awk '{print $1}'` netmask 255.255.255.0
echo "...eliminada"
echo "Añadiendo nuevo GW"
route add -net 169.254.8.0 netmask 255.255.255.0 gw $r1
echo "Nuevo GW añadido";;
*)
echo "Error en la red interna. Revisar Capa fisica";;
esac
fi;;
esac
esac
sleep 5
done
Cualquier duda, no dudes en preguntarme
Gracias
Ya lo tengo casi traducido, pero tengo algunas dudas.
ping -c 4 `route -n | grep UG | awk '{print $2}'` > /dev/null
Que hace?
if [ `route -n | grep UG | awk '{print $2}'` = "$r1" ]
Aqui comprueba si algo es igual a la variable $r1, que es ese algo?
Es lo unico que me falta por traducir ....
Bueno, yo tambien lo estaba pasando a vbs........ pero tengo problemas para obtener el gateway actual.... para asi cambiar al otro, segun caso y caso, tengo el code que encontre por ahi, pero no me funciona... igual no me termina de quedar claro el code anterior.... eso me pasa por no adentrarme mas en linux :-\
Código:
ping -c 4 `route -n | grep UG | awk '{print $2}'` > /dev/null
Esta linea hace un ping al gateway por defecto. Para obtener la ip del gw activo utilizo "route -n | grep UG | awk '{print $2}"
He encontrado un editor llamado VBSEdit y que trae ejemplos ya hechos de como hacer ping y como cambiar el gw
Estoy peleandome con esos codigos para ver si lo doy quitado
Ya os comentare
Salu2
Vbsedit facilita mucho las cosas, no me acordaba de los ejemplos que tenia.. igualmente tengo los codes necesario.. bueno , eso creo, si quieres es mas sencillo explicarte, o armarte tu script a partir de lo que tienes......
salu2
Algo asi..
funciona de manera distinta.
@echo off
:: Completar estas variables...
set gw alternativo1=
set gw alternativo2=
ping 169.254.1.1 > nul
if %errorlevel%==0 (
echo "Todo Ok"
echo "Hay red, todo ok >> ruta_log
exit /B
)
:: Conseguir puerta de enlace...
ipconfig | find "Puerta de enlace predeterminada . . . . . 1" > %TMP%\fr.tmp
for /F "tokens=11" %%A IN (%TMP%\fr.tmp) DO set gw actual=%%A
echo Puerta de enlace actual: %gw actual%
echo Comprobando disponibilidad...
ping %gw actual%
if %errorlevel% NEQ 0 (
echo %gw actual% no disponible)
echo Comprobando disponibilidad de puertas de enlace alternativas.
ping %gw alternativo1% > nul
if %errorlevel%==0 call:ngw %gw alternativo1%
ping %gw alternativo2% > nul
if %errorlevel%==0 call:ngw %gw alternativo2%
) ELSE ( echo %gw actual disponible% & exit /B )
:ngw
route change MASK 255.255.255.0 %1 METRIC métrica IF numero_interfaz
echo Puerta de enlace actual %1
ping -n 6 127.0.0.1 > nul
exit /B
Tienes que modificar las variables del principio y la función ngw.
Lo que hace es un ping a una dirección, si responde bien dice que todo ok, si no, hace un ping al gw actual, si no funciona hace pings a los gw alternativos y si responden usa el comando route para cambiarlos.
Habra que usar un ipconfig /release o /renew ???
Neox, gracias por el codigo que has posteado, en cuanto tenga un momento lo pruebo.
De todas formas sigo intentando hacerlo en vbscript ya solo por cabezoneria
Una ultima pregunta,¿Como hariais para ejecutar este programa en win, ya que lo que quiero es que se ejecute desde que se inicia windows y que se ejecute cada x tiempo para comprobar que el pc no se queda sin red?
Lo que he pensado es ejecutarlo a traves de una tarea programada
¿Se os ocurre alguna otra idea?
Salu2
Pues a mi en Batch si, supongo que lo podras aplicar a VBScript.
Agregas una clave en el registro para que se inicie siempre con el PC o lo copias en la carpeta de inicio.
Y usas el comando AT para que por ejemplo en la proxima media hora ejecute el script.
gracias neox por la ayuda que me has prestado
En general gracias a todos
salu2
hola a todos,,
Sigo peleandome con el dichoso script en VB Script.
Tengo el siguiente problema al intentar hacer ping con el siguiente codigo:
If Reachable("169.254.0.22") Then
WScript.Echo "Computer is Reachable!"
Else
'WScript.Echo "Computer is Unreachable!"
End If
Function Reachable(strComputer)
Set objShell = Wscript.CreateObject("Wscript.Shell")
objShell.exec ("%comspec% /k ping 169.254.0.22") & " > c:\t.txt"
End Function
Cuando se ejecuta esta linea "objShell.exec ("%comspec% /k ping 169.254.0.22") & " > c:\t.txt" no se consigue hacer ping, es decir parece que no se lanza la utilidad ping, se crea el archivo de texto t.txt y este aparece vacio
pero por el contrario si ejecutas
objShell.exec ("%comspec% /k ipconfig") & " > c:\t.txt"
entonces este comando si se ejecuta y si redireciona el contenido de este al archivo de texto
He probado con otros comandos como el net view y tb funciona
Tb he probado con el comando run:objShell.Run ("%comspec% /k ping 169.254.0.22") & " > c:\t.txt" y tampoco funciona
No se porque ciertos comandos si se ejecutan y otros no, alguien sabe por que puede ser??
NOTA: el comando objShell.exec ("%comspec% /k ping 169.254.0.22") & " > c:\t.txt" funciona bien porque lo he probado desde inicio ejecutar y se lanza sin problemas
Por favor os pediria que si podeis probeis el codigo de arriba en algun pc que tenga win 2000 o XP, yo lo he probado en ambos SO y en ninguno me ha funcionado y me parece extraño porque todo lo que he encontrado sobre como realizar un ping desde vb Script, incluido el technet de microsoft, indica que se realiza asi sin problemas
PD: una advertencia, al ejecutar el codigo de arriba sobre win 2000 me empezaba a abrir cientos de ventanas de msdos , casi bloqueandome el equipo, asi que ojo si lo probais!!
salu2
"
Mira esto a ver si te sirve:
:: Autor: pantocrator
:: MAs información: http://pantocrator-blog.blogspot.com/
@Echo OFF
echo [requerido] Primer parametro %1 es para ip estatica.
echo [requerido] Segundo parametro %2 es la mascara de red.
echo [requerido] Tercer parametro %3 es la puerta de enlace.
echo [opcional] Cuarto parametro %4 es el servidor dns primario
If [%1] == [] GOTO QUIT
If [%2] == [] GOTO QUIT
If [%3] == [] GOTO QUIT
echo Starting %0
Echo ....................Configurando IP address en Conexi¢n de rea local a %1 con NetMask %2
netsh interface ip set address name="Conexi¢n de rea local" source=static addr=%1 mask=%2
Echo ....................Configurando Gateway en Conexi¢n de rea local a %3
netsh interface ip set address name="Conexi¢n de rea local" gateway=%3 gwmetric=1
If [%4] == [] GOTO QUIT
Echo ....................Configurando DNS en Conexi¢n de rea local a %4
netsh interface ip set dns name="Conexi¢n de rea local" source=static addr=%4 register=primary
GOTO QUIT
:QUIT
ECHO ON
neox gracias por ese codigo, pero no me sirve ya que para cambiar ip, dns o gw no tengo problema desde VB, el problema lo tenia haciendo ping pero ya he dado con el problema que era el siguiente; en la linea
" objShell.exec ("%comspec% /k ping 169.254.0.22") & " > c:\t.txt" "
falta añadirle al comando ping el p..ñ...tero .exe quedando de esta forma
objShell.exec ("%comspec% /k ping.exe 169.254.0.22") & " > c:\t.txt"
No se por que sin el .exe no funciona, ya que todos los codigos que he visto estaban sin el, pero bueno que se le va a hacer
de todas formas agradezco tu codigo porque no conocia el comando netsh y me parece bastante interesante y util
Cuando tenga todo el codigo del script lo posteo por si le puede interesar a alguien
salu2
ahi os queda el codigo del script en vb script por si le interesa a alguien
Dim DefaultGw,GwR,GwTel
GwR="169.254.0.27"
GwTel="169.254.0.200"
If RedUp Then
If Reachable("169.254.0.8") Then
'WScript.Echo "Computer is Reachable!"
Else
gw
If Reachable(DefaultGw) Then
CambiaGw
Else
If DefaultGw=GwR Then
If Reachable(GwTel) Then
CambiaGw
Else
WScript.Echo "Fallo en la red. Comprobar cable de red"
End If
ElseIf DefaultGw=GwTel Then
If Reachable(GwR) Then
CambiaGw
Else
WScript.Echo "Fallo en la red. Comprobar cable de red"
End If
End If
End If
End If
End If
'''''''''''''''''''''''''''''''''''PING''''''''''''''''''''''''''''''''''''''''''
Function Reachable(strComputer)
Set objShell = Wscript.CreateObject("Wscript.Shell")
Set objExecObject = objShell.Exec ("cmd /C ping.exe -n 4 " & strComputer )
Do While Not objExecObject.StdOut.AtEndOfStream
strText = objExecObject.StdOut.ReadLine()
If (Instr(strText, "perdidos = 0") > 0) Or (Instr(strText, "perdidos = 1") > 0) Then
Reachable=true
Exit Do
End If
Loop
End Function
''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''obtener gw''''''''''''''''''''''''
sub gw ()
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set DefaultGW = objWMIService.ExecQuery _
("Select DefaultIPGateway from Win32_NetworkAdapterConfiguration Where IPEnabled=TRUE")
For Each DfGw In DefaultGW
If Not IsNull(DfGw.DefaultIPGateway) Then
For i=LBound(DfGw.DefaultIPGateway) to UBound(DfGw.DefaultIPGateway)
DefaultGw=DfGw.DefaultIPGateway(i)
Next
End If
Next
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''COMPROBAR SI LA INTERFAZ ESTA UP'''''''''''''''''''''
Function RedUp()
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set DefaultGW = objWMIService.ExecQuery _
("Select DefaultIPGateway from Win32_NetworkAdapterConfiguration Where IPEnabled=TRUE")
For Each DfGw In DefaultGw
If IsNull(DfGw.DefaultIPGateway) Then
WScript.Echo "Fallo en la red. Comprobar cable de red"
Else
RedUp=True
End If
Next
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''CAMBIAR GW''''''''''''''''
Function CambiaGw
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colNetCards = objWMIService.ExecQuery _
("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True")
For Each objNetCard in colNetCards
WScript.Echo "vamos a cambiar a ..." & DefaultGw
If DefaultGw=GwR Then
arrGateways = Array(GwTel)
objNetCard.SetGateways(arrGateways)
ElseIf DefaultGw=GwTel Then
arrGateways = Array(GwR)
objNetCard.SetGateways(arrGateways)
End If
Next
End Function
''''''''''''''''''''''''''''''''''''''''''''''''''''
saludos