Utility per porte in listen

10 risposte [Ultimo contenuto]
Ritratto di frank67
frank67
(Monster)
Offline
Monster
Iscritto: 10/07/2013
Messaggi: 487

Avrei bisogno di una utility da usare in uno script bash che mi dica se una porta/servizio è listen/disponibile ad un indirizzo IP. Non volevo usare un network scanner (nmap) per questo, pensavo a qlcs di leggero, che sia possibile per bash interrogare la rete senza valutare lo stato restituito da un programma esterno?
Grazie per ogni risposta.

Ciao, Franco

Ritratto di fareyes
fareyes
(Monster)
Offline
Monster
Iscritto: 14/03/2011
Messaggi: 391

Forse netstat fa al caso tuo? Per sapere porte e processi che girano prova così:

sudo netstat -a | egrep 'Proto|LISTEN' altrimenti puoi provare con
sudo netstat -an | egrep 'Proto|LISTEN'. (E' bastato aggiungere n)

Per sapere invece che cosa gira sulla porta XXX

sudo grep -w XXX /etc/services (dove XXX è il n della porta che vuoi controllare)

Ritratto di frank67
frank67
(Monster)
Offline
Monster
Iscritto: 10/07/2013
Messaggi: 487

No, non in locale Smile intendevo interrogare un indirizzo IP remoto per sapere se ha una porta in listen o no.

Ciao, Franco

Ritratto di fareyes
fareyes
(Monster)
Offline
Monster
Iscritto: 14/03/2011
Messaggi: 391

In rete ci sono un sacco di siti online che dando l'indirizzo ip (remoto) ti dicono quali porte sono aperte e per cosa... devi però cercare tu secondo tue necessità.

Ritratto di frank67
frank67
(Monster)
Offline
Monster
Iscritto: 10/07/2013
Messaggi: 487

Non sono molto avvezzo alla terminologia IP ma per remoto intendevo un IP di un altro computer e per locale l'IP del computer che deve fare il controllo, entrambi appartenenti alla stessa LAN (non faccio scansioni di porte su Internet).
Esiste un modo per fare questo tipo di controllo con bash scripting oppure un tweak usando le utility di sistema?

Ciao, Franco

Ritratto di badroot
badroot
(Guru)
Offline
Guru
Iscritto: 22/08/2008
Messaggi: 2069

Ciao,
una possibile idea, anche se molto molto molto rozza potrebbe essere quella di usare telnet.

echo quit|telnet 192.168.1.100 21|echo $?

Faccio telnet all'indirizzo 192.168.1.100 porta 21 per vedere se c'é un server FTP, gli passo quit per chiudere la connessione.
Se il server é presente torna 0 ( echo $? ), altrimenti 1.

Se credi che sia una cosa esecrabile non hai mica tutti i torti Laughing ...... peró magari ti é di spunto per una soluzione piú elegante.

Potresti provare anche netcat che é piú indicato per fare cose del genere.

Ritratto di frank67
frank67
(Monster)
Offline
Monster
Iscritto: 10/07/2013
Messaggi: 487

SPLENDIDO, FANTASTICO!!! proprio quello che intendevo, nei miei script interrogo sempre la varibile di stato peccato che ehm non funzioni... forse dipende dal servizio da controllare ma la variabile di stato restituisce sempre 1 però posso porvi rimedio matchando l'output con grep.

~$ echo quit|telnet 192.168.0.1 55 
Trying 192.168.0.1...
telnet: Unable to connect to remote host: Connection refused
~$ echo $?
1
~$ echo quit|telnet 192.168.0.1 53
Trying 192.168.0.1...
Connected to 192.168.0.1.
Escape character is '^]'.
Connection closed by foreign host.
~$ echo $?
1

fix o altre idee Applause

Ciao, Franco

Ritratto di badroot
badroot
(Guru)
Offline
Guru
Iscritto: 22/08/2008
Messaggi: 2069

Ciao,
mi sa che ho fatto un pó di confusione, o poca attenzione nelle prove.
Con l'uso di grep :

echo quit|telnet 192.168.1.70 21|grep Connect;echo $?

sembra che funzioni e ritorna l'esito corretto, 0 per successo e 1 per errore.

Ritratto di frank67
frank67
(Monster)
Offline
Monster
Iscritto: 10/07/2013
Messaggi: 487

Grazie Badroot per il tweak, avevo già intuito di usare grep, mi era rimasto il problema di zittirlo:

~$ echo quit|telnet 192.168.0.1 53| grep "Connected to 192.168.0.1." >/dev/null 2>&1
Connection closed by foreign host.

la soluzione era semplicemente di passare lo stderr a /dev/null nel comando telnet e matchare con grep lo stdout, quindi la riga che mi sembri funzionare è:
~$ echo quit|telnet 192.168.0.1 53 2>/dev/null| grep "Connected to 192.168.0.1." >/dev/null
~$ echo $?
0
~$ echo quit|telnet 192.168.0.1 55 2>/dev/null| grep "Connected to 192.168.0.1." >/dev/null
~$ echo $?
1

non so cosa ci sia di più semplice di così Wink

Ciao, Franco

Ritratto di badroot
badroot
(Guru)
Offline
Guru
Iscritto: 22/08/2008
Messaggi: 2069

Ottimo Applause
Sfido a fare una cosa del genere in Windows Wink

Ritratto di frank67
frank67
(Monster)
Offline
Monster
Iscritto: 10/07/2013
Messaggi: 487

badroot ha scritto:

Ottimo Applause
Sfido a fare una cosa del genere in Windows Wink


Scusate per il necrobump Timeout ma ora stavo leggendo la Advanced Bash Scripting (ABS) guide ed a pagina 461 ho trovato spiegato la cosa ideale da fare in un bash script per questo topic: si tratta di usare il socket /dev/tcp in questo modo:
~$ echo "HEAD / HTTP/1.0" >/dev/tcp/192.168.0.1/80
~$ echo $?
0
~$ echo "HEAD / HTTP/1.0" >/dev/tcp/192.168.0.1/53
~$ echo $?
0
~$ echo "HEAD / HTTP/1.0" >/dev/tcp/192.168.0.1/54
-bash: connect: Connessione rifiutata
-bash: /dev/tcp/192.168.0.1/54: Connessione rifiutata
~$ echo $?
1

Cool non mi addentro perché invito tutti i potenziali interessati/incuriositi a leggere la guida, non oso pensare cosa si deve fare in Windows per ottenere un risultato analogo Rolling On The Floor

Ciao, Franco