Test della porta TCP remota utilizzando telnet eseguendo un comando a una riga


12

Ho numerose scatole Linux con un set molto limitato di comandi e spazio su disco. Ma ha il telnetcomando su di esso.

Mi collego in remoto a ciascuna di queste sonde (a livello di codice) e invio un comando linux di linea tramite SSH.

Devo eseguire un singolo comando per connettermi a una macchina specifica, utilizzando telnet, quindi disconnettermi immediatamente .

Posso fare tutto ciò, ma la disconnessione immediatamente parte. Telnet apre una sorta di console o terminale e non riesco a capire un comando a una riga per eseguire il comando telnet e quindi disconnettermi immediatamente.

Se lo faccio, posso facilmente analizzare l'output testuale per i messaggi di errore per non essere in grado di connettermi alla macchina sulla porta specificata ed è esattamente quello che sto cercando.

Quindi, come posso eseguire un comando di una riga per connettersi a una macchina utilizzando Telnet e disconnettersi in seguito?


Come capisco, il tuo client Telnet non supporta l'invio diretto?
IBr

@IBr, cosa intendi?
Muhammad Gelbana,

Si noti che i client di telent differiscono nel codice di uscita riportato dopo che il comando di uscita lato client è stato utilizzato per terminarlo. Pertanto, il codice di uscita zero non deve essere considerato un segnale di apertura della porta. Almeno non funziona con RHEL telent RPM.
Oliver Gondža,

Risposte:


28

Dovresti essere in grado di reindirizzare il exitcomando a STDIN in telnet. Provare:

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

e vedi se funziona. (sembra funzionare sul mio server web, ma YMMV).


potrebbe funzionare ma sembra stupido - Telnet dovrebbe avere un'opzione per uscire o qualcosa al primo contatto
Alexander Mills

10

Di seguito è riportato il metodo più semplice e facile.

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

n - Il tempo di attesa in secondi prima dell'uscita automatica. Potrebbe essere frazionario come 0,5. Si noti che alcuni output richiesti potrebbero non essere restituiti nel tempo di attesa specificato. Quindi potrebbe essere necessario aumentare di conseguenza.

server - L'IP o il nome host del server di destinazione.

port - Numero porta del servizio di destinazione.

Puoi anche reindirizzare l'output su file in questo modo,

sleep 1 | telnet <server> <port> > output.log

Funziona perfettamente! Mentre l'output viene effettivamente reindirizzato, ho notato che ricevo ancora la "Connessione chiusa da host straniero". output nella mia console dopo lo sleep piuttosto che nel file output.log. Un modo per impedirlo?
dan

5

Nel mio caso funziona. (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

1
Ehi, è grandioso. Sono un utente su tutti i sistemi Linux nel mio lavoro, ma non l'amministratore (e non ho diritti di amministratore). Sono stufo di chiedere loro di installare telnet continuamente in modo da poter testare la connettività di rete (sono un ingegnere di rete). Questa è una soluzione eccellente. L'ho cambiato un po 'per funzionare di più come telnet. Ho fornito la mia risposta qui con le modifiche.
theglossy1,

3

Penso che lo strumento migliore per inviare comandi direttamente e ottenere l'output sarebbe netcat. È solo uno strumento semplice ma potente per inserire comandi attraverso le porte. È possibile visualizzare un esempio di utilizzo in questa domanda del superutente: /superuser/261900/how-can-i-pipe-commands-to-a-netcat-that-will-stay-alive - asker fornisce un esempio funzionante in cui la connessione si chiude dopo pochi secondi.

E se vuoi solo testare la connettività usa questo: http://terminalinflection.com/use-netcat-not-telnet-to-test-network-connectivity/


Sto cercando di installare netcat in questo momento ma non riesco a farlo. Ho scaricato una versione compilata di powerpc ma mancava la libreria glibc. Ho scaricato una versione compilata di powerpc ma il dispositivo non aveva abbastanza spazio per copiare i file della libreria! È possibile che la libreria glibc esista già ma netcat non riesca a trovarla?
Muhammad Gelbana,

Netcat è necessario solo sul lato client: sul server (probe) può essere lo stesso vecchio telnet normale.
IBr

Anche Glibc dovrebbe esistere già, è usato su molte cose nel solito sistema.
IBr

Potresti provare ad aggiungere agli script telnet per && exitvedere se si disconnette (in ssh almeno è abbastanza).
IBr

&& exitnon ha funzionato. Se glibc dovesse esistere e credo che lo sia. Perché nc.traditionallamentarsene come se mancasse?
Muhammad Gelbana,

1

Questa è un'altra versione della risposta sopra che lo fa sembrare un po 'più simile alla sintassi telnet "normale". Se ti piace la mia risposta, per favore dai un voto non a questo, ma all'originale.

#!/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

1

Ecco la soluzione che ho trovato su 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

Funziona per me su SunOS e HP-UX


0

Provare

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

La parte migliore di cui sopra è ottenere anche lo stato di uscita. Se telnet ha esito positivo, il codice di uscita sarà 0 oppure il suo 1


0

Evita netcat se disponi di percorsi personalizzati, poiché non rispetta le regole di routing. Simile a come nslookup, dige hostignorare il file / etc / hosts ( nslookup, dig, firefox ignorando le voci del file / etc / hosts ).

vale a dire: a differenza di applicazioni e strumenti come telnete /dev/tcp( Test della porta TCP remota utilizzando telnet eseguendo un comando di una riga ) che seguono le regole di routing del sistema, ncutilizza il gateway predefinito a meno che non sia espressamente indicato di utilizzare un indirizzo IP di origine con -s:

nc -w 3 -s 192.168.1.12 example.com 8080

Avevo bisogno di verificare se un'applicazione poteva raggiungere la risorsa e se i percorsi erano inattivi, ha netcatriferito che tutto andava bene poiché l'indirizzo di origine era stato specificato nel test. Sto passando all'utilizzo /dev/tcp.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.