Script de shell para esperar por um pacote de uma determinada porta

2

Eu quero iniciar meu servidor de minecraft quando alguém tentar se conectar a ele na porta 25565. Eu tenho um plugin para o servidor que o desliga após x quantidade de minutos sem jogadores online. Com um script de shell, criei um loop que inicia o servidor quando ele é desligado:

#!/bin/bash
while true
do
    # run server
    java -Xms2048M -Xmx2048M -Djava.awt.headless=true -jar "craftbukkit.jar"
    # server shut down

    # run MCSignOnDoor
    java -jar MCSignOnDoor.jar --sentrymode -m "Gone Fishin' Back in Five Minutes!"
    # McSignOnDoor shut down

    # stop loop if error code is not 12
    # so only restart the server when the program ended because of a packet
    if [ "$?" -ne "12" ]; then
        break
    fi
done

McSignOnDoor era um programa java criado por alguém que emula um servidor ativo, e sai assim que alguém o coloca na porta 25565 com o código de saída 12. Infelizmente, isso não funciona desde a atualização do protocolo, então estou procurando por um alternativa.

Existe uma maneira de esperar até receber um pacote na porta 25565 (ou qualquer outra porta) e depois continuar o script?

    
por Jochem Kuijpers 16.01.2014 / 04:16

2 respostas

5

Há um serviço que já está incluído no Linux e fornece esse recurso, chamado xinetd . A Red Hat mantém uma boa documentação em seu site, intitulada: 2.6.4. Arquivos de Configuração do xinetd . O serviço xinetd permite que você configure um serviço mestre que escute em portas específicas e, em seguida, ative outros aplicativos quando as conexões forem feitas nas portas mencionadas.

excerto da página man do xinetd

xinetd performs the same function as inetd: it starts programs that provide Internet services. Instead of having such servers started at system initialization time, and be dormant until a connection request arrives, xinetd is the only daemon process started and it listens on all service ports for the services listed in its configuration file. When a request comes in, xinetd starts the appropriate server. Because of the way it operates, xinetd (as well as inetd) is also referred to as a super-server.

OBSERVAÇÃO: Se não estiver instalado, você pode instalá-lo, o pacote é normalmente chamado de xinetd .

Uma vez instalado, você coloca os arquivos de configuração sob este diretório, /etc/xinetd.d . Por exemplo, vamos criar um serviço chamado minecraft .

# /etc/xinetd.d/minecraft
service minecraft
{
 disable = no
 type = UNLISTED
 socket_type = stream
 protocol = tcp
 wait = no
 server = /path/to/minecraft/server
 bind = <ip of minecraft server>
 port = 25565
 user = root
}

Com o arquivo acima, você pode manualmente iniciar xinetd para verificar as coisas.

$ sudo service xinetd start

Agora, quando você tentar se conectar ao seu sistema pela porta 25565, o servidor de minecraft deverá iniciar e você deverá ser capaz de acessá-lo. Talvez seja necessário ajustar a linha user = .. para qualquer usuário que seja o proprietário do servidor.

Para tornar isso persistente, você pode usar qualquer mecanismo usado pela sua distribuição para iniciar os serviços automaticamente durante a inicialização.

Referências

por 16.01.2014 / 05:15
1

netcat

link

nc-l 1234 Usando uma segunda máquina, conecte-se ao processo de escuta

nc host.example.com 1234 < echo hello Após o pacote ter sido transferido, a conexão será fechada automaticamente

agora use o código de retorno. nc-l 1234 && echo someone connected

    
por 16.01.2014 / 10:45