Sur un système de fichiers Linux ou UNIX, se trouvent généralement les répertoires spéciaux /dev et /proc.
Le répertoire /dev contient des entrées pour les périphériques physiques, qu'ils soient ou non matériellement présents. [114] Comme de juste, ces entrées sont appelées fichiers de périphériques. A titre d'exemple, les partitions du disque dur qui contiennent des systèmes de fichiers montés ont des entrées dans /dev, ainsi qu'un simple df le montre.
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
Entre autres choses, le répertoire /dev contient des périphériques loopback, tels que /dev/loop0. Un périphérique loopback est une astuce qui permet à un fichier ordinaire d'être accédé comme s'il était un périphérique bloc. [115] Ceci rend possible le montage d'un système de fichiers entier en un seul gros fichier. Voir l'Exemple 17.8, « Création d'un système de fichiers dans un fichier » et l'Exemple 17.7, « Vérifier une image ».
Quelques pseudo-périphériques dans /dev ont d'autres utilisations spécialisées, telles que /dev/null, /dev/zero, /dev/urandom, /dev/sda1 (partition du disque dur), /dev/udp (port UDP - User Datagram Packet), et /dev/tcp.
Par exemple :
Pour monter à la main un lecteur flash USB, ajoutez la ligne suivante à /etc/fstab. [116]
/dev/sda1 /mnt/flashdrive auto noauto,user,noatime 0 0
(voir aussi l'Exemple A.23, « Monter des périphériques de stockage USB »).
Vérifier si un disque est dans le graveur de CD (lien vers /dev/hdc):
head -1 /dev/hdc # head: cannot open '/dev/hdc' for reading: No medium found # (Aucun disque dans le lecteur.) # head: error reading '/dev/hdc': Input/output error # (Il y a un disque dans le lecteur mais il ne peut être lu ; #+ à priori un CDR vierge.) # Flux de caractères et autres cochonneries associées # (Il y a un disque pré-enregistré dans le lecteur #+ et vous avez un affichage direct — un flux de données ASCII et binaires.) # Ici nous voyons we see l'intérêt de limiter la sortie dans des proportions #+ gérables, plutôt que d'utiliser 'cat' ou un autre outil similaire. # Maintenant, il s'agit seulement de vérifier/analyser la sortie #+ et d'exécuter une action appropriée.
Lors de l'exécution d'une commande sur le fichier pseudo-périphérique /dev/tcp/$host/$port, Bash ouvre une connexion TCP vers la socket associée.
Les exemples suivants supposent une connexion Internet active.
Obtenir l'heure de nist.gov :
bash$ cat </dev/tcp/time.nist.gov/13 53082 04-03-18 04:26:54 68 0 0 502.3 UTC(NIST) *
[Cet exemple est de Mark.]
Généralisation à l'aide d'un script
#!/bin/bash # Ce sript nécessite les permissions de root. URL="time.nist.gov/13" Heure=$(cat </dev/tcp/"$URL") UTC=$(echo "$Heure" | awk '{print$3}') # Le 3ème champ est l'heure UTC (GMT) # Exercice : modifier pour différents fuseaux horaires. echo "Heure UTC (GMT) = "$UTC""
Télécharger une URL :
bash$ exec 5<>/dev/tcp/www.net.cn/80 bash$ echo -e "GET / HTTP/1.0\n" >&5 bash$ cat <&5
[Merci à Mark et Mihai Maties.]
Exemple 29.1. Utiliser /dev/tcp pour corriger des problèmes
#!/bin/bash # dev-tcp.sh: /dev/tcp redirection to check Internet connection. # Script by Troy Engel. # Used with permission. TCP_HOST=www.dns-diy.com # A known spam-friendly ISP. TCP_PORT=80 # Port 80 is http. # Try to connect. (Somewhat similar to a 'ping' . . .) echo "HEAD / HTTP/1.0" >/dev/tcp/${TCP_HOST}/${TCP_PORT} MYEXIT=$? : <<EXPLANATION If bash was compiled with --enable-net-redirections, it has the capability of using a special character device for both TCP and UDP redirections. These redirections are used identically as STDIN/STDOUT/STDERR. The device entries are 30,36 for /dev/tcp: mknod /dev/tcp c 30 36 >From the bash reference: /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. EXPLANATION if [ "X$MYEXIT" = "X0" ]; then echo "Connection successful. Exit code: $MYEXIT" else echo "Connection unsuccessful. Exit code: $MYEXIT" fi exit $MYEXIT
Exemple 29.2. Jouer de la musique
#!/bin/bash # music.sh # MUSIC WITHOUT EXTERNAL FILES # Author: Antonio Macchi # Used in ABS Guide with permission # /dev/dsp default = 8000 frames per second, 8 bits per frame (1 byte), #+ 1 channel (mono) duration=2000 # If 8000 bytes = 1 second, then 2000 = 1/4 second. volume=$'\xc0' # Max volume = \xff (or \x00). mute=$'\x80' # No volume = \x80 (the middle). function mknote () # $1=Note Hz in bytes (e.g. A = 440Hz :: { #+ 8000 fps / 440 = 16 :: A = 16 bytes per second) for t in `seq 0 $duration` do test $(( $t % $1 )) = 0 && echo -n $volume || echo -n $mute done } e=`mknote 49` g=`mknote 41` a=`mknote 36` b=`mknote 32` c=`mknote 30` cis=`mknote 29` d=`mknote 27` e2=`mknote 24` n=`mknote 32767` # European notation. echo -n "$g$e2$d$c$d$c$a$g$n$g$e$n$g$e2$d$c$c$b$c$cis$n$cis$d \ $n$g$e2$d$c$d$c$a$g$n$g$e$n$g$a$d$c$b$a$b$c" > /dev/dsp # dsp = Digital Signal Processor exit # A "bonny" example of a shell script!
[114] Les entrées dans /dev fournissent des points de montage pour les périphériques physiques et virtuels. Ces entrées utilisent très peu d'espace disque.
Quelques périphériques, tels que /dev/null, /dev/zero, et /dev/urandom sont virtuels. Ce ne sont pas des périphériques physiques et ils existent seulement au niveau logiciel.
[115] Un périphérique bloc lit et/ou écrit les données par morceaux, ou blocs, par opposition avec le périphérique caractère, qui accède aux données caractère par caractère. Les périphériques bloc sont par exemple les disques durs, lecteurs CD ROM, lecteurs de mémoire flash. Les claviers, modems ou cartes son est un exemple de périphériques caractères.
[116] Bien sûr, le point de montage /mnt/lecteur_flash doit exister. Dans le cas contraire, en tant qu'utilisateur root, mkdir /mnt/flashdrive.
Pour monter réellement le lecteur, utilisez la commande suivante : mount /mnt/lecteur_flash
Les nouvelles distributions Linux montent automatiquement les clés USB dans le répertoire /media sans intervention de l'utilisateur.