A Linux or UNIX machine typically has the /dev and /proc special-purpose directories.
The /dev directory contains entries for the physical devices that may or may not be present in the hardware. [1] The hard drive partitions containing the mounted filesystem(s) have entries in /dev, as a simple df shows.
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 |
Among other things, the /dev directory also contains loopback devices, such as /dev/loop0. A loopback device is a gimmick that allows an ordinary file to be accessed as if it were a block device. [2] This enables mounting an entire filesystem within a single large file. See Example 16-8 and Example 16-7.
A few of the pseudo-devices in /dev have other specialized uses, such as /dev/null, /dev/zero, /dev/urandom, /dev/sda1, /dev/udp, and /dev/tcp.
For instance:
To mount a USB flash drive, append the following line to /etc/fstab. [3]
1 /dev/sda1 /mnt/flashdrive auto noauto,user,noatime 0 0 |
Checking whether a disk is in the CD-burner (soft-linked to /dev/hdc):
1 head -1 /dev/hdc 2 3 4 # head: cannot open '/dev/hdc' for reading: No medium found 5 # (No disc in the drive.) 6 7 # head: error reading '/dev/hdc': Input/output error 8 # (There is a disk in the drive, but it can't be read; 9 #+ possibly it's an unrecorded CDR blank.) 10 11 # Stream of characters and assorted gibberish 12 # (There is a pre-recorded disk in the drive, 13 #+ and this is raw output -- a stream of ASCII and binary data.) 14 # Here we see the wisdom of using 'head' to limit the output 15 #+ to manageable proportions, rather than 'cat' or something similar. 16 17 18 # Now, it's just a matter of checking/parsing the output and taking 19 #+ appropriate action. |
When executing a command on a /dev/tcp/$host/$port pseudo-device file, Bash opens a TCP connection to the associated socket.
Getting the time from nist.gov:
bash$ cat </dev/tcp/time.nist.gov/13 53082 04-03-18 04:26:54 68 0 0 502.3 UTC(NIST) * |
[Mark contributed the above example.]
Downloading a URL:
bash$ exec 5<>/dev/tcp/www.net.cn/80 bash$ echo -e "GET / HTTP/1.0\n" >&5 bash$ cat <&5 |
[Thanks, Mark and Mihai Maties.]
Example 27-1. Using /dev/tcp for troubleshooting
1 #!/bin/bash 2 # dev-tcp.sh: /dev/tcp redirection to check Internet connection. 3 4 # Script by Troy Engel. 5 # Used with permission. 6 7 TCP_HOST=www.dns-diy.com # A known spam-friendly ISP. 8 TCP_PORT=80 # Port 80 is http. 9 10 # Try to connect. (Somewhat similar to a 'ping' . . .) 11 echo "HEAD / HTTP/1.0" >/dev/tcp/${TCP_HOST}/${TCP_PORT} 12 MYEXIT=$? 13 14 : <<EXPLANATION 15 If bash was compiled with --enable-net-redirections, it has the capability of 16 using a special character device for both TCP and UDP redirections. These 17 redirections are used identically as STDIN/STDOUT/STDERR. The device entries 18 are 30,36 for /dev/tcp: 19 20 mknod /dev/tcp c 30 36 21 22 >From the bash reference: 23 /dev/tcp/host/port 24 If host is a valid hostname or Internet address, and port is an integer 25 port number or service name, Bash attempts to open a TCP connection to the 26 corresponding socket. 27 EXPLANATION 28 29 30 if [ "X$MYEXIT" = "X0" ]; then 31 echo "Connection successful. Exit code: $MYEXIT" 32 else 33 echo "Connection unsuccessful. Exit code: $MYEXIT" 34 fi 35 36 exit $MYEXIT |
[1] | The entries in /dev provide mount points for physical and virtual devices. These entries use very little drive space. Some devices, such as /dev/null, /dev/zero, and /dev/urandom are virtual. They are not actual physical devices and exist only in software. |
[2] | A block device reads and/or writes data in chunks, or blocks, in contrast to a character device, which acesses data in character units. Examples of block devices are a hard drive and CD ROM drive. An example of a character device is a keyboard. |
[3] | Of course, the mount point /mnt/flashdrive must exist. If not, then, as root, mkdir /mnt/flashdrive. To actually mount the drive, use the following command: mount /mnt/flashdrive Newer Linux distros automount flash drives in the /media directory. |