Bash fornisce pseudo dispositivi con cui probabilmente hai familiarità /dev/null
. Tuttavia ci sono altri dispositivi come /dev/tcp
e /dev/udp
per testare le connessioni di rete, che puoi usare anche all'interno degli script Bash.
estratto dalla pagina man di Bash
Bash gestisce diversi nomi di file specialmente quando vengono utilizzati nei reindirizzamenti, come descritto nella tabella seguente:
/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.
Esempio
Qui sto testando la connessione a un host nel mio dominio chiamato skinner e vedo se riesco a connettermi alla sua porta 22.
NOTA: la porta 22 è per SSH, per telnet utilizzare la porta 23.
$ echo > /dev/tcp/skinner/22 && echo "it's up" || echo "it's down"
it's up
Ottimo quindi proviamo un non-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
Bene, funziona, ma è un risultato terribilmente brutto. Da non preoccuparsi. È possibile eseguire echo > /dev/tcp/...
in una subshell e reindirizzare tutto l'output /dev/null
per pulirlo un po '. Ecco lo schema che puoi usare nei tuoi script di 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