Guida avanzata di scripting Bash: Un'approfondita esplorazione dell'arte dello scripting di shell | ||
---|---|---|
Indietro | Avanti |
Una tipica macchina Linux, o UNIX, possiede due directory che hanno funzioni particolari: /dev e /proc.
La directory /dev contiene l'elenco di tutti i dispositivi fisici che possono o meno essere presenti nel hardware. [1] Le partizioni di un hard disk contenenti il/i filesystem montato/i si trovano in /dev, come un semplice df può mostrare.
bash$ df Filesystem 1k-blocks Used Available Use% Mounted on /dev/hda6 495876 222748 247527 48% / /dev/hda1 50755 3887 44248 9% /boot /dev/hda8 367013 13262 334803 4% /home /dev/hda5 1714416 1123624 503704 70% /usr |
Tra l'altro, la directory /dev contiene anche i dispositivi di loopback, come /dev/loop0. Un dispositivo di loopback rappresenta un espediente che permette l'accesso ad un file ordinario come se si trattasse di un dispositivo a blocchi. [2] In questo modo si ha la possibilità di montare un intero filesystem all'interno di un unico, grande file. Vedi Esempio 16-8 e Esempio 16-7.
In /dev sono presenti anche alcuni altri file con impieghi specifici, come /dev/null, /dev/zero, /dev/urandom, /dev/sda1, /dev/udp e /dev/tcp.
Ad esempio:
Per montare una memoria flash USB, si aggiunga la riga seguente nel file /etc/fstab. [3]
/dev/sda1 /mnt/memoriaflash auto noauto,user,noatime 0 0 |
Verificare se è presente un disco nel masterizzatore CD (link simbolico a /dev/hdc):
head -1 /dev/hdc # head: cannot open '/dev/hdc' for reading: No medium found # (Nessun disco nel masterizzatore.) # head: error reading '/dev/hdc': Input/output error # (Il disco c'è, ma non può essere letto; #+ probabilmente un CDR vergine.) # Serie di caratteri e vari simboli strani # (Nel masterizzatore è presente un disco già registrato, #+ e questo è l'output -- una serie di caratteri ASCII e dati binari.) # Qui vediamo la saggezza dell'uso di 'head' che limita l'output #+ a proporzioni gestibili, piuttosto che 'cat' o qualcos'altro di simile. # Ora è solo questione di controllare/verificare l'output e #+ intraprendere l'azione appropriata. |
Quando viene eseguito un comando sul file di pseudo-dispositivo /dev/tcp/$host/$porta, Bash apre una connessione TCP al socket associato. [4]
Ottenere l'ora da nist.gov:
bash$ cat </dev/tcp/time.nist.gov/13 53082 04-03-18 04:26:54 68 0 0 502.3 UTC(NIST) * |
[L'esempio precedente è stato fornito da Mark.]
Scaricare un URL:
bash$ exec 5<>/dev/tcp/www.net.cn/80 bash$ echo -e "GET / HTTP/1.0\n" >&5 bash$ cat <&5 |
[Grazie a Mark e Mihai Maties.]
Esempio 27-1. Uso di /dev/tcp per la verifica di una connessione
#!/bin/bash # dev-tcp.sh: redirezione /dev/tcp per il controllo della connessione Internet. # Script di Troy Engel. # Utilizzato con il permesso dell'autore. HOST_TCP=www.dns-diy.com # Un noto ISP amico degli spammer. PORTA_TCP=80 # La porta 80 viene usata da http. # Tentativo di connessione. (Abbastanza simile a un 'ping.') echo "HEAD / HTTP/1.0" >/dev/tcp/${HOST_TCP}/${PORTA_TCP} MIOEXIT=$? : <<SPIEGAZIONE Se bash è stata compilata con l'opzione --enable-net-redirections, ha la capacità di utilizzare uno speciale dispositivo a caratteri per redirigere sia TCP che UDP. Queste redirezioni vengono usate alla stessa identica maniera degli STDIN/STDOUT/STDERR. I valori per il dispositivo /dev/tcp sono 30,36: mknod /dev/tcp c 30 36 >Dalla bash reference: /dev/tcp/host/port Se host è un nome valido o un indirizzo Internet, e port un numero intero di una porta o il nome di un servizio, Bash tenta di aprire una connessione TCP al socket corrispondente. SPIEGAZIONE if [ "X$MIOEXIT" = "X0" ]; then echo "Connessione riuscita. Codice d'uscita: $MIOEXIT" else echo "Connessione fallita. Codice d'uscita: $MIOEXIT" fi exit $MIOEXIT |
[1] | I file presenti in /dev forniscono i punti di mount per i dispositivi fisici o virtuali. Queste registrazioni occupano pochissimo spazio su disco. Alcuni dispositivi, come /dev/null, /dev/zero e /dev/urandom sono virtuali. Non corrispondono, quindi, ad alcun dispositivo fisico ed esistono solo a livello software. |
[2] | Un dispositivo a blocchi legge e/o scrive i dati in spezzoni, o blocchi, a differenza di un dispositivo a caratteri che accede ai dati un carattere alla volta. Esempi di dispositivi a blocchi sono l'hard disk e il CD ROM. Un esempio di dispositivo a caratteri è la tastiera. |
[3] | Naturalmente, il punto di mount /mnt/memoriaflash dev'essere già stato creato. In caso contrario, come utente root, mkdir /mnt/memoriaflash. Il "montaggio" effettivo della memoria viene effettuato tramite il comando: mount /mnt/memoriaflash Le distribuzioni Linux più recenti montano le memorie flash automaticamente nella directory /media. |
[4] | Un socket è un nodo di comunicazione associato ad una specifica porta I/O. (È analogo ad un socket hardware, o presa, per la connessione di un cavo.) Consente il trasferimento di dati tra i dispositivi hardware della stessa macchina, tra macchine della stessa rete, tra macchine appartenenti a reti diverse e, naturalmente, tra macchine dislocate in posti differenti dell'Internet. |