Testar se a porta telnet está ativa em um script de shell

8

Estou tentando criar um script para testar se é possível fazer login via telnet. Eu não quero realmente logar; portanto, esperar não é necessário. Eu só quero ver se sou capaz de obter um prompt de login. Isso está sendo feito de um sistema Linux, então eu tenho tentado usar nc :

nc 192.168.10.5 23 -w 1 | grep -q login 
if [ $? -eq 1 ]
then
    echo "console is down"
fi

O problema é que isso está causando o bloqueio do meu console. Parece que o -w não está realmente descartando a conexão.

Eu também tentei usar o telnet, mas não consigo quebrar a conexão de dentro do script. Tentando

\echo "5" | telnet 192.168.10.5

quebra antes de eu receber um aviso de login.

    
por rleon 04.09.2014 / 23:59

4 respostas

13

O Bash fornece pseudo-dispositivos com os quais você provavelmente está familiarizado, como /dev/null . No entanto, existem outros dispositivos, como /dev/tcp e /dev/udp , para testar as conexões de rede, que você também pode usar nos scripts Bash.

trecho da página do homem do Bash

Bash handles several filenames specially when they are used in redirections, as described in the following table:

          /dev/fd/fd
                 If fd is a valid integer, file descriptor fd is duplicated.
          /dev/stdin
                 File descriptor 0 is duplicated.
          /dev/stdout
                 File descriptor 1 is duplicated.
          /dev/stderr
                 File descriptor 2 is duplicated.
          /dev/tcp/host/port
                If  host  is a valid hostname or Internet address, and port 
                is an integer port number or service name, bash attempts to 
                open a TCP connection to the corresponding socket.
          /dev/udp/host/port
                If host is a valid hostname or Internet address, and port 
                is an integer port number or service name, bash attempts to 
                open a  UDP  connection to the corresponding socket.

Exemplo

Aqui estou testando a conexão com um host no meu domínio chamado skinner e vendo se consigo conectar à sua porta 22.

NOTA: A porta 22 é para SSH, para a porta 23 do uso do telnet.

$ echo > /dev/tcp/skinner/22 && echo "it's up" || echo "it's down"
it's up

Ótimo, então vamos tentar um não-port:

$ echo > /dev/tcp/skinner/223 && echo "it's up" || echo "it's down"
bash: connect: Connection refused
bash: /dev/tcp/skinner/223: Connection refused
it's down

Bem, isso funciona, mas é uma saída horrivelmente feia. Não se preocupe. Você pode executar o echo > /dev/tcp/... em um subshell e redirecionar toda a saída para /dev/null para limpá-lo um pouco. Aqui está o padrão que você pode usar nos seus scripts de shell:

$ (echo > /dev/tcp/skinner/22) > /dev/null 2>&1 \
    && echo "it's up" || echo "it's down"
it's up

$ (echo > /dev/tcp/skinner/223) > /dev/null 2>&1 \
    && echo "it's up" || echo "it's down"
it's down
    
por 05.09.2014 / 04:29
5

Você está no caminho certo usando nc , mas se você realmente quer apenas testar se você pode estabelecer a conexão, use switch -z do nc :

#!/bin/bash
REMOTEHOST=10.11.12.13
REMOTEPORT=1234
TIMEOUT=1

if nc -w $TIMEOUT -z $REMOTEHOST $REMOTEPORT; then
    echo "I was able to connect to ${REMOTEHOST}:${REMOTEPORT}"
else
    echo "Connection to ${REMOTEHOST}:${REMOTEPORT} failed. Exit code from Netcat was ($?)."
fi
    
por 14.10.2014 / 23:58
1

executar nc -z 192.168.10.5 23 no prompt de comando ou crie um script bash para executar este comando.

Retorna a declaração abaixo se a conexão for bem sucedida.

Conexão para 192.168.10.5 23 porta [tcp / *] sucedeu!

    
por 16.01.2015 / 09:01
0

Eu sei que a resposta está um pouco atrasada, mas eu estava procurando como fazer isso e usar o nc não era uma opção por razões de segurança, então aqui está, se puder ajudar alguém.

O que faltava em seu eco inicial era a opção -e:

   -e     enable interpretation of backslash escapes
   -E     disable interpretation of backslash escapes (default)

E uma nova linha + o comando quit para sair do telnet após a desconexão. Como tal:

echo -e '5\nquit' | telnet 10.0.0.1 23 && echo "success" || echo "failed"

Obviamente, o mesmo funcionará se você usar um estilo de bloco se declaração e avaliar $? como você fez inicialmente:

echo -e '5\nquit' | telnet 10.0.0.1 23
if [ $? -eq 1 ]
then
  echo "Console is down."
fi

Enquanto estamos nisso, no que diz respeito ao nc, isso depende do sabor do nc que você tem (gnu ncat vs nmap-ncat). O Gnu terá a opção -z:

  -z                         Zero-I/O mode, report connection status only
nc -z 10.0.0.1 23
# (evaluate $? here)

enquanto o outro não e você terá que enviar uma linha vazia para o seu nc para não ficar preso:

echo | nc 10.0.0.1 23
# (evaluate $? here)
    
por 23.08.2018 / 16:20