Testando a porta TCP remota usando telnet executando um comando de uma linha

12

Eu tenho várias caixas Linux com um conjunto muito limitado de comandos e espaço em disco. Mas tem o telnetcomando.

Eu me conecto remotamente a cada uma dessas análises (programaticamente) e emito um comando linux de linha através do SSH.

Preciso executar um único comando para conectar-me a uma máquina específica, usando telnet e desconectar imediatamente .

Eu posso fazer tudo isso, mas a desconexão parte imediatamente . O Telnet abre algum tipo de console ou terminal e não consigo descobrir um comando de uma linha para executar o comando telnet e desconectar imediatamente.

Se fizer isso, posso analisar facilmente a saída de texto em busca de mensagens de erro por não conseguir conectar à máquina na porta especificada e é exatamente isso que estou procurando.

Então, como posso executar um comando de uma linha para conectar-me a uma máquina usando telnet e desconectar depois?

Muhammad Gelbana
fonte
Pelo que entendi, seu cliente Telnet não suporta o envio diretamente?
IBr
@IBr, o que você quer dizer?
Muhammad Gelbana
Observe que os clientes telent diferem no código de saída relatado após o comando de saída do lado do cliente ser usado para finalizá-lo. Portanto, o código de saída zero não deve ser considerado um sinal de abertura da porta. Não funciona para o RHEL telent RPM pelo menos.
Oliver Gondža

Respostas:

28

Você deve poder canalizar o exitcomando para STDIN telnet. Experimentar:

echo 'exit' | telnet {site} {port}

e veja se isso funciona. (parece funcionar no meu servidor web, mas no YMMV).

Charles Newey
fonte
pode funcionar, mas parece mudo - telnet deve ter uma opção para sair ou algo assim no primeiro contato
Alexander Mills
10

O método mais simples e fácil é dado abaixo.

 sleep <n> | telnet <server> <port>

n - O tempo de espera em segundos antes da saída automática. Pode ser fracionário como 0,5. Observe que alguma saída necessária pode não ser retornada no tempo de espera especificado. Portanto, podemos precisar aumentar de acordo.

servidor - o IP do servidor de destino ou o nome do host.

port - número da porta de serviço de destino.

Você também pode redirecionar a saída para um arquivo como este,

sleep 1 | telnet <server> <port> > output.log
Seff
fonte
Isso funciona perfeitamente! Embora a saída seja realmente redirecionada, notei que ainda recebo a "Conexão fechada por host externo". saída no meu console após o sono, e não no arquivo output.log. Alguma maneira de evitar isso?
dnLL
5

No meu caso, isso funciona. (CentOS 7):

while read host port; do
r=$(bash -c 'exec 3<> /dev/tcp/'$host'/'$port';echo $?' 2>/dev/null)
if [ "$r" = "0" ]; then
     echo "$host $port is open"
else
     echo "$host $port is closed"
     exit 1 # To force fail result in ShellScript
fi
done
Chuss
fonte
1
Ei, isso é ótimo. Sou usuário de todos os sistemas Linux do meu trabalho, mas não o administrador (e não tenho direitos de administrador). Estou cansado de pedir para que instalem o telnet o tempo todo para que eu possa testar a conectividade de rede (sou engenheiro de rede). Esta é uma excelente solução alternativa. Mudei um pouco para ter um desempenho mais parecido com o telnet. Forneci minha própria resposta aqui com as modificações.
theglossy1
3

Acho melhor ferramenta para enviar comandos diretamente e apenas obter saída seria netcat. É uma ferramenta simples, mas poderosa, para colocar comandos nas portas. Você pode ver um exemplo de uso nesta pergunta de superusuário: /superuser/261900/how-can-i-pipe-commands-to-a-netcat-that-will-stay-alive - asker fornece um exemplo prático em que a conexão fecha após alguns segundos.

E se você quiser apenas testar a conectividade, use este: http://terminalinflection.com/use-netcat-not-telnet-to-test-network-connectivity/

IBr
fonte
Estou tentando instalar o netcat agora, mas não consigo fazer isso. Eu baixei uma versão compilada do powerpc, mas a biblioteca glibc estava ausente. Baixei uma versão compilada do powerpc, mas o dispositivo não tinha espaço suficiente para copiar os arquivos da biblioteca! É possível que a biblioteca glibc já exista, mas o netcat não a encontre?
Muhammad Gelbana
O Netcat é necessário apenas no lado do cliente: no servidor (probe) pode ser o mesmo telnet antigo comum.
IBr
Também Glibc já deve existir, é usado em muitas coisas no sistema usual.
IBr
Você pode tentar adicionar scripts de telnet para && exitver se ele desconecta (no ssh pelo menos é o suficiente).
IBr
&& exitnão funcionou. Se o glibc deveria existir e acredito que sim. Por que nc.traditionalreclamaria como se estivesse faltando?
Muhammad Gelbana
1

Esta é outra versão da resposta acima que a faz agir um pouco mais como a sintaxe telnet "normal". Se você gosta da minha resposta, dê um voto positivo não para isso, mas para o original.

#!/bin/bash
if [ "$2" == "" ]; then
 echo "Syntax: $0 <host> <port>"
 exit;
fi

host=$1
port=$2

r=$(bash -c 'exec 3<> /dev/tcp/'$host'/'$port';echo $?' 2>/dev/null)
if [ "$r" = "0" ]; then
     echo "$host $port is open"
else
     echo "$host $port is closed"
     exit 1 # To force fail result in ShellScript
fi
theglossy1
fonte
1

Aqui está a solução que encontrei na Internet:

( echo open 127.0.0.1 23
sleep 5
echo your_login
sleep 5
echo your_password
sleep 5
echo hostname
sleep 5
echo exit ) | telnet

Funciona para mim no SunOS e HP-UX

Vladimir
fonte
0

Experimentar

echo -e '\x1dclose\x0d' | telnet {HOSTNAME} {PORT}

A melhor parte acima é que você também obtém o status de saída. Se o telnet for bem-sucedido, o código de saída será 0 ou então 1

Abhishek Kumar
fonte
0

Evite o netcat se você tiver rotas personalizadas, pois elas não obedecem às regras de roteamento. Semelhante a como nslookup, dig& hostignore o arquivo / etc / hosts ( nslookup, dig, firefox ignorando as entradas do arquivo / etc / hosts ).

ou seja: ao contrário de aplicativos e ferramentas como telnete /dev/tcp( Testando a porta TCP remota usando telnet executando um comando de uma linha ) que seguem as regras de roteamento do sistema, ncusa o gateway padrão, a menos que seja especificamente solicitado a usar um endereço IP de origem com -s:

nc -w 3 -s 192.168.1.12 example.com 8080

Eu precisava testar se um aplicativo poderia alcançar o recurso e se as rotas estavam inoperantes, netcatinformou que tudo estava bem, pois o endereço de origem havia sido especificado no teste. Estou mudando para o uso /dev/tcp.

legatoproteus
fonte