Bash que compruebe Status Game?

  • Autor Autor Ruiz86
  • Fecha de inicio Fecha de inicio
Ruiz86

Ruiz86

Eta
SEO
Verificación en dos pasos activada
Hola.. estoy dándole vueltas a esto y no hay forma.. 🙂

Me gustaría hacer un script que compruebe cada vez que lo ejecute, si el juego que está en el puerto XXXX está online.

¿Alguien puede guiarme?
 
Última edición:
¿Te sirvió? Únete a la conversación

Con tu cuenta gratis puedes responder, escribirle al autor por mensaje privado y comprar con Saldo retenido: el pago se libera cuando recibes lo acordado.

Toma 30 segundos · vuelves a este tema al terminar
Ocupa el comomando nmap o netstat para ver el puerto.
 
Cuando un server de un juego está online, normalmente es el mismo juego el que levanta un puerto en escucha, así que puedes comprobar si el puerto está escuchando con netstat.

Primero fíjate en que idioma devuelve los resultados:

netstat -an google.com |grep :80

Si está en inglés devolverá "LISTEN", si está en español, de devolverá "ESCUCHAR" o algo por el estilo, ahora para revisar el server sería:

netstat -an [HOST/IP DEL SERVIDOR] |grep :[PUERTO] | grep [LISTEN O ESCUCHAR]

Por ejemplo, si yo tengo un juego en la ip 172.17.0.4 que se conecta por el puerto 27015 y el S.O. me devuelve el resultado en inglés, sería:

netstat -an 172.17.0.4 |grep :27015 | grep LISTEN

Si devuelve algo, entonces el juego está online, pero si no devuelve nada, pues no 😛.

kj
 
Cuando un server de un juego está online, normalmente es el mismo juego el que levanta un puerto en escucha, así que puedes comprobar si el puerto está escuchando con netstat.

Primero fíjate en que idioma devuelve los resultados:

netstat -an google.com |grep :80

Si está en inglés devolverá "LISTEN", si está en español, de devolverá "ESCUCHAR" o algo por el estilo, ahora para revisar el server sería:

netstat -an [HOST/IP DEL SERVIDOR] |grep :[PUERTO] | grep [LISTEN O ESCUCHAR]

Por ejemplo, si yo tengo un juego en la ip 172.17.0.4 que se conecta por el puerto 27015 y el S.O. me devuelve el resultado en inglés, sería:

netstat -an 172.17.0.4 |grep :27015 | grep LISTEN

Si devuelve algo, entonces el juego está online, pero si no devuelve nada, pues no 😛.

kj


root@web:~# netstat -an xx.xx.xx.xx |grep :27015
udp 0 0 0.0.0.0:27015 0.0.0.0:*

root@web:~# netstat -an xx.xx.xx.xx |grep :7777
nada.

Esos son los dos puertos que utiliza y está online...
 
Última edición:
root@web:~# netstat -an xx.xx.xx.xx |grep :27015
udp 0 0 0.0.0.0:27015 0.0.0.0:*

root@web:~# netstat -an xx.xx.xx.xx |grep :7777
nada.

Esos son los dos puertos que utiliza y está online...

mmm, cierto, se me olvidó el detalle de que es UDP.

No se me ocurre nada en bash puro, pero si es un juego de steam puedes comprobarlo vía API:

Insertar CODE, HTML o PHP:
http://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr=[Aquí la IP de tu server]&format=xml

Si no está, queda seguir buscando...

kj
 
mmm, cierto, se me olvidó el detalle de que es UDP.

No se me ocurre nada en bash puro, pero si es un juego de steam puedes comprobarlo vía API:

Insertar CODE, HTML o PHP:
http://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr=[Aquí la IP de tu server]&format=xml

Si no está, queda seguir buscando...

kj


Sí, esta forma la conozco y es viable pero ¿cómo saco el valor del xml en lenguaje linux? No se programar en este lenguaje... puedo intuirlo pero poco más.
IF
--offline--
THEN
--sudo reboot--
fi

xD

Suponiendo que me arroja estos valores:
Insertar CODE, HTML o PHP:
<response>
<success>true</success>
<servers><server>
<addr>xxx.xxx.xx.xx:27015</addr>
<gmsindex>65534</gmsindex>
<appid>346110</appid>
<gamedir>ark_survival_evolved</gamedir>
<region>-1</region>
<secure>true</secure>
<lan>false</lan>
<gameport>7777</gameport>
<specport>0</specport>
</server></servers>
</response>
 
Última edición:
He hecho la prueba con un servidor de Hurtworld y veo que siempre muestra la IP en el resultado si está online (el resultado, la verdad no lo entiendo xD), aquí el código:

Insertar CODE, HTML o PHP:
#/bin/bash
ip="5.9.43.74";
json=$(wget -q -O- http://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr=${ip}&format=json)
grep $ip <<< "$json" && echo "Online" || echo "Offline".

En lugar de if/else hago uso de los operadores "AND" y "OR", en donde he colocado esos 2 echo puedes colocar las órdenes que quieras ejecutar en cada caso.

kj
 
He hecho la prueba con un servidor de Hurtworld y veo que siempre muestra la IP en el resultado si está online (el resultado, la verdad no lo entiendo xD), aquí el código:

Insertar CODE, HTML o PHP:
#/bin/bash
ip="5.9.43.74";
json=$(wget -q -O- http://api.steampowered.com/ISteamApps/GetServersAtAddress/v0001?addr=${ip}&format=json)
grep $ip <<< "$json" && echo "Online" || echo "Offline".

En lugar de if/else hago uso de los operadores "AND" y "OR", en donde he colocado esos 2 echo puedes colocar las órdenes que quieras ejecutar en cada caso.

kj

Tengo otra api que si me arroja el estado correctamente del server: "is_online":"0" ( 1 o 0 )
Insertar CODE, HTML o PHP:
{ "id":"86198", "name":"Bossland | ES\/EU | All x15 | 0 Lag | 01\/04", "address":"xxx.xxx.xx.xx", "port":"7777", "private":"0", "password":"0", "query_port":"27015",	"location":"Spain", "hostname":"BOSSLAND.es x15 - (v256.4)",	"map":"TheCenter", "is_online":"0", "players":"0", "maxplayers":"100", "version":"256.4", "platform":"linux", "uptime":"96", "score":"201", "rank":"59", "votes":"139", "favorited":"1", "comments":"2", "url":"https://ark-servers.net/server/86198/", "last_check":"April 18th, 2017 08:15 AM EST", "last_online":"April 18th, 2017 07:45 AM EST" }

¿Cómo sería el código?
 
Hola que tal,

Aquí varios ejemplos útiles que quizás te puedan ayudar en lo que quieres.

Revisemos el uso de puertos por rango de IPs...

#!/bin/bash
#Sysdop forobeta
#Version 1.0
#START
nmap -PN -p 53 --open -oG - 10.0.*.* | awk '{print $2}' > /abierto.txt
#END

Jugamos un poco con las IPs únicas y algo mas sencillo.

#!/bin/bash
#Sysdop forobeta
#Version 1.0
#START
nmap -Pn -p53 8.8.8.8 | awk "\$1 ~ /$PORT/ {print \$2}" | grep open
#END

O printeamos la IP única y comprobamos.

#!/bin/bash
#Sysdop forobeta
#Version 1.0
#START
nmap -PN -p 53 --open -oG - 8.8.8.8 | awk '{print $2}' > /prueba.txt
#END

Espero haberte ayudado.

Saludos.
 
Hola que tal,

Aquí varios ejemplos útiles que quizás te puedan ayudar en lo que quieres.

Revisemos el uso de puertos por rango de IPs...



Jugamos un poco con las IPs únicas y algo mas sencillo.



O printeamos la IP única y comprobamos.



Espero haberte ayudado.

Saludos.

-bash: nmap: command not found
 
Tengo otra api que si me arroja el estado correctamente del server: "is_online":"0" ( 1 o 0 )
Insertar CODE, HTML o PHP:
{ "id":"86198", "name":"Bossland | ES\/EU | All x15 | 0 Lag | 01\/04", "address":"xxx.xxx.xx.xx", "port":"7777", "private":"0", "password":"0", "query_port":"27015",	"location":"Spain", "hostname":"BOSSLAND.es x15 - (v256.4)",	"map":"TheCenter", "is_online":"0", "players":"0", "maxplayers":"100", "version":"256.4", "platform":"linux", "uptime":"96", "score":"201", "rank":"59", "votes":"139", "favorited":"1", "comments":"2", "url":"https://ark-servers.net/server/86198/", "last_check":"April 18th, 2017 08:15 AM EST", "last_online":"April 18th, 2017 07:45 AM EST" }

¿Cómo sería el código?

ARK es de steam, puedes hacerlo con esa API.

Sería lo mismo solo que en lugar de buscar la IP buscas '"is_online":"1"', cambias grep $ip por grep '"is_online":"1"'.

kj
 
ARK es de steam, pero supongo que es para no-steam o un server piratilla.

Sería lo mismo solo que en lugar de buscar la IP buscas '"is_online":"1"', cambias grep $ip por grep '"is_online":"1"'.

kj

Si mal no estoy le es más cómodo empezar con nmap al estilo clasico, es mas sencillo y posiblemente entendible para el.
 
Si mal no estoy le es más cómodo empezar con nmap al estilo clasico, es mas sencillo y posiblemente entendible para el.

No usaría nmap sencillamente porque tu buscas si el puerto está abierto o no y eso es muy didstinto a si está siendo escuchado o no.

Respecto a si es difícil o no, creo que siendo los primeros pasos, todo es difícil, da igual que sea nmap combinado con awk o un wget combinado con grep.

kj
 
No usaría nmap sencillamente porque tu buscas si el puerto está abierto o no y eso es muy didstinto a si está siendo escuchado o no.

Respecto a si es difícil o no, creo que siendo los primeros pasos, todo es difícil, da igual que sea nmap combinado con awk o un wget combinado con grep.

kj

También puede experimentar con nc.

bash-4.2# nc -v -u 8.8.8.8 53
Ncat: Version 7.10 ( Ncat - Netcat for the 21st Century )
Ncat: Connected to 8.8.8.8:53.
 
No usaría nmap sencillamente porque tu buscas si el puerto está abierto o no y eso es muy didstinto a si está siendo escuchado o no.

Respecto a si es difícil o no, creo que siendo los primeros pasos, todo es difícil, da igual que sea nmap combinado con awk o un wget combinado con grep.

kj

Siguiendo tus consejos en primer lugar con el permiso de sysdop.

Utilizo el siguiente código:
Insertar CODE, HTML o PHP:
ip="xxx.xxx.xx.xx";
json=$(wget -q -O- https://ark-servers.net/api/?object=servers&element=detail&key=-----------------------------)
grep '"is_online":"1"' <<< "$json" && echo "Online" || echo "Offline".
Y siempre me da Offline, he probado con 1 y con 0 y me da Offline. Está Online 🙁.
 
Última edición:
También puede experimentar con nc.

Si, con nc si funcionaría, pero nunca lo he usado en ningún script, por eso me fui por otro lado (y porque no se me ocurrió xD).

Siguiendo tus consejos en primer lugar con el permiso de sysdop.

Utilizo el siguiente código:
Insertar CODE, HTML o PHP:
ip="xxx.xxx.xx.xx";
json=$(wget -q -O- https://ark-servers.net/api/?object=servers&element=detail&key=-----------------------------)
grep '"is_online":"1"' <<< "$json" && echo "Online" || echo "Offline".
Y siempre me da Offline, he probado con 1 y con 0 y me da Offline. Está Online 🙁.

Pon en la terminal solo:

wget -q -O- https://ark-servers.net/api/?object=servers&element=detail&key=-----------------------------

Y mándame lo que te muestra (No se como sacar la key del server, así que no puedo probarlo yo mismo).

kj
 
Si, con nc si funcionaría, pero nunca lo he usado en ningún script, por eso me fui por otro lado (y porque no se me ocurrió xD).



Pon en la terminal solo:

wget -q -O- https://ark-servers.net/api/?object=servers&element=detail&key=-----------------------------

Y mándame lo que te muestra (No se como sacar la key del server, así que no puedo probarlo yo mismo).

kj

[1] 7274
[2] 7275
root@web:/home/admin/web/bossland.es/public_html/crons# Error: no parameters

Te paso Key por privado, mas que nada para evitar el spam 😛
 
Ya está:

Insertar CODE, HTML o PHP:
#/bin/bash
json=$(wget -q -O- 'https://ark-servers.net/api/?object=servers&element=detail&key=...........')
grep '"is_online":"1"' <<< "$json" && echo "Online" || echo "Offline".

Ahora que lo pienso, el ampersand se ejecutaba, así que con unas comillas evitas que eso pase.

kj
 
Ya está:

Insertar CODE, HTML o PHP:
#/bin/bash
json=$(wget -q -O- 'https://ark-servers.net/api/?object=servers&element=detail&key=...........')
grep '"is_online":"1"' <<< "$json" && echo "Online" || echo "Offline".

Ahora que lo pienso, el ampersand se ejecutaba, así que con unas comillas evitas que eso pase.

kj

Whohooo ahora si.

Y puedo meterle un reboot al vps en caso de que esté offline de esta forma? (tengo en rc.local una linea que arranca el juego al reiniciar).
Insertar CODE, HTML o PHP:
#/bin/bash
json=$(wget -q -O- 'https://ark-servers.net/api/?object=servers&element=detail&key=...........')
grep '"is_online":"1"' <<< "$json" && echo "Online" || echo "Offline". sudo reboot
 
Atrás
Arriba