Bash que verifique Status Game?

  • Autor Autor Ruiz86
  • Data de início Data de início
Tradução em andamento: em alguns minutos este tópico estará em português. Por enquanto, o conteúdo está no original em espanhol. Ver original
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 edição:
Foi útil? Participe da conversa

Com sua conta grátis você pode responder, mandar mensagem privada ao autor e comprar com Saldo retido: o pagamento é liberado quando você recebe o combinado.

Leva 30 segundos · você volta a este tópico ao 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 edição:
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:

Inserir CODE, HTML ou 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:

Inserir CODE, HTML ou 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:
Inserir CODE, HTML ou 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 edição:
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:

Inserir CODE, HTML ou 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:

Inserir CODE, HTML ou 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 )
Inserir CODE, HTML ou 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 )
Inserir CODE, HTML ou 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:
Inserir CODE, HTML ou 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 edição:
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:
Inserir CODE, HTML ou 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á:

Inserir CODE, HTML ou 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á:

Inserir CODE, HTML ou 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).
Inserir CODE, HTML ou 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
 
Voltar
Topo