Execute um comando ping na lista de servidores e imprima em um arquivo

2

Eu tenho um arquivo servers.txt em um servidor diferente, com lista de servidores:

server1.mydomain.com
server2.mydomain.com
server3.mydomain.com

Eu quero primeiro baixar este arquivo txt, pingar esses servidores e gerar o resultado do ping em um arquivo. E eu quero fazer isso em um loop infinito a cada x segundos.

Eu tenho um login VPS e até agora eu descobri que me conectei ao VPS usando um programa chamado putty.exe .

Como devo abordar isso? Eu imagino que devo escrever um script e configurar o servidor para executá-lo a cada x segundos ou usar um loop while.

    
por Alireza Noori 29.05.2016 / 18:07

2 respostas

4

OK, acredito que entendi sua pergunta agora.

No host1

Vamos supor que você tenha host1 ao qual você se conecta com ssh via putty , nesse host você deve instalar screen ou tmux (do gerenciador de pacotes, eles estarão lá). Sugiro screen , pois é um pouco mais fácil para um iniciante.

Além disso, você precisa fazer o login em host2 de host1 , portanto, é necessário configurar um ssh key , o que permitirá o login sem uma senha. Para fazer isso, você precisa executar:

ssh-keygen -f ~/.ssh/host1tohost2

Ele pedirá uma senha, para executar o script automaticamente (sem a necessidade de entrada manual de uma frase secreta) você deve configurá-lo para uma frase secreta vazia. Mantenha o host1 seguro! Graças a essa chave, qualquer pessoa no controle de host1 também ganha o controle de host2 (na medida em que as permissões do usuário permitem).

Esse comando gerará os seguintes arquivos:

~/.ssh/host1tohost2
~/.ssh/host1tohost2.pub

Você deve copiar ~/.ssh/host1tohost2.pub para host2 :

scp ~/.ssh/host1tohost2.pub me@host2:~

No host2

Crie ~/.ssh no host2 e mova host1tohost2.pub lá e crie um arquivo chamado authorized_keys nesse diretório:

mkdir -f ~/.ssh
mv ~/host1tohost2.pub ~/.ssh
cd ~/.ssh
cat host1tohost2.pub >> authorized_keys

Isso permite o login de host1 a host2 sem um prompt de senha interativo.

Próximo,

Vamos supor que o arquivo servers.txt esteja em /home/me/myservers/servers.txt on host2 . Essa suposição é necessária, pois usaremos esse path em um script em host1 .

Voltar para o host1

O script de loop infinito que você precisa é:

#!/bin/sh

X_SECONDS=6
LOGFILE=~/mypings.log

while ((1)); do
    # >$LOGFILE  # clear log file (see comments)
    ssh -i ~/.ssh/host1tohost2 me@host2 'cat /home/me/myservers/servers.txt' |
    while read x; do
        echo "ping to $x"
        ping -c1 $x >> $LOGFILE
    done
    sleep $X_SECONDS
done

Vamos supor que esse script seja salvo em um arquivo chamado pingservers.sh . Mas não o execute ainda, já que ele irá parar quando você fechar putty . Agora screen entra em cena (você instalou, certo?). Executar:

screen

E aparentemente nada muda. Agora você está em um shell que está sendo acessado por meio de socket in /var/run , esse shell não fechará uma vez se você detach dele e então fechará putty (na verdade, se você acabou de putty o sistema operacional vai descobrir as coisas e não fechar o shell de qualquer maneira, mas vamos fazer um bom detach por razões educacionais). Antes de separar, é hora de executar:

./pingservers.sh

Ele será executado para sempre e manterá echo ing algumas mensagens enquanto estiver gravando no arquivo de log.

Para desanexar de screen você precisa digitar Ctrl+A D (segure Ctrl , pressione A , libere Ctrl e pressione D ). E você está de volta no shell original com o qual você fez login com putty , agora você pode fechar putty e tomar um café.

Quando você fizer login novamente em host1 , o arquivo ~/mypings.log será atualizado com mais e mais pings (não é necessário executar screen novamente). Para verificar o arquivo que está sendo atualizado em tempo real, você pode usar:

tail -f ~/mypings.log

O arch linux wiki tem muito mais informações úteis sobre as chaves ssh-keygen e ssh em geral , e o O mesmo acontece com a tela do gnu . Estes dois artigos são excelentes fontes de informação para ambos os programas.

    
por 29.05.2016 / 19:59
2
for i in 'cat servers.txt' ; do ping -c1 $i 2>&1 | tee >> ping-output.txt; done

Isso executa um ping para cada linha no arquivo (usando i como a variável que armazena o valor e fazendo referência à variável com $ i) e redireciona toda a saída para o arquivo [output]. A parte 2 > & 1 captura o stdout (resultados do ping) e o stderr (sem ping, porque não há erro do host) em um arquivo usando o comando tee.

    
por 29.05.2016 / 18:27