devref1.html
来自「BASH Shell 编程 经典教程 《高级SHELL脚本编程》中文版」· HTML 代码 · 共 663 行
HTML
663 行
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><HTML><HEAD><TITLE>/dev</TITLE><METANAME="GENERATOR"CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINKREL="HOME"TITLE="高级Bash脚本编程指南"HREF="index.html"><LINKREL="UP"TITLE="/dev和/proc"HREF="devproc.html"><LINKREL="PREVIOUS"TITLE="/dev和/proc"HREF="devproc.html"><LINKREL="NEXT"TITLE="/proc"HREF="procref1.html"></HEAD><BODYCLASS="SECT1"BGCOLOR="#FFFFFF"TEXT="#000000"LINK="#0000FF"VLINK="#840084"ALINK="#0000FF"><DIVCLASS="NAVHEADER"><TABLESUMMARY="Header navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><THCOLSPAN="3"ALIGN="center">高级Bash脚本编程指南: 一本深入学习shell脚本艺术的书籍</TH></TR><TR><TDWIDTH="10%"ALIGN="left"VALIGN="bottom"><AHREF="devproc.html"ACCESSKEY="P">前一页</A></TD><TDWIDTH="80%"ALIGN="center"VALIGN="bottom">27. /dev和/proc</TD><TDWIDTH="10%"ALIGN="right"VALIGN="bottom"><AHREF="procref1.html"ACCESSKEY="N">下一页</A></TD></TR></TABLE><HRALIGN="LEFT"WIDTH="100%"></DIV><DIVCLASS="SECT1"><H1CLASS="SECT1"><ANAME="DEVREF1">27.1. <TTCLASS="FILENAME">/dev</TT></A></H1><P><TTCLASS="FILENAME">/dev</TT>目录包含物理<EM>设备</EM>的条目, 这些设备可能会以硬件的形式出现, 也可能不会. <ANAME="AEN14826"HREF="#FTN.AEN14826"><SPANCLASS="footnote">[1]</SPAN></A> 包含有挂载文件系统的硬驱动器分区, 在<TTCLASS="FILENAME">/dev</TT>目录中都有对应的条目, 就像<AHREF="system.html#DFREF">df</A>命令所展示的那样. <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">df</KBD><SAMPCLASS="COMPUTEROUTPUT">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</SAMP> </PRE></FONT></TD></TR></TABLE> </P><P><ANAME="LOOPBACKREF"></A>在其他方面, <TTCLASS="FILENAME">/dev</TT>目录也包含<EM>环回</EM>设备, 比如<TTCLASS="FILENAME">/dev/loop0</TT>. 一个环回设备就是一种机制, 可以让一般文件访问起来就像块设备那样. <ANAME="AEN14844"HREF="#FTN.AEN14844"><SPANCLASS="footnote">[2]</SPAN></A> 这使得我们可以挂载一个完整的文件系统, 这个文件系统是在一个大文件中所创建的. 参考<AHREF="system.html#CREATEFS">例子 13-8</A>和<AHREF="system.html#ISOMOUNTREF">例子 13-7</A>. </P><P><TTCLASS="FILENAME">/dev</TT>中还有少量的伪设备用于其它特殊目的, 比如<AHREF="zeros.html#ZEROSREF"><TTCLASS="FILENAME">/dev/null</TT></A>, <AHREF="zeros.html#ZEROSREF1"><TTCLASS="FILENAME">/dev/zero</TT></A>, <AHREF="randomvar.html#URANDOMREF"><TTCLASS="FILENAME">/dev/urandom</TT></A>, <TTCLASS="FILENAME">/dev/sda1</TT>, <TTCLASS="FILENAME">/dev/udp</TT>, 和<TTCLASS="FILENAME">/dev/tcp</TT>. </P><P>举个例子: </P><P>为了<AHREF="system.html#MOUNTREF">挂载(mount)</A>一个USB闪存驱动器, 将下边一行附加到<TTCLASS="FILENAME">/etc/fstab</TT>中. <ANAME="AEN14865"HREF="#FTN.AEN14865"><SPANCLASS="footnote">[3]</SPAN></A> <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 /dev/sda1 /mnt/flashdrive auto noauto,user,noatime 0 0</PRE></FONT></TD></TR></TABLE> (也请参考<AHREF="contributed-scripts.html#USBINST">例子 A-24</A>.)</P><P><ANAME="SOCKETREF"></A></P><P>当在<TTCLASS="FILENAME">/dev/tcp/$host/$port</TT>伪设备文件上执行一个命令的时候, Bash会打开一个TCP连接, 也就是打开相关的<EM>socket</EM>. <ANAME="AEN14880"HREF="#FTN.AEN14880"><SPANCLASS="footnote">[4]</SPAN></A> </P><P>从<TTCLASS="FILENAME">nist.gov</TT>上获取时间: </P><TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">cat </dev/tcp/time.nist.gov/13</KBD><SAMPCLASS="COMPUTEROUTPUT">53082 04-03-18 04:26:54 68 0 0 502.3 UTC(NIST) *</SAMP> </PRE></FONT></TD></TR></TABLE><P>[Mark贡献了上面的例子.]</P><P>下载一个URL: </P><TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">exec 5<>/dev/tcp/www.net.cn/80</KBD><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">echo -e "GET / HTTP/1.0\n" >&5</KBD><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">cat <&5</KBD> </PRE></FONT></TD></TR></TABLE><P>[感谢, Mark和Mihai Maties.]</P><DIVCLASS="EXAMPLE"><HR><ANAME="DEVTCP"></A><P><B>例子 27-1. 利用<TTCLASS="FILENAME">/dev/tcp</TT>来检修故障</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 #!/bin/bash 2 # dev-tcp.sh: 利用/dev/tcp重定向来检查Internet连接. 3 4 # 本脚本由Troy Engel编写. 5 # 经过授权在本书中使用. 6 7 TCP_HOST=www.dns-diy.com # 一个已知的对垃圾邮件友好的ISP. 8 TCP_PORT=80 # 端口80是http. 9 10 # 尝试连接. (有些像'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</PRE></FONT></TD></TR></TABLE><HR></DIV><P>译者注: 由于上边例子的输出大部分都是英文, 所以译者补充一下脚本输出的译文. </P><P>如果bash以--enable-net-redirections选项来编译, 那么它就拥有了使用一个特殊字符设备的能力, 这个特殊字符设备用于TCP和UDP重定向. 这种重定向的能力就像STDIN/STDOUT/STDERR一样被使用. 该设备/dev/tcp的主次设备号是30, 36: </P><P> <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="100%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 mknod /dev/tcp c 30 36</PRE></FONT></TD></TR></TABLE> </P><P>>摘自bash参考手册: </P><P>/dev/tcp/host/port</P><P>如果host是一个有效的主机名或Internet地址, 并且port是一个整数端口号或者是服务器名称, Bash将会打开一个TCP连接, 到相应的socket上. </P></DIV><H3CLASS="FOOTNOTES">注意事项</H3><TABLEBORDER="0"CLASS="FOOTNOTES"WIDTH="100%"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="5%"><ANAME="FTN.AEN14826"HREF="devref1.html#AEN14826"><SPANCLASS="footnote">[1]</SPAN></A></TD><TDALIGN="LEFT"VALIGN="TOP"WIDTH="95%"><P><TTCLASS="FILENAME">/dev</TT>目录中的条目为各种物理设备和虚拟设备提供挂载点. 这些条目占用非常少的硬盘空间. </P><P>某些设备, 比如<TTCLASS="FILENAME">/dev/null</TT>, <TTCLASS="FILENAME">/dev/zero</TT>, 和<TTCLASS="FILENAME">/dev/urandom</TT>都是虚拟的. 它们都不是真实的物理设备, 它们仅仅存在于软件中. </P></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="5%"><ANAME="FTN.AEN14844"HREF="devref1.html#AEN14844"><SPANCLASS="footnote">[2]</SPAN></A></TD><TDALIGN="LEFT"VALIGN="TOP"WIDTH="95%"><P><EM>块设备</EM>都是以块为单位进行读写的, 与之相对应的<EM>字符设备</EM>都是以字符为单位进行访问的. 典型的块设备比如硬盘和CD ROM驱动器. 典型的字符设备例如键盘. </P></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="5%"><ANAME="FTN.AEN14865"HREF="devref1.html#AEN14865"><SPANCLASS="footnote">[3]</SPAN></A></TD><TDALIGN="LEFT"VALIGN="TOP"WIDTH="95%"><P>当然, 挂载点<TTCLASS="FILENAME">/mnt/flashdrive</TT>必须存在. 如果不存在, 请使用root用户来执行<BCLASS="COMMAND">mkdir /mnt/flashdrive</B>. </P><P>为了能够真正的挂载驱动器, 请使用下面的命令: <BCLASS="COMMAND">mount /mnt/flashdrive</B></P><P>对于现在比较新的Linux发行版来说, 都会自动把闪存驱动器设备挂载到<TTCLASS="FILENAME">/media</TT>目录上. </P></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="5%"><ANAME="FTN.AEN14880"HREF="devref1.html#AEN14880"><SPANCLASS="footnote">[4]</SPAN></A></TD><TDALIGN="LEFT"VALIGN="TOP"WIDTH="95%"><P><EM>socket</EM>是一个通讯节点, 这个通讯节点与一个特殊的I/O端口相关联. 它允许数据传输, 可以在同一台机器的不同硬件设备间传输, 可以在同一个网络中的不同主机之间传输, 可以在不同网络的不同主机间传输, 当然, 也可以在Internet上的不同地区之间的不同主机之间传输. </P></TD></TR></TABLE><DIVCLASS="NAVFOOTER"><HRALIGN="LEFT"WIDTH="100%"><TABLESUMMARY="Footer navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top"><AHREF="devproc.html"ACCESSKEY="P">前一页</A></TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="index.html"ACCESSKEY="H">首页</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top"><AHREF="procref1.html"ACCESSKEY="N">下一页</A></TD></TR><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top">/dev和/proc</TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="devproc.html"ACCESSKEY="U">上一级</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top"><TTCLASS="FILENAME">/proc</TT></TD></TR></TABLE></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?