Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: terrateck en 18 Junio 2013, 18:43 pm



Título: Script batch para ping
Publicado por: terrateck en 18 Junio 2013, 18:43 pm
Hola a todos,

Me gustaría que me ayudaseis a crear un batch para hacer ping y almacenar los resultados. Hasta ahora lo que he conseguido hacer es:

Código:
@echo off
setlocal
for /F "delims=" %%i in ('ping google.es -t') do echo %date% %time% %%i 1>> output.txt

Que al finalizar almacena los resultados en un documento TXT de salida.

Pero lo que me gustaría conseguir es una utilidad que vaya haciendo un ping solo cada 5 o 10 seg y almacene los datos en un TXT únicamente cuando se pierda un paquete, con la hora y la fecha correspondiente y en ese mismo momento, sin tener que finalizar la ejecución.
¿Sería posible?

Gracias.


Título: Re: Script batch para ping
Publicado por: Meine programmen en 18 Junio 2013, 21:36 pm
Quizas esto te sirva:

Código:
@ECHO OFF
SET /P numero=¨Numero de segundos entre cada ping?
:Ciclo
SET prueba=
ping localhost -n %numero% >nul
(ping google.es
echo %DATE% %TIME%)>1.txt
FOR /F "tokens=*" %%A IN ('findstr /N "    (0% perdidos)," 1.txt') DO (SET prueba=%%A)
IF NOT "%prueba%"=="" (GOTO Ciclo)
FOR /F "tokens=*" %%B IN ('TYPE 1.txt') DO (SET fecha=%%B)
echo Paquete perdido
echo Paquete perdido %fecha%>>"Paquetes perdidos.txt"
GOTO Ciclo


Título: Re: Script batch para ping
Publicado por: terrateck en 18 Junio 2013, 22:46 pm
Gracias por la ayuda, Meine programmen.

Lo he probado, pero tras introducir el numero de segundos y generarse el fichero 1.txt, me da el error de la sintaxis del comando no es correcta, y se cierra directamente.

¿Dónde puede estar el problema?


Título: Re: Script batch para ping
Publicado por: Meine programmen en 18 Junio 2013, 23:34 pm
Creo (Y solo creo) que ya lo arregle
Código:
@ECHO OFF
setlocal enabledelayedexpansion
SET /P numero=¨Numero de segundos entre cada ping?
:Ciclo
SET prueba=
ping localhost -n %numero% >nul
(ping google.es
echo %DATE% %TIME%)>1.txt
find /C /I "(0%% perdidos" "1.txt">2.txt
FOR /F "tokens=*" %%A IN ('TYPE 2.txt') DO (SET prueba=!prueba!%%A)
SET prueba=%prueba:---------- 1.TXT:=%
SET prueba=%prueba: =%
IF NOT "%prueba%"=="0" (GOTO Ciclo)
FOR /F "tokens=*" %%B IN ('TYPE 1.txt') DO (SET fecha=%%B)
echo Paquete perdido
echo Paquete perdido %fecha%>>"Paquetes perdidos.txt"
GOTO Ciclo
Cuando no hay paquetes perdidos funciona como deberia.


Título: Re: Script batch para ping
Publicado por: terrateck en 19 Junio 2013, 01:06 am
Hola,
Ya lo he probado y funciona correctamente, es justo lo que quería.
Gracias por la ayuda prestada.

Una cuestión: ¿por que en la instrucción find se busca "(0%% perdidos"? Me refiero al doble signo de porcentaje.


Título: Re: Script batch para ping
Publicado por: Royca3 en 19 Junio 2013, 01:49 am
Utiliso el Batch de Meine programmen pero no me guarda los resultados? es porque no hay problema y ningún paquete se pierde?

Saludos.


Título: Re: Script batch para ping
Publicado por: engel lex en 19 Junio 2013, 09:23 am
yo estuve haciendo algo similar XD termine haciendolo en C y al final luego de una semana tenia una masa de 300.000 lineas que no pude analizar XD

si consigo el exe te lo publico aqui


Título: Re: Script batch para ping
Publicado por: Meine programmen en 19 Junio 2013, 10:18 am
Una cuestión: ¿por que en la instrucción find se busca "(0%% perdidos"? Me refiero al doble signo de porcentaje.
Desde cmd el comando si que llevaria solo un signo %, pero en un .bat tienes que poner dos para que funcione. Con el comando FOR pasa lo mismo. No se exactamente por qué, pero es así.


Título: Re: Script batch para ping
Publicado por: engel lex en 19 Junio 2013, 10:19 am
aquí está

https://mega.co.nz/#!udQhzbIJ!MWfyeSP4ttCjbNdZ3EL8xClyVlp01-c_yRi_4dEo-jA
 (https://mega.co.nz/#!udQhzbIJ!MWfyeSP4ttCjbNdZ3EL8xClyVlp01-c_yRi_4dEo-jA)

el crea en la carpeta donde se ejecute un archivo llamado ping.txt con la info en el formato

Código:
2013-06-19 10:47AM. - Respuesta desde 201.248.76.20: bytes=32 tiempo=20ms TTL=59

si lo ejecutas
Código:
ping.exe -t 3
se hará ping cada 3 segundos (o los segundos que establescas luego de "-t") si no especificas nada, hará ping cada 1 segundo (sumado a la espera del ping, me dio pereza corregir eso)

si el ping falla puede decir que "tiempo de espera agotado" o simplemente dejarlo en blanco si el host lo da inaccesible... (tambien me dio pereza corregir eso)

hace ping contra google.com por si a las dudas...

el continua escribiendo el archivo donde lo dejó si lo cierras... espero te sea útil


Título: Re: Script batch para ping
Publicado por: terrateck en 19 Junio 2013, 14:34 pm
Utiliso el Batch de Meine programmen pero no me guarda los resultados? es porque no hay problema y ningún paquete se pierde?

Saludos.

Efectivamente si no hay ningún problema con la conexión no te generará ningún resultado. Prueba a deshabilitar la conexión a la red mientras se ejecuta y así podrás comprobar que guarda los resultados en el fichero paquetesperdidos.txt.

Desde cmd el comando si que llevaria solo un signo %, pero en un .bat tienes que poner dos para que funcione. Con el comando FOR pasa lo mismo. No se exactamente por qué, pero es así.

Es curioso, gracias por la información.

aquí está

https://mega.co.nz/#!udQhzbIJ!MWfyeSP4ttCjbNdZ3EL8xClyVlp01-c_yRi_4dEo-jA
 (https://mega.co.nz/#!udQhzbIJ!MWfyeSP4ttCjbNdZ3EL8xClyVlp01-c_yRi_4dEo-jA)

el crea en la carpeta donde se ejecute un archivo llamado ping.txt con la info en el formato

Código:
2013-06-19 10:47AM. - Respuesta desde 201.248.76.20: bytes=32 tiempo=20ms TTL=59

si lo ejecutas
Código:
ping.exe -t 3
se hará ping cada 3 segundos (o los segundos que establescas luego de "-t") si no especificas nada, hará ping cada 1 segundo (sumado a la espera del ping, me dio pereza corregir eso)

si el ping falla puede decir que "tiempo de espera agotado" o simplemente dejarlo en blanco si el host lo da inaccesible... (tambien me dio pereza corregir eso)

hace ping contra google.com por si a las dudas...

el continua escribiendo el archivo donde lo dejó si lo cierras... espero te sea útil

Gracias engelx. También había pensado hacerlo en C que lo controlo más pero al no ser demasiado complejo pensé que no merecía la pena y esto sería más rápido. De todas formas sería interesante ver como lo implementaste, ¿no tendrás el código por ahí para echarle un vistazo?

Lo suyo es ajustar el tiempo entre pings a la calidad de la conexión, porque sino como dices se te va a llenar el logs de miles de entradas xD.
Yo lo voy a usar porque actualmente tengo microcortes de conexión, y el log del cable router no es demasiado fiable.  Estoy intentando que la operadora lo solucione y esto me es de gran ayuda para diagnosticarlo.


Título: Re: Script batch para ping
Publicado por: engel lex en 19 Junio 2013, 20:33 pm
no quiero criticas sobre mi codigo XD lo hice rapido y a los golpes

Código
  1. #include <Windows.h>
  2. #include <iostream>
  3. #include <string>
  4. #include <ctime>
  5. #include <fstream>
  6. using namespace std;
  7. //aqui la funcion del pipe
  8. string exec(char* cmd) {
  9.    FILE* pipe = popen(cmd, "r");
  10.    if (!pipe) return "ERROR";
  11.    char buffer[128];
  12.    std::string result = "";
  13.    while(!feof(pipe)) {
  14.     if(fgets(buffer, 128, pipe) != NULL)
  15.     result += buffer;
  16.    }
  17.    pclose(pipe);
  18.    return result;
  19. }
  20.  
  21.  
  22.  
  23. int main(int argc, char *argv[])
  24. {
  25.    int tiempo = 1;
  26.    if(argc==3){
  27.        tiempo = atoi(argv[2]);//no captura el "-t" porque en realidad es relleno
  28.    }
  29.   string a = "";
  30.  
  31.   int b = 0, c = 0;
  32.   char bufer[80];
  33.   time_t rawtime;
  34.  
  35.   struct tm * timeinfo;
  36. //saca la direccion del exe, la recorta y le pone ping.txt
  37.   string path =argv[0];
  38.   b = path.find_last_of("/");
  39.   path = path.substr(0,b)+ "/ping.txt";
  40.   const char *sb = path.c_str() ;
  41.  
  42.  
  43.    ofstream myfile;
  44.     while(1){
  45.        a = exec("ping www.google.com -n 1");//abre la llamada
  46.        myfile.open (sb,ios::out|ios::app);
  47.        //captura la hora
  48.        time(&rawtime);
  49.        timeinfo=localtime(&rawtime);
  50.        strftime (bufer,80,"%F %I:%M%p.",timeinfo);
  51.        //arregla el mensaje a mostrar
  52.        b = (INT) a.find_first_of("\n")+1;
  53.        b = (INT) a.find_first_of("\n",b)+1;
  54.        c = (INT) a.find_first_of("\n",b);
  55.        a = a.substr(b,c-b);
  56.        cout << bufer << " - " << a << "\n";//muestra
  57.        myfile << bufer << " - " << a << "\n";//envia a archivo
  58.        myfile.close();//cierra por si el programa tiene un fin inesperado en la espera
  59.        sleep(tiempo);//espera
  60.        }
  61.       return 0;
  62.  
  63. }
  64.  

recomiendo recompilar XD el anterior codigo tiene un error XD solo hace un ping y dice el mimo resultado siempre! sorry!


Título: Re: Script batch para ping
Publicado por: Eleкtro en 19 Junio 2013, 20:47 pm
@EngelX
La intención es de agradecer, pero te recuerdo que estamos en la sección de Scripting, no en C.

Saludos!


Título: Re: Script batch para ping
Publicado por: Eleкtro en 19 Junio 2013, 21:07 pm
Aquí tienes mi solución, es muy sencillo:

Código
  1. @echo off
  2.  
  3. Set "URL=www.google.es"
  4. Set "Interval=5" & REM Segundos
  5. set "LogFile=.\Ping.txt"
  6.  
  7. :PingMe
  8. Set /A "Count+=1"
  9. Echo [+] Haciendo Ping [%Count%]
  10.  
  11. (
  12. ping "%URL%" | FINDSTR "perdidos.=.0$"
  13. ) || (
  14. Echo Paquetes perdidos.
  15. Echo %DATE% %TIME% >> "%LogFile%"
  16. )  
  17.  
  18. Ping "LOCALHOST" -n "%Interval%" 1>NUL | MORE
  19. GoTo :PingMe


Output:
Código:
[+] Haciendo Ping [1]
    Paquetes: enviados = 4, recibidos = 4, perdidos = 0

[+] Haciendo Ping [2]
    Paquetes: enviados = 4, recibidos = 4, perdidos = 0

[+] Haciendo Ping [3]
Paquetes perdidos.

Saludos!


Título: Re: Script batch para ping
Publicado por: terrateck en 19 Junio 2013, 22:33 pm
Gracias a todos


Título: Re: Script batch para ping
Publicado por: engel lex en 20 Junio 2013, 01:04 am
@EngelX
La intención es de agradecer, pero te recuerdo que estamos en la sección de Scripting, no en C.

Saludos!
lo se XD solo respondia la peticion de terratek XD

Citar
Gracias engelx. También había pensado hacerlo en C que lo controlo más pero al no ser demasiado complejo pensé que no merecía la pena y esto sería más rápido. De todas formas sería interesante ver como lo implementaste, ¿no tendrás el código por ahí para echarle un vistazo?

disculpa si desvié el tema :P