Una sorpresa che ho scoperto di recente è che Bash supporta nativamente le connessioni tcp come descrittori di file. Per utilizzare:
exec 6<>/dev/tcp/ip.addr.of.server/445
echo -e "GET / HTTP/1.0\n" >&6
cat <&6
Sto usando 6 come descrittore di file perché 0,1,2 sono stdin, stdout e stderr. 5 è talvolta usato da Bash per i processi figlio, quindi 3,4,6,7,8 e 9 dovrebbero essere sicuri.
Come da commento qui sotto, per testare l'ascolto su un server locale in uno script:
exec 6<>/dev/tcp/127.0.0.1/445 || echo "No one is listening!"
exec 6>&- # close output connection
exec 6<&- # close input connection
Per determinare se qualcuno sta ascoltando, prova a connetterti tramite loopback. Se fallisce, la porta è chiusa o non ci è consentito l'accesso. Successivamente, chiudi la connessione.
Modificalo per il tuo caso d'uso, come l'invio di un'e-mail, l'uscita dallo script in caso di errore o l'avvio del servizio richiesto.
C'è un brevissimo con "risposta veloce" qui:Come verificare se la porta TCP remota è aperta dallo script Shell?
nc -z <host> <port>; echo $?
Lo uso con 127.0.0.1 come indirizzo "remoto".
questo restituisce "0" se la porta è aperta e "1" se la porta è chiusa
ad esempio
nc -z 127.0.0.1 80; echo $?
-z Specifica che nc deve cercare i demoni in ascolto, senza inviare loro alcun dato. È un errore usare questa opzione insieme all'opzione -l.
Puoi utilizzare netstat in questo modo per ottenere risultati molto più rapidi:
Su Linux:
netstat -lnt | awk '$6 == "LISTEN" && $4 ~ /\.445$/'
Su Mac:
netstat -anp tcp | awk '$6 == "LISTEN" && $4 ~ /\.445$/'
Questo produrrà un elenco di processi in ascolto sulla porta (445 in questo esempio) o non produrrà nulla se la porta è libera.
Puoi usare netcat per questo.
nc ip port < /dev/null
si connette al server e chiude di nuovo direttamente la connessione. Se netcat non è in grado di connettersi, restituisce un codice di uscita diverso da zero. Il codice di uscita è memorizzato nella variabile $?. Ad esempio,
nc ip port < /dev/null; echo $?
restituirà 0 se e solo se netcat può connettersi correttamente alla porta.