Continue por loop pelo teclado

4

Eu tenho uma conta de usuário em uma máquina linux que não sei seu endereço IP exato. Mas eu sei um intervalo que é executado em um deles. Quero verificar qual servidor é o meu servidor desejado. Existem alguns servidores da Microsoft, alguns servidores Linux e alguns servidores que também estão inativos.

Eu tenho um script de shell para verificar cada servidor:

#!/bin/sh
for i in $(seq 1 127)
do
    echo "192.168.1.$i:"
    ssh 192.168.1.$i -l user_name
done

Este código vai para cada IP. Se ele rodou o ssh, ele pede a senha, se o ssh não rodar, ele tenta o próximo ip e se o servidor estiver inoperante, ele espera por um longo tempo. Além disso, se o servidor tiver ssh e solicitar uma senha, não posso escapar dele pelo teclado desse servidor.

Como posso escapar desses dois tipos pelo teclado e ir para o próximo IP sem terminar o programa?

Por exemplo, CTRL + C termina o programa.

    
por Mohammad Etemaddar 23.12.2013 / 10:06

4 respostas

5

Ctrl-C envia o sinal SIGINT para todos os processos do trabalho em primeiro plano do seu shell interativo. Então, isso envia para o sh executando o script e ssh .

Você pode fazer com que não mate o shell adicionando um:

trap : INT

para o início do seu script.

Você também pode querer usar a opção ConnectTimeout de ssh :

ssh -o ConnectTimeout=2 ...

Note que você está dando sua senha para todas as máquinas que você está tentando se conectar. Não é uma boa ideia se você não confia em seus administradores.

    
por 23.12.2013 / 10:26
3

Para resolver o problema do tempo limite longo, você pode testar se pode ping da máquina com uma contagem baixa e um intervalo curto (0.2 segundos é mínimo para usuários normais).

...
ping -c 2 -i 0.2 "192.168.1.$i"
if [ $? == 0 ] ; then
   ssh 192.168.1.$i -l user_name
fi
...

Se você quiser apenas fazer o login em servidores com sua chave privada / pública, você pode dizer ao ssh apenas para aceitar essa autenticação, então o ssh falhará se uma senha for solicitada.

    
por 23.12.2013 / 10:19
1
ping -c 2 -i 0.2 "192.168.1.$i:"
if [ $? == 0 ] ; then
   ssh 192.168.1.$i -l user_name &
fi

Esta estrofe ajudará você a continuar sem aguardar a entrada da senha, pois todas as conexões SSH estão sendo executadas em segundo plano.

Sempre que você quiser inserir a senha para qualquer uma das máquinas, poderá fazê-lo executando jobs , que incluirá todos os processos em execução em segundo plano. Em seguida, traga a conexão ssh desejada para o primeiro plano pelo comando fg %<job_id>

Pode ser que esta solução seja um pouco complicada ou suja, mas certamente servirá ao propósito

    
por 23.12.2013 / 10:29
1

Você pode tentar usar o ssh_config, (que na verdade não é a solução exata que você está procurando, por exemplo, do teclado). Existem duas opções para ajudar a descobrir algo sobre o servidor.

ssh_config: A configuração do sistema está presente em / etc / ssh / ssh_config (no Debian e em algumas das distribuições do Linux). - você poderia escrever uma configuração específica do usuário, por exemplo, ~ / .ssh / config

  • BatchMode = Se definido como sim, a consulta de senha será desativada. Essa opção é útil para evitar a senha como entrada de um script.

  • ConnectTimeout = Tempo em segundos usado ao tentar se conectar a um servidor ssh. Isso usa o tempo explícito especificado na opção de linha de comando em vez do valor de tempo limite do tcp.

  • ConnectionAttempts = Caso haja suspeita de descarte de pacotes.

#!/bin/sh
for i in $(seq 1 127)
do
    echo "192.168.1.$i:"
    ssh -o BatchMode=yes -ConnectTimeout=20 192.168.1.$i -l user_name
done
    
por 23.12.2013 / 10:31