Linux系统工程师教程
Upcoming SlideShare
Loading in...5
×
 

Linux系统工程师教程

on

  • 3,060 views

 

Statistics

Views

Total Views
3,060
Views on SlideShare
3,059
Embed Views
1

Actions

Likes
2
Downloads
65
Comments
0

1 Embed 1

http://www.slideshare.net 1

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Linux系统工程师教程 Linux系统工程师教程 Presentation Transcript

    • Linux 实用教程 刘兵 吴煜煌等编著 本书从三个方面来介绍 Red Hat Linux 操作系统。第一部分是 Red Hat Linux 操作系统的安装、配置及常用命令。第二部分是 Red Hat Linux 操作系统的网络管理。包括如何管理用户,如何设置 DNS 服务器, SMTP/POP3 E-mail 服务器, Web 服务器, NFS 服务器以及文件和打印服务器, FTP 服务器的配置和维护,最后对 Linux 系统的网络安全及应用架构进行了讲解。第三部分是如何在 Red Hat Linux 进行程序设计,包括一个程序的编辑、编译、调试、生成 RPM 安装包的整个过程。本书使用 Red Hat 9.0 版本为例来描述。 本书适合高等学校计算机专业及计算机网络专业的学生使用。也可作为 Linux 系统管理人员、网络管理人员及广大 Linux 爱好者学习使用。
    • 1.1 Linux 概述
      • 1.1.1 Linux 简介
      • 什么是 Linux
      • 简单地说, Linux 是一套免费使用和自由传播的类 Unix 操作系统,它主要用于基于 Intel x86 系列 CPU 的计算机上。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的 Unix 兼容产品。
      • Linux 最早由一位名叫 Linus Torvalds 的计算机爱好者开发,他的目的是设计一个代替 Minix 的操作系统,这个操作系统可用于 386 、 486 或奔腾处理器的个人计算机上,并且具有 Unix 操作系统的全部功能。
      第 1 章 Linux 概况及安装
    • Linux 以它的高效性和灵活性著称。它能够在个人计算机上实现全部的 Unix 特性,具有多任务、多用户的能力。 Linux 可在 GNU (“不是 UNIX ” 工程的缩写)公共许可权限下免费获得,是一个符合 POSIX 标准的操作系统。 Linux 操作系统软件包不仅包括完整的 Linux 操作系统,而且还包括了文本编辑器、高级语言编译器等应用软件。它还包括带有多个窗口管理器的 X-Windows 图形用户界面,如同我们使用 Windows NT 一样,允许我们使用窗口、图标和菜单对系统进行操作。
      • Linux 之所以受到广大计算机爱好者的喜爱,主要原因有两个,一是它属于自由软件,用户不用支付任何费用就可以获得它和它的源代码,并且可以根据自己的需要对它进行必要的修改和无约束地继续传播。另一个原因是,它具有 Unix 的全部功能,任何使用 Unix 操作系统或想要学习 Unix 操作系统的人都可以从 Linux 中获益。
    • 2. Linux 系统的主要特点
      • 开放性 : 指系统遵循世界标准规范,特别是遵循开放系统互连( OSI )国际标准 。
      • 多用户 : 是指系统资源可以被不同用户使用,每个用户对自己的资源(例如:文件、设备)有特定的权限,互不影响。
      • 多任务 : 它是指计算机同时执行多个程序,而且各个程序的运行互相独立 。
      • 良好的用户界面 : Linux 向用户提供了两种界面:用户界面和系统调用。 Linux 还为用户提供了图形用户界面。它利用鼠标、菜单、窗口、滚动条等设施,给用户呈现一个直观、易操作、交互性强的友好的图形化界面。
      • 设备独立性 : 是指操作系统把所有外部设备统一当作成文件来看待,只要安装它们的驱动程序,任何用户都可以象使用文件一样,操纵、使用这些设备,而不必知道它们的具体存在形式。 Linux 是具有设备独立性的操作系统,它的内核具有高度适应能力
      • 提供了丰富的网络功能 : 完善的内置网络是 Linux 一大特点。
      • 可靠的安全系统 : Linux 采取了许多安全技术措施,包括对读、写控制、带保护的子系统、审计跟踪、核心授权等,这为网络多用户环境中的用户提供了必要的安全保障。
      • 良好的可移植性 : 是指将操作系统从一个平台转移到另一个平台使它仍然能按其自身的方式运行的能力。 Linux 是一种可移植的操作系统,能够在从微型计算机到大型计算机的任何环境中和任何平台上运行。
    • 3 LINUX 的组成
      • LINUX 的内核 : 内核是系统的核心,是运行程序和管理 像磁盘和打印机等硬件设备的核心程序。
      • LINUX SHELL : Shell 是系统的用户界面,提供了用户与内核进行交互操作的一种接口。
      • LINUX 文件系统 : Linux 文件系统是文件存放在磁盘等存储设备上的组织方法。 Linux 能支持多种目前浒的文件系统,如 EXT2 、 EXT3 、 FAT 、 VFAT 、 ISO9660 、 NFS 、 SMB 等。
      • LINUX 应用系统 : 标准的 Linux 系统都有一整套称为应用程序的程序集,包括文本编辑器、编程语言、 X Window 、办公套件、 Internet 工具、数据库等。
    • 1.1.2 主要的 Linux 版本
      • 红旗 Linux
      • 冲浪 Linux
      • 中软 Linux
      • Red Hat Linux
      • Mandrake Linux
      • SuSe Linux
      • TurboLinux
    • 1.1.3 Red Hat Linux 的主要优势 1.2 Red Hat 9.0 的安装 1.2.1 Red Hat 9.0 的硬件需求 1.2.2 安装前的准备
    • 1.2.3 Red Hat 9.0 安装的步骤 ( 1 )语言选择:
    • ( 2 )键盘配置:
    • ( 3 )鼠标配置:
    • ( 4 )选择安装还是升级:
    • ( 5 ) 安装类型:
    • ( 6 )磁盘分区设置:
    • ( 7 )为系统分区:
    • ( 8 )添加分区:
    • ( 9 )引导装载程序配置:
    • ( 10 )网络配置:
    • ( 11 )防火墙配置:
    • ( 12 )语言支持的选择:
    • ( 13 )时区配置:
    • ( 14 )设置根口令
    • ( 15 )选择软件包组:
    • ( 16 )准备安装: 应该看到一个安装 Red Hat Linux 做准备的屏幕。 当你重新引导系统后,一份完整的安装日志可在 /root/install.log 中找到,以备今后参考。要取消安装进程,按计算机的重新启动按钮,或者使用 [Control]-[Alt]-[Delete] 组合键来重启计算机。
    • ( 17 )安装软件包:
    • ( 18 )创建引导盘:
    • ( 19 )视频卡配置:
    • ( 20 )配置显示器:
    • ( 21 )定制配置:
    • ( 22 )安装完成 祝贺你!你的 Red Hat Linux 9 安装现已完成! 安装程序会提示你做好重新引导系统的准备。 如果安装介质(磁盘驱动器内的磁盘或光盘驱动器内的光盘)在重新引导时没有被自动弹出,请记住取出它们。
    • 1.2.4 Red Hat Linux9.0 的登录和关闭 1. 登录: 使用 Red Hat Linux 系统的一个前提条件是登录。登录实际上是向系统做自我介绍,又称验证( authentication )。如果键入了错误的用户名或口令,就不会被允许进入系统。 Linux 系统有普通用户和超级用户之分。普通用户的用户名是任意的,而超级用户的用户名是 root 。 Linux 系统是严格区分大小写的,无论是用户名、文件名、设备名都是如此。即 liubing 、 LiuBing 、 LIUBING 是三个不同的用户名或文件名。图 1-21 显示为 Red
    •  
    • 当口令输入完毕后,按回车键进入 Red Hat Linux9.0 图形化界面,如图 1-22 所示。
    • 2. 注销 如果想切换用户登录,可采用注销当前图形化桌面会话。操作的方法是: ( 1 )依次选择“主菜单->注销”命令。 ( 2 )打开如图 1-13 所示的确认对话框,选择“注销”选项,然后点击“确定”按钮。如果你想保存桌面的配置以及还在运行的程序,选中“保存当前设置”复选框。
    • 图 1-23 “ 注销”对话框 图 1-23 “ 注销”对话框
    • 3. 关机和重新启动 关切和重新启动的方法如下: ( 1 )依次选择“主菜单->注销”命令。 ( 2 )在打开的对话框,选择“关机”或“重新启动”选项,然后点击“确定”按钮,即可完成关机或重新启动操作。
    • 1.3 Linux 的基本使用和设置
      • 1.3.1 显示属性的设置
      • 改变桌面背景
      • ( 1 )在 Linux 桌面上单击鼠标右键,在弹出的快捷菜单中选择“改变桌面背景”命令,打开如图 1-24 所示的页面。
      • ( 2 )在图 1-24 中,单击“选择图片”下的按钮,打开如图 1­-25 所示的选择图片对话框。
    • 图 1-25 选择图片
    • ( 3 )在图 1-25 中,通过选择不同的文件夹下的不同图片,来选择一个满意的背景图片,然后单击“确认”按钮,返回到图 1-24 的对话框。 ( 4 )还可进一步对背景图片进行居中、缩放、拉伸等处理。 ( 5 )当选择无图片时,可通过“背景网格”,以及左测和右测的颜色来设置背景。 ( 6 )设置完成后,单击“关闭”按钮,桌面显示如图 1-26 所示。
    • 2. 显示设置 在此设置中可对显示分辨率、显示器的类型及显卡进行设置,具体的方法如下: ( 1 )依次选择“主菜单->系统设置->显示”,打开如图 1-27 所示的显示设置对话框。在此对话框中,用户可选择设置“分辨率”、“色彩深度”。
    • ( 2 )单击“高级”选项卡,打开如图 1-28 所示的显示高级设置,还可对显示器的类型、物理分辨率、以及视频卡进行设置。 ( 3 )设置完成后,单击“确定”按钮。
    • 1.3.2 配置日期和时间 ( 1 )依次选择“主菜单->系统设置->日期 & 时间”,或在 shell (如 XTerm 或 GNOME 终端)提示下键入 redhat-config-date 命令。 ( 2 )在打开的图 1-29 中,可通过给出的界面来修改年、月、日、时、分、钞。改变方法如下:     要改变日期,使用箭头左右移动月份来改变月份;使用箭头左右移动年份来改变年份,然后单击星期中的日期来改变星期中的日期。           要改变时间,使用上下箭头按钮,它们在“时间”部分中的“小时”、“分钟”、和“秒钟”旁边。 ( 3 )单击图 1-29 中的“时区”选项卡,打开图 1-30 ,可对安装过程中的时区进行重新设置。
    • 图 1-30 时区设置 ( 4 )在单击“确定”按钮之前,前面的所有设置都不会生效。当确认设置完毕后,单击“确定”按钮。
    • 1.3.3 软盘和光盘的使用 在这里主要讨论如何在软盘中读取和写入文件,如何格式化软盘,以及如何从光盘中读取和复制数据。 1. 软盘的使用 ( 1 )挂载和卸载软盘 在使用软盘之前,它一定要先被挂载。要挂载软盘,把它插入软盘驱动器,然后在 终端提示下键入“ mount /mnt/floppy/ ” 。当该软盘的文件系统被挂载到 “ /mnt/floppy ” 目录中时,软盘驱动器的活动灯应该闪动。可以通过使用“ cd /mnt/floppy/ ” 命令转换到那个目录里来存取软盘上的内容。
    • 当完成了软盘上的任务后,在把它从驱动器中取出之前,应该先卸载它。关闭所有可能还在使用软盘上文件的程序或展示软盘内容的程序,然后在 终端提示下键入以下命令: # umount /mnt/floppy/
    • ( 2 )在 MS-DOS 软盘上存放 Linux 文件 使用以下命令来复制文件(把 filename 替换为要复制的文件): # cp filename /mnt/floppy 然后,便可以卸载软盘并把它从驱动器中取出。软盘中的新文件现在就可以从 Windows 机器上被存取了 ( 3 )格式化软盘 如果只在 Red Hat Linux 中使用软盘,仅需使用 ext2 文件系统来格式化 它。 一旦已在软盘上创建了 ext2 文件系统,就可以使用与在硬盘上操作文件和目录相同的方法来操纵该软盘的内容。
    • 2. 光盘的使用 ( 1 )在文件管理器中使用光盘 ( 2 )在终端提示下使用光盘 用户还可以手工地在 shell 提示下挂载和卸载光盘。在光盘驱动器内插入一张光盘,打开 终端,然后键入以下命令: # mount /mnt/cdrom 这样,光盘就会被挂载,便可以用文件管理器来使用它了。还可以通过点击桌面上的主目录图标,并在位置栏内键入“ /mnt/cdrom ” 来访问光盘。 光盘上工作完毕后,在把它从驱动器内弹出之前必须卸载它。关闭所有使用光盘的应用程序或文件管理器,然后在终端提示下键入以下命令: # umount /mnt/cdrom 现在,便可以安全地按光盘驱动器上的弹出按钮来取出光盘。
    • 1.3.4 打印机的安装与设置 Red Hat Linux 包括了一个用来配置本地和远程打印机的图形化工具。使用它,不必再安装额外的驱动程序和应用程序,此工具使用渐进的步骤来帮助用户配置打印机。有两种方式打开打印机的图形化配置工具,方法如下:           依次选择“主菜单->系统设置-> Printing ”           双击桌面上的“从这里开始”图标,选择“系统设置”,然后在打开的对话框中选择“ Printing ”
    • 1. 添加本地打印机 ( 1 )要添加并行端口或 USB 端口的本地打印机,单击打印机配置工具主窗口上的“新建”按钮。
    • ( 2 )在如图 1-36 所示的窗口中,在“名称”后的文本框中输入一个独特名称。
    • ( 3 )名称输入完毕后,单击“前进”按钮,打开如图 1-37 所示的窗口。
    • ( 4 )选择了打印机的队列类型后,下一步就是选择打印机型号。点击“前进”按钮,打开如图 1-38 所示的打印机型号对话框。。
    • ( 5 )选择后,单击“前进”按钮,进入到打印机配置的最后一步,即确认打印机配置。如果设置正确,则单击“应用”按钮来添加打印队列,否则,点击“后退”按钮来修改打印机配置。 2. 打印测试页 要打印测试页,从打印机列表中选择想试验的打印机,然后从图 1-39 中的“测试”拉下菜单中选择合适的测试页。
    • 3. 修改现存打印机 要打印测试页,从打印机列表中选择想试验的打印机,然后从图 1-39 中的“测试”拉下菜单中选择合适的测试页 。
    • 4. 管理打印机 在 GNOME 桌面环境下,有几种打开打印机管理器的方法: 单击面板上的「打印机管理器」图标来启动 GNOME 打印管理器。 依次选择“主菜单->系统工具->打印管理器”。 打开如图 1-41 所示的打印机管理器对话窗口。在该对话框中,双击一个已配置的打印机来查看打印假脱机,如图 1-42 所示 1-41 1-42
    • 1.4 使用 RPM 来管理软件包 RPM 软件包管理器( RPM )是开放打包系统,任何人都可以使用。它在 Red Hat Linux ,以及其它 Linux 和 UNIX 系统上运行。对于终端用户来说, RPM 简化了系统更新。安装、删除安装、升级 RPM 软件包可以使用简短的命令就可完成。 RPM 维护一个已安装软件包和它们的文件数据库,因此,可以在系统上使用功能强大的查询和校验。 对于开发者来说, RPM 允许把软件编码和程序打包,然后提供给终端用户。
    • 1.4.1 RPM 的设计目标
      • 可升级性
      • 使用 RPM ,可以不必全盘重装就可以在系统上升级个别组件。当得到一个基于 RPM 的操作系统的新发行版本(如 Red Hat Linux ),不必重新安装系统。
      • 强大的查询功能
      • RPM 被设计来提供强大的查询功能。可以在整个数据库中搜索软件包或某些特定文件。还可以轻易地了解到哪个文件属于哪个软件包,软件包来自哪里。
    • 3. 系统校验 RPM 另一项强大的功能是软件包校验。 4. 纯净源码 一个重要的设计目标是允许使用与软件的原创者所发行源码一致的“纯净”软件源码。使用 RPM ,会有纯净源码、使用过的补丁、以及完整的建构指令 。
    • 1.4.2 RPM 有基本操作模式 RPM 有五种基本操作模式(不包括软件包建构):安装、删除安装、升级、查询和校验,本节包括对每一模式的总览。想了解完整的选项和细节,请使用 rpm --help 命令。 RMP 包的名称格式 RPM 包的名称有其特有的格式,如典型的 RPM 软 名称类似于: liubing-1.0-1.i386.rpm 该文件名包括软件包名称“ liubing ” ;软件的版本“ 1.0 ” 其中包括主版本号和次版本号;“ i386 ” 是软件所运行 硬件平台;最后“ rpm ” 做为文件的扩展名,当然代表文 件的类型为 RPM 包。
    • 2. 安装 RPM 包 命令格式: rpm –i RPM 包的全路径文件名 如果想安装 RPM 包并显示安装进度信息可使用如下命令格式: rpm –ivh RPM 包的全路径文件名 在此命令的参数选项中:           i :代表安装。           v :代表 verbose ,设置在安装过程中将显示详细的信息。           h :代表 hash ,设置在安装过程中将显示“ # ” 来表示安装的进度。 对于较大的 RPM 包,在安装时尤其需要使用“ -ivh ” 选项,这样可以看到安装过程的相应信息,更可以了解安装的进度。
    • 3. 删除 RPM 包 命令格式: rpm -e RPM 包名称 rpm –e 命令用于从当前系统中删除已安装的软件包,需要在信念中指定要删除的软件包的名称而不是安装命令中的软件包安装文件名。 ( 1 )首先在终端上将系统中自带的输入法删除。 # rpm –e miniChinput ( 2 )进入到下载 fcitx 的目录(假设是 /input 目录) # cd /input
      • ( 3 )然后使用 RPM 命令来安装 fcitx
      • # rpm –ivh fcitx-1.8.5-1.rpm
      • ( 4 )要让此输入法生效,还必须重新启动 Linux 系统。
      • 升级 RPM 包
      • 命令格式 :
      • rpm -U RPM 包的全路径文件名
      • 5. 查询 RPM 包
      • 命令格式:
      • rpm -q
      • 使用 rpm -q 命令来查询安装的软件包的数据库
      • rpm -q fcitx 命令会显示安装的软件包 fcitx 的
      • 名称、版本、和发行号码。
      •  
    • 1.-a : 查询所有已安装的软件包。  2. -f <file> : 会查询拥有 <file> 的软件包。当指定文件时,必须指定文件的完整路径(如 /usr/bin/ls )。 3. -p <packagefile> : 查询软件包 <packagefile> 。 以下选项用来选择要搜索的信息类型。它们叫做信息选择选项。        -i :显示软件包信息,包括名称、描述、发行版本、大 小、制造日期、生产商,以及其它杂项。 -l :显示软件包所含的文件列表。 -s :显示软件包中所有文件的状态。          -d :显示被标记为文档( man 页、 info 页、 README 等等)的文件列表。 -c :显示被标记为配置文件的文件列表。你在安装后改变这些文件来使软件包适用于你的系统(譬如, sendmail.cf 、 passwd 、 inittab 等等)。
    • 6. 校验已安装的软件包 命令格式: rpm -V 校验软件包比较从某软件包安装的文件和原始软件包中的同一文件的信息。 校验的最简单用法是 rpm -V fcitx ,它校验所有在 fcitx 软件包内的文件是否和最初安装时一样。
    • 要校验包含某一特定文件的软件包: # rpm -Vf /bin/vi 要校验所有安装了的软件包: # rpm -Va 要根据 RPM 软件包文件来校验安装了的软件包: # rpm -Vp fcitx-1.8.5-1.rpm 单用一个 . (点)意味着测试通过。下列字符代表某类测试失败:         5 — MD5 校验和        S — 文件大小 L — 符号链接 T — 文件修改时间      D — 设备 U — 用户 G — 组群 M — 模式(包括权限和文件类型) ? — 不可读文件
    • 第 2 章 Linux 的常用命令 本章学习目标 通过对本章的学习,读者应该掌握以下主要内容:           命令的使用方式           文件及目录操作命令           文件压缩命令           联机帮助命令           进程管理的命令
    • 2.1 使用命令 2.1.1 命令的使用方式 在 Linux 系统中打开终端的方式有以下两种: 种是在桌面上依次单击“主程序->系统工具->终端”可打开如图 2-1 的终端窗口;另一种是在 Linux 桌面上单击鼠标右键,从弹出的快捷菜单中选择“终端”命令,也可打开终端窗口。
    • 一般的 Linux 使用者均为普通用户,而系统管理员一般使用超级用户帐号完成一些系统管理的工作 要说明的是,不同的用户登录其终端的提示符略有不同,在图 2-1 中显示的是超级用户的提示符。如果是一般用户登录,其提示符如图 2-2 所示。 Linux 系统是以全双工的方式工作,即从键盘把字符输入系统,系统再将字符回送到终端并显示出来。通常,回送到终端的字符与输入字符相同,因此操作员看到的正是自己输入的字符。但也有个别的时候,系统不回送符号。
    • 键盘上大多数字符是普通打印字符,它们没有特殊含义。只有少数特殊字符指示计算机做专门的操作。其中最常见的特殊字符是回车键 RETURN ,它表示输入行结束;系统收到回车信息便认为输入的当前行结束,系统的响应是让屏幕光标回到下一行行首。 回车符只是控制符的一个例子。控制符是指控制终端工作方式的非显示字符。输入一般控制符必须先按下控制键,或称作 CTRL 键,然后再按所对应的字符键。例如,输入回车符可以直接按回车键,也可以先按控制键,再按 m 键。 CONTROL-m 或 CTL-m 也是回车符。一些常用的控制符有: CTL-d ,它表示终端的输入结束; CTL-g 控制终端响铃; CTL-h 称为退格键,用于改正输入的错误 . 此外还有两个特殊键,一个是 DELETE 键,另一个是 BREAK 键。大多数 LINUX 系统中, DELETE 键表示立即终止程序。在有些系统里,也用 CTL-c 终止程序。一般说来, BREAK 键与 DELETE 键、 CTL-c 的功能基本相同。
    • 终端显示提示符后,用户就可以输入命令请示系统执行。这里所谓命令就是请示调用某个程序。例如当用户输入 date 命令时,系统就去调用 date 程序显示当前的日期和时间,终端屏幕上会出现类似下面的信息: [root@lbliubing root]# date 日 2 月 1 15:49:11 CST 2004 当命令输入完毕后,一定不要忘记按回车健,因为系统只有收到回车键才认为命令行结束。 又如 询问当前有哪些用户挂在系统里。命令及响应如下所示: [root@lbliubing root]# who root :0 Feb 1 15:41 root pts/0 Feb 1 15:46 (:0.0) jl pts/1 Feb 1 15:40 (:0.0)
    • 还有另外的方法 可以查看目前登录用户的注册信息。命令及响应如下所示: [root@lbliubing root]# who am i root pts/0 Feb 1 15:46 (:0.0) 这时系统仅回送用户自己的注册信息。假如用户打错了命令,系统将回答这一命令没有找到。 [root@lbliubing root]# whom whom: unable to open /root/Mail/draft: 没有那个文件或目录 上面几条命令在终端中的输入方法及响应如图 2-3 所示。
    • 另外,在终端上还有一个命令补齐 (Command-Line Completion) 的操作技巧,所谓命令补齐是指当键入的字符足以确定目录中一个唯一的文件时,只须按 Tab 键就可以自动补齐该文件名的剩下部分,例如要把目录 /freesoft 下的文件 gcc-2.8.1.tar.gz 解包,当键入到 tar xvfz /freesoft/g 时,如果此文件是该目录下唯一以 g 开头的文件,这时就可以按下 Tab 键,这时命令会被自动补齐为: tar xvfz /freesoft/gcc-2.8.1.tar.gz ,非常方便
    • 2.1.2 特殊字符 在 Linux 系统的终端中有几个最有用的 bash 变量,这些变量变量名及简单描述如下:        HISTFILE : 用于贮存历史命令的文件。           HISTSIZE : 历史命令列表的大小。           HOME : 当前用户的用户目录。           OLDPWD : 前一个工作目录。           PATH : bash 寻找可执行文件的搜索路径。           PS1 : 命令行的一级提示符。           PS2 : 命令行的二级提示符。           PWD : 当前工作目录。 SECONDS : 当前 shell 开始后所流逝的秒数。
    • 这意味着 bash 保留了一定数目的先前已经在 shell 里输入过的命令。这个数目取决于一个叫做 HISTSIZE 的变量。 使用历史记录列表最简单的方法是用上方向键。 另一个使用命令历史文件的方法是用 bash 的内部命令 history 和 fc(fix 命令 ) 命令来显示和编辑历史命令。 history 命令能以两种不同的方法来调用。第一种是: history [n] 当 history 命令没有参数时,整个历史命令列表的内容将被显示出来。使用 n 参数的作用是仅有最后 n 个历史命令会被列出 。 例如, history 5 显示最后 5 个命令。 调用 history 命令的第二种方法用于修改命令历史列表文件的内容。命令的语法如下: history [-r|w|a|n] [filename]
    • 这种形式中, -r 选项告诉 history 命令读命令历史列表文件的内容并且把它们当作当前的命令历史列表。 -w 选项将把当前的命令历史记录写入文件中并覆盖文件原来的内容。 -a 选项把当前的命令历史记录追加到文件中。 -n 选项将读取文件中的内容并加入到当前历史命令列表中。如果 filename 选项没有被指定, history 命令将用变量 HISTFILE 的值来代替 。 命令别名通常是其他命令的缩写,用来减少键盘输入。 还有一个使工作变得轻松的方法是使用命令别名 命令格式为 : alias [ alias-name= ’ original-command ’ ] 其中, alias-name 是用户给命令取的别名, original-command 是原来的命令和参数。需要注意的是,由于 Bash 是以空格或者回车来识别原来的命令的,所以如果不使用引号就可能导致 Bash 只截取第一个字,从而出现错误。
    • 注意:在定义别名时,等号两边不能有空格,否则 shell 将不能决定要做什么。仅在命令中包含空格或特殊字符时才需要引号。如果键入不带任何参数的 alias 命令,将显示所有已定义的别名。 Bash 有两级提示符。第一级提示符是经常见到的 Bash 在等待命令输入时的情况。第一级提示符的默认值是 $ 符号。如果用户不喜欢这个符号,或者愿意自己定义提示符,只需修改 PS1 变量的值。例如将其改为: PS1=” 输入一个命令: ” 第二级提示符是当 Bash 为执行某条命令需要用户输入更多信息时显示的。第二级提示符默认为“>”。如果需要自己定义该提示符,只需改变 PS2 变量的值。例如将其改为: PS2=” 更多信息: ”
    • 用户也可以使用一些事先已经定义好的特殊字符。这些特殊字符将使提示符中包含当前时间之类的信息。 表 2-1 列出了最常用的一些特殊字符及其含义。 表 2-1   bash 提示符常用特殊字符
    • 显示当前工作目录 w 显示当前工作目录基准名 W 显示当前用户的用户名 u 显示当前时间 显示正在运行的 Shell 的名称 s 打印一个换行符,这将导致提示符跨行 显示运行该 shell 的计算机主机名 h 显示当前日期 d 显示一个反斜杠 显示一个 $ 符号,如果当前用户是 root 则显示 # 符号 $ 显示 shell 激活后,当前命令的历史编号 # 显示该命令的历史编号 ! 说明 特殊字符
    • 下面来看几个实际例子: PS1=”d” 将使提示符变成显示日期,如下所示: 一  2 月  02 而 PS1=”d” ,将使提示符变成如下所示: d 若 PS1=&quot;[W@h w]&quot; 将使提示符变成如下所示 : [nic@lbliubing ~/liunuxbook/nic] 该例就是使用三个特殊字符的组合得到的。
    • 以上的各例在 Red Hat Linux9.0 系统的终端中所显示的结果如图 2-4 所示。
    • 2.1.3 通配符基础 通配符 又称多义符。在描述文件时,有时在文件名部分用到一些通配符,以加强命令的功能。在 Linux 系统中有以下基本的通配符:            ?:表示该位置可以是一个任意的单个字符。           *:表示该位置可以是若干个任意字符。           方括号 [charset] :可替代 charset 集中的任何单个字符 下面对方括号通配符进行一些说明。例如 [cChH] :表示在文件的该位置中可出现任意单个的 c 或 h 字符的大小写形式 。 另个,通配符集还能描述介于字符对之间的所有字符。如“ [a-z] ” 就可以代 替任意小写字母,而 [a-zA-Z] 则可替代任意字母。注意可替代的字符包括 a 到 z 和 A 到 Z 字符对之间的所有字符。
    • 那么,是否能在一条指令中用多个通配符呢?答案是肯定的。如 rm a*out*tmp? 该命令可以删除一系列临时性的输出文件,如 ab.out.temp1 、 ab.out.temp1 等。 UNIX 或 Linux 系统可将一定相关的文件看作一个集合的一部分,用户可以用该集合去匹配。 所以,如果需要显示 nic-1.png , nic-2.png , nic-3.png , nic-4.png , nic-5.png ,只须要在终端的命令提示符后输入: ls nic-[1-5].png
    • 这样利用通配符可以使指令的输入变得更加灵活。该技巧的可很容易实现显示一些文件名相关的文件。以上的各例在 Red Hat Linux9.0 系统的终端中所显示的结果如图 2-5 所示。
    • 2.2 文件概念及操作命令 2.2.1 文件显示命令 显示指定工作目录中所包含的内容的指令是 ls , 要 说明的是 ls 命令列出文件的名字,而不是文件的内容。该命令的使用方式如下 : ls [ 选项 ] [ 文件目录列表 ] ls 命令中的常用选项如下:        -a :显示所有文件及目录 (ls 规定将文件名或目录名中开头为 &quot;.&quot; 的视为隐藏档,不会列出 )           -c :按列输出,纵向排序           -x :按列输出,横向排序           -l :除文件名外,也将文件状态、权限、拥有者、文件大小 等信息详细列出           -t :根据文件建立时间的先后次序列出           -A :同 -a ,但不列出 &quot;.&quot; ( 目前目录 ) 及 &quot;..&quot; ( 父目录 )           -X :按扩展名排序显示           -R :递归显示下层子目录           --help :显示帮助信息           --version :显示版本信息
    • Linux 支持多种文件类型,每一类用一个字符来表示,其说明如下:             - :常规文件           d :目录           b :块特殊设备           c :字符特殊设备           p :有名管道           s :信号灯           m :共享存储器 文件类型的字符表示文件的权限,权限由三个字符串组成,这三个字符串分别表示:该文件所有者的权限、组中其他人的权限和系统中其人的权限;每个字符串又由三个字符组成,依次表示对文件的读(用字符 r 表示)、写(用字符 W 表示)和执行权限(用字符 x 表示)。当用户没有相应的权限时,该权限的对应位置用短线“ - ” 来表示。
    • 例如: drwxr-x- -- 表示的含义是: d 表示这条信息是目录;目录拥有者的权限是 rwx (表示有读、写和执行权限);组中其他人对该目录的权限是 r-x (表示有读和执行权限,没有写权限),系统中其他人对该目录的权限是 --- (表示读、写和执行权限都没有)。 下面是使用命令来显示帮助和版本信息,命令如下: #ls --version #l ls --help |more
    • 2.2.2 查找、排序及显示指定文件内容的命令 1. 查找文件 在 Linux 系统中查找文件的命令通常为 find 命令。 find 命令可在使用、管理 Linux 系统中方便地查找所需要的指定文件。 find 命令的语法格式如下: #find [ 目录列表 ] [ 匹配标准 ] 在命令格式中有两个参数,说明如下:           目录列表:希望查询文件或文件集的目录列表,目录间用空格分隔。           匹配标准:希望查询的文件的匹配标准或说明。详细的匹配标准如表 2-2 所示。
    • 显示整个文件路径和名称。一般来说,都要用 -print ,如果没有这个参数,则 find 命令进行所要求的搜索是没有显示结果的。 -print 匹配所有大小为 n 块的文件( 512 字节块,若 k 在 n 后,则为 1K 字节块) 。 -size n 匹配所有修改时间比 file 文件更新的文件。 -newer 文件 匹配所有在前 n 天内修改过的文件。 -mtime n 匹配所有在前 n 天内访问过的文件。 -atime n 匹配所有用户序列号是前面所指定的用户序列号的文件,可以是数字型的值或用户登录名 。 -user 用户号 匹配所有连接数为 n 的文件。 -links n 匹配所有类型为 x 的文件。 x 是 c (字符特殊), b (块特殊), d (目录), p (有名管道), l (符号连接), s (套接文件)或 f (一般文件)。 -type x 匹配所有模式为指定数字型模式值的文件。不仅仅是读,写和执行,所有模式都必须匹配。如果在模式前是负号( - ),表示采用除这个模式外的所有模式。 -perm 模式 告诉 find 要找什么文件;要找的文件包括在引号中,可以使用通配符( * 和?) -name 文件 说          明 表达式
    • 1 )通过文件名查找 知道了某个文件的文件名,却不知道它存于哪个目录下,此时可通过查找命令找到该文件,命令 如下: # find / -name httpd.conf –print 2 )根据部分文件名查找 当要查找某个文件时,不知道该文件的全名,只知道这个文件包含几个特定的字母,此时用查找命令也是可找到相应文件的。这时在给字查找文件名时通配符“ * ” 、“ ? ” 。例如,还是查找文件“ httpd.conf ” ,但仅记得该文件名包含“ http ” 字符串,可使用如下命令查找 : #find / –name *http* -print
    • 3 )根据文件的特征查询 如果仅知道某个文件的大小、修改日期等特征也可使用 find 命令把该文件查找出来。例如,知道一个文件尺寸小于为 2500bytes ,可使用如下命令查找: #find /etc –size -2500c –print 下面是以时间特征为查找条件的 find 命令函数的参数:          amin n 查找 n 分钟以前被访问过的所有文件 .           atime n 查找 n 天以前被访问过的所有文件 .           cmin n 查找 n 分钟以前文件状态被修改过的所有文件 .           ctime n 查找 n 天以前文件状态被修改过的所有文件 .           mmin n 查找 n 分钟以前文件内容被修改过的所有文件 .           mtime n 查找 n 天以前文件内容被修改过的所有文件 .
    • 2. 显示文本文件内容 显示文本文件内容的命令是 cat 命令,用来将文件的内容显示到终端上,其命令语法如下: cat [ 选项 ] 文件列表 命令中的参数说明如下:            常用选项如表 2-3 所示        文件列表:这是要连接文件的选项列表。如果没有指定文件或连字号( - ),就从标准输入读取。 表 2-3 cat 命令常用选项 将相连的多个空行用单一空行代替 。 -s 计算所有输出行,开始为 1 。 -n 在每行末尾显示 $ 符号 。 -e 计算所有非空输出行,开始为 1 。 -b 说       明 选 项
    • 3. 查找文件内容
      • 查找文件内容的命令是 grep 命令。其使用的语法如下:
      • grep [ 选项 ] 匹配字符串 文件列表
      • 命令中的参数说明如下:
      •         选项如表 2-4 所示
      •           文件列表:
      •   匹配字符串:希望在文件中查到的串。
      • 表 2-4 grep 命令的常用选项
      • 选项 说明
      • -v 列出不匹配串或正则表达式的行。
      • -c 对匹配的行计数。
      • -l 只显示包含匹配的文件的文件名。
      • -h 抑制包含匹配文件的文件名的显示
      • -n 每个匹配行只按照相对的行号显示。
      • -i 产生不区分大小写的匹配,缺省状态是区分大小写。
    • 4. 排序命令 sort 命令的功能是对文件中的各行进行排序 . sort 命令可以被认为是一个非常强大的数据管理工具,用来管理内容类似数据库记录的文件。 Sort 命令将逐行对文件中的内容进行排序,如果两行的首字符相同,该命令将继续比较这两行的下一字符,如果还相同,将继续进行比较。该命令的语法格式如下: sort [ 选项 ] 文件 说明: sort 命令对指定文件中所有的行进行排序,并将结果显示在标准输出上。如不指定输入文件或使用“ - ” ,则表示排序内容来自标准输入。  
      • 2.2.3 比较文件内容的命令
      • comm 命令
      • 如果想对两个有序的文件进行比较,可以使用 comm 命 令。该命令的使用语法如下:
      • comm [- 123 ] file1 file2
      • 说明:该命令是对两个已经排好序的文件进行比较。其中 file1 和 file2 是已排序的文件。 comm 读取这两个文件,然后生成三列输出:仅在 file1 中出现的行;仅在 file2 中出现的行;在两个文件中都存在的行。如果文件名用“ - ” ,则表示从标准输入读取。
      • diff 命令
      • diff 命令用于比较两个文件内容的不同,其命令 语法格式如下:
      • diff [ 参数 ]  原文件 目标文件
      • 其中“源文件”和“目标文件”是用户要比较的两个文件。
      • 表 2-4 diff 命令的常用参数
      • 参数 说明
      • a 将所有文件当做文本文件来处理
      • b 忽略空格造成的不同
      • B 忽略空行造成的不同
      • q 只报告什么地方不同,不报告具体的不同信息
      • H 利用试探法加速对大文件的搜索
      • i 忽略大小写的变化
      • l 用 pr 对输出进行分页
      • r 在比较目录时比较所有的子目录
      • s 两个文件相同时才报告
      • v 在标准输出上输出版本信息并退出
    • 2.2.4 复制、删除和移动文件的命令 1. 文件复制命令 Linux 下的 cp 命令用于复制文件或目录,该命令是最重要的文件操作命令,其命令格式如下: cp   [ 选项 ]   源文件 目标文件 cp   [ 选项 ]   源文件组  目标目录 参数说明如下:            源文件:要拷贝的文件。           目标文件:目标名。也可以是目录名,这种情况下,源文件名作为目标文件名,而文件放在该目录下。           源文件组:要拷贝文件的由空格分隔的列表。           目标目录:目标目录。 常用命令的选项列表如表 2-5 所示。
    • 表 2­-5 cp 命令常用选项 常用选项 说      明 -a 在备份中保持尽可能多的源文件结构和属。 -b 作将要覆盖或删除文件的备份。 -f 删除已存在的目标文件。 -i 提示是否覆盖已存在的目标文件。 -p 保持原先文件的所有者,组权限和时间标志 -r 递归拷贝目录,把所有非目录文件当普通文件拷贝。 -R 递归拷贝目录。
    • 2. 文件的删除命令 rm 命令可从文件系统中删除文件及整个目录。 rm 命令所使用的命令格式如下: rm [ 选项 ] 文件列表 参数说明如下:           常用命令的选项列表如表 2-6 所示。           文件列表:希望删除的用空格分隔的文件列表,可以包括目 录名。 表 2­-6 rm 命令常用选项 常用选项 说      明 -r 删除文件列表中指定的目录,若不用此标志则不删除目录 -I 指定交互模式。在执行删除前提示确认。任何以 Y 开始的 响应都表示肯定;其他则表示否定。 -f 指定强行删除模式。通常,在删除文件权限可满足时 rm 提 示。本标志强迫删除,不用提示。 -V 在删除前回显文件名。 -- 指明所有选项结束。用于删除一个文件名与某一选项相同 的文件。例如:假定偶然建立了名为 -f 的文件,又打算删 除它,命令 rm -f 不起任何作用,因为 -f 被解释成标志而不 是文件名;而命令 rm -- -f 能成功地删除文件。
    • 3. 移动文件 在 Linux 系统中,移动文件可使用 mv 命令。 Mv 命令还可改文件改名,即把源文件以一个新文件名移动到另一个新的目录中去。该命令所使用语法形式有: mv [-f] [-i] 文件 1 文件 2 mv [-f] [-i] 目录 1 目录 2 mv [-f] [-i] 文件列表 目录 命令中的参数说明如下:
    •            -f :通常情况下,目标文件存在但用户没有写权限时, mv 会给出 提示。本选项会使 mv 命令执行移动而不给出提示。           -i :交互模式,当移动的目录已存在同名的目标文件名时,用覆 盖方式写文件,但在写入之前给出提示。         文件 : 源文件名。      文件 2 :目标文件名(新文件名)。       目录 1 :源目录名。 目录 2 :目标目录名(新目录名)。      文件列表 : 用空格分隔的文件名列表。本选项用于文件保持它们 的 名字被移动到一个新目录。         目录:目标目录。
    • 2. 5 文件内容统计命令 wc 命令的功能为统计指定文件中的字节数、字数、行数 , 并将统计结果显示输出。 wc 命令使用的语法格式如下: wc [ 选项 ] 文件列表 说明:该命令统计给定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。 wc 同时也给出所有指定文件的总统计数。字是由空格字符区分开的最大字符串。 该命令各选项含义如下: -c :统计字节数。         -l :统计行数。 -w :统计字数。
      • 2.2.6 命令的输入和输出
      • 在 Linux 系统中,执行一个 shell 命令行时通常会自动打开三个标准文件,即标准输入文件( stdin ),通常对应终端的键盘;标准输出文件( stdout )和标准错误输出文件( stderr ),这两个文件也都对应终端的屏幕。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。
      • Linux 系统为输入、输出的传送引入了另外两种机制,即输入 / 输出重定向和管道。
      • 输入重定向
      • 输入重定向是指把命令(或可执行程序)的标准输入重定向到指定的文件中。输入重定向主要用于改变一个命令的输入源,特别是改变那些需要大量输入的输入源。
      • 另一种输入重定向称为 here 文档,它告诉 shell 当前命令的标准输入来自命令行。 here 文档的重定向操作符使用“ << ” 。它将一对分隔符(! … !)之间的正文重定向输入给命令。
      • 由于大多数命令都以参数的形式在命令行上指定输入文件的文件名,所以输入重定向并不经常使用。尽管如此,当要使用一个不接受文件名作为输入参数的命令,而需要的输入内容又存在一个文件里时,就能用输入重定向解决问题。
      • 输出重定向
      • 输出重定向是指把命令(或可执行程序)的标准输出或标准错误输出重新定向到指定文件中。这样,该命令的输出就不显示在屏幕上,而是写入到指定文件中。
    • 输出重定向比输入重定向更常用,很多情况下都可以使用这种功能。例如,如果某个命令的输出很多,在屏幕上不能完全显示,那么将输出重定向到一个文件中,然后再用文本编辑器打开这个文件,就可以查看输出信息;如果想保存一个命令的输出,也可以使用这种方法。还有,输出重定向可以用于把一个命令的输出当作另一个命令的输入(还有一种更简单的方法,就是使用管道)。 输出重定向的一般形式为: 命令 > 文件名 为避免输出重定向中指定文件只能存放当前命令的输出重定向的内容, shell 提供了输出重定向的一种追加手段。输出追加重定向与输出重定向的功能非常相似,区别仅在于输出追加重定向的功能是把命令(或可执行程序)的输出结果追加到指定文件的最后,而该文件原有内容不被破坏。 可以使用追加重定向操作符“ >> ” ,其使用语法形式为: 命令 >> 文件名
      • 管 道
      • 将一个程序或命令的输出作为另一个程序或命令的输入,有两种方法,一种是通过一个临时文件将两个命令或程序结合在一起 ; 另一种是 Linux 所提供的管道功能。这种方法比前一种方法更好。
      • 管道可以把一系列命令连接起来,这意味着第一个命令的输出会作为第二个命令的输入通过管道传给第二个命令,第二个命令的输出又会作为第三个命令的输入,以此类推。显示在屏幕上的是管道行中最后一个命令的输出(如果命令行中未使用输出重定向)。
      • 命令替换
      • 命令替换和重定向有些相似,但区别在于命令替换是将一个命令的输出作为另外一个命令的参数。常用命令格式为:
        • command1 `command2`
      • 其中, command2 的输出将作为 command1 的参数。需要注意的是这里的 ` 符号,被它括起来的内容将作为命令执行,执行后的结果作为 command1 的参数。
      • 例如:
      • $ cd `pwd`
      • 该命令将 pwd 命令列出的目录作为 cd 命令的参数,结果仍然是停留在当前目录下。
    • 2.3 目录及其操作命令
      • 树型目录结构
      • Linux 系统以文件目录的方式来组织和管理系统中的所有文件。所谓文件目录就是将所有文件的说明信息采用树型结构组织起来,即常说的目录。也就是说,整个文件系统有一个“根”( root ),然后在根上分“杈”( directory ),任何一个分杈上都可以再分杈,杈上也可以长出“叶子”。“根”和“杈”在 Linux 中被称为是“目录”或“文件夹”。而“叶子”则是一个个的文件。实践证明,此种结构的文件系统效率比较高。
    • 如前所述,目录也是一种类型的文件。 Linux 系统通过目录将系统中所有的文件分级、分层组织在一起,形成了 Linux 文件系统的树型层次结构。以根目录为起点,所有其他的目录都由根目录派生而来用户可以浏览整个系统,可以进入任何一个已授权进入的目录,访问那里的文件。 Linux 目录提供了管理文件的一个方便途径。每个目录里面都包含文件。用户可以为特定的文件创建特定的目录,也可以把一个目录下的文件移动或复制到另一目录下,而且能移动整个目录,并且和系统中的其他用户共享目录和文件。 需要说明的是,根目录 ( 系统目录 ) 是 Linux 系统中的特殊目录。 Linux 是一个多用户系统,操作系统本身的驻留程序存放在以根目录开始的专用目录中。
    • 2. 工作目录、用户主目录与路径 ( 1 ) 工作目录与用户主目录 从逻辑上讲,用户在登录到 Linux 系统中之后,每时每刻都“处在”某个目录之中,此目录被称作工作目录或当前目录( Working Directory )。工作目录是可以随时改变的。用户初始登录到系统中时,其主目录( Home Directory )就成为其工作目录。工作目录用“ . ” 表示,其父目录用“ .. ” 表示。 用户主目录是系统管理员增加用户时建立起来的(以后也可以改变),每个用户都有自己的主目录,不同用户的主目录一般互不相同。 用户刚登录到系统中时,其工作目录便是该用户主目录,通常与用户的登录名相同。
    • ( 2 )路径 路径是指从树型目录中的某个目录层次到某个文件的一条道路。此路径的主要构成是目录名称,中间用“ / ” 分开。某个文件在文件系统中的位置都是由相应的路径决定的。 路径又分相对路径和绝对路径。 绝对路径是指从“根”开始的路径,也称为完全路径;相对路径是从用户工作目录开始的路径。 应该注意到,在树型目录结构中到某一确定文件的绝对路径和相对路径均只有一条。绝对路径是确定不变的,而相对路径则随着用户工作目录的变化而不断变化。这一点对于以后使用某些命令如 cp 和 tar 等大有 好处。
      • Linux 系统主要目录说明
      • /bin :显而易见, bin 就是二进制( binary )英文缩写。
      • /boot :在这个目录下存放的都是系统启动时要用到的程序。在使用 lilo 引导 linux 的时候,会用到这里的一些信息。
      • /dev : dev 是设备( device )的英文缩写。这个目录对所有的用户都十分重要。因为在这个目录中包含了所有 linux 系统中使用的外部设备。但是这里并不是放的外部设备的驱动程序。
      • /etc : etc 这个目录是 linux 系统中最重要的目录之一。在这个目录下存放了系统管理时要用到的各种配置文件和子目录。我们要用到的网络配置文件,文件系统, x 系统配置文件,设备配置信息,设置用户信息等都在这个目录下。
    • /sbin : 这个目录是用来存放系统管理员的系统管理程序。 /home : 如果建立一个用户,用户名是“ jl ” , 那么在 /home 目录下就有一个对应的 /home/jl 路径,用来存放用户的主目录。 /lib : lib 是库( library )英文缩写。这个目录是用来存放系统动态连接共享库的。几乎所有的应用程序都会用到这个目录下的共享库。 /mnt : 这个目录在一般情况下也是空的。可以临时将别的文件系统挂在这个目录下 。 /proc : 可以在这个目录下获取系统信息。这些信息是在内存中,由系统自己产生的。 /root : 如果用户是以超级用户的身份登录的,这个就是超级用户的主目录。 /tmp : 用来存放不同程序执行时产生的临时文件。 /usr : 这是 linux 系统中占用硬盘空间最大的目录。
      • 2.3.2 创建和删除目录的命令
      • 创建目录
      • 在 Linux 系统中建立新目录的命令是 mkdir 。该命令的语法格式如下:
      • mkdir [-m 模式 ] [-p 目录名 ] 目录
      • 命令中的参数说明如下:
      • m 模式:在建立目录时把按模式指定设置目录权限。该目录的权限分为:目录所有者的权限、组中其他人对目录的权限和系统中其他人对目录的权限。这三个权限分别用三个数字之和来表示:对目录的读权限是 4 、写权限是 2 、执行权限是 1 。
      •  -p 目录名:建立所有不存在父目录的目录。
      •    目录:要建立的目录 。
    • 2. 删除目录 rmdir 命令是用来删除目录的,一般情况下要删除的目录必须为空目录,如果所给的目录不为空,系统会报告错误。。该命令的语法格式如下: rmdir -p 目录列表 命令中的参数说明如下:  -p :在删除目录表指定的目录后,若父目录为 空,则 rmdir 也删除父目录。状态信息显示什么 被删除,什么没被删除。  目录列表:空格分隔的目录名列表。要删除的 目录必须为空。
      • 2.3.3 改变工作目录和显示目录内容的命令
      • 1. 显示当前目录
      • 显示当前目录的命令是 pwd 命令,该命令使用的语 法格式如下:
      • pwd
      • 执行 pwd 命令形式如下:
      • # pwd
      • 改变当前工作目录
      • 改变当前工作目录在 Linux 系统中使用的是 cd 命令。
      • 该命令使用的语法格式如下:
      • cd   [ 目录名 ]
      • 命令中的参数说明如下:
      •         目录名:改变到所指定的目录名。如果没有指定目录,就返回到用户主目录(在 HOME 环境变量中指定)。
    • 2.3.4 链接文件的命令 链接文件命令是 ln 命令。该命令在文件之间创建链接。这种操作实际上是给系统中已有的某个文件指定另外一个可用于访问它的名称。 该命令的使用语法如下: ln [ 选项 ] 目标 [ 链接名 ] ln [ 选项 ] 目标 目录 链接有两种,一种被称为硬链接( Hard Link ),另一种被称为符号链接( Symbolic Link )。建立硬链接时,链接文件和被链接文件必须位于同一个文件系统中,并且不能建立指向目录的硬链接。而对符号链接,则不存在这个问题。默认情况下, ln 产生硬链接 。
    • 在硬链接的情况下,参数中的“目标”被链接至 [ 链接名 ] 。如果 [ 链接名 ] 是一个目录名,系统将在该目录之下建立一个或多个与“目标”同名的链接文件,链接文件和被链接文件的内容完全相同。如果 [ 链接名 ] 为一个文件,用户将被告知该文件已存在且不进行链接。如果指定了多个“目标”参数,那么最后一个参数必须为目录。 如果给 ln 命令加上 -s 选项,则建立符号链接。如果 [ 链接名 ] 已经存在但不是目录,将不做链接。 [ 链接名 ] 可以是任何一个文件名(可包含路径),也可以是一个目录,并且允许它与“目标”不在同一个文件系统中。如果 [ 链接名 ] 是一个已经存在的目录,系统将在该目录下建立一个或多个与“目标”同名的文件,此新建的文件实际上是指向原“目标”的符号链接文件。 例: $ ln - s lunch /home/xu 用户为当前目录下的文件 lunch 创建了一个符号 链接 /home/xu 。
    • 2.3.5 改变文件或目录存取权限的命令 1. 改变文件或目录权限 在 Linux 系统中,用户设定文件权限控制其他用户不能访问、修改。但在系统应用中,有时需要让其他用户使用某个原来其不能访问的文件或目录,这是就需要重新设置文件的权限,使用的命令是 chmod 命令。并不是谁都可改变文件和目录的访问权限,只有文件和目录的所有者才有权限修改其权限,另外超级用户可对所有文件或目录进行权限设置。 chmod 命令的使用语法格式如下: chmod   [ 选项 ]  文件和目录列表 命令中的参数说明如下:           选项的常用取值如表 2-7 所示           文件和目录列表:准备修改权限的文件和目录 。
    • 表 2-7 chmod 命令的常用选项 递归改变目录及其内容的权限。 -R 详细说明权限的变化。 -v 不打印权限不能改变的文件的错误信息。 -f 只有在文件的权限确实改变时才进行详细说明 。 -c 说      明 常用选项
    • chmod 命令支持两种文件权限设定的方法: ( 1 )使用字符串设置权限 ( 2 )使用八进制数设置权限 另外,文件和目录的权限还可用八进制数字模式来 表示。三个八进制数字分别代表 ugo 的权限。执行 权、读权和写权所对应的数值分别是 1 , 2 和 4 。 若要 rwx 属性则 4+2+1=7 ; 若要 rw- 属性则 4+2=6 ; 若要 r-x 属性则 4+1=5 。 2. 改变文件和目录的所有权 命令的格式如下: chown   [ 选项 ]  用户 文件和目录列表
    • 命令中的参数说明如下:         命令中的选择说明如表 2-8 所示。         用户:可能是用户号或文件 /etc/passwd 中出现的用户名。 文件和目录列表:用于重新指定所有权的用空格分隔的文件和目录列表。 表 2-8 chown 命令的常用选项 常用选项 说      明 -c 只有在文件的权限确实改变时才进行详细说明。 -f 不打印权限不能改变的文件的错误信息。 -v 详细说明权限的变化。 -R 递归改变目录及其内容的权限。
    • 2.4 文件压缩与联机帮助命令 2.4.1 文件压缩 1. gzip 压缩文件 gzip 命令是在 Linux 系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用。 gzip 命令的使用语法格式如下: gzip [ 选项 ] 压缩(解压缩)的文件名 gzip 命令各选项的说明如表 2-9 所示。 表 2-9 gzip 命令的常用选项 对每一个压缩和解压的文件,显示文件名和压缩比。 -v 测试,检查压缩文件是否完整。 -t 递归式地查找指定目录并压缩其中的所有文件或者是解压缩。 -r 对每个压缩文件,显示压缩文件的大小、未压缩文件的大小、压缩比、未压缩文件的名字等详细信息 -l 将压缩文件解压。 -d 将输出写到标准输出上,并保留原有文件。 -c 说明 常用选项
    • 2. 文件打包 tar tar 可以对文件和目录进行打包。利用 tar ,用户可以对某一特定文件进行打包(一般用作备份文件),也可以在包中改变文件,或者向包中加入新的文件。 t tar 命令的使用语法格式如下: tar [ 主选项 + 辅选项 ] 文件或者目录 表 2-10 tar 命令的主选项的常用选项 更新文件。就是说,用新增的文件取代原备份文件,如果在备份文件中找不到要更新的文件,则把它追加到备份文件的最后。 -u 列出档案文件的内容,查看已经备份了哪些文件。 -t 把要存档的文件追加到档案文件的未尾。例如用户已经作好备份文件,又发现还有一个目录或是一些文件忘记备份了,这时可以使用该选项,将忘记的目录或文件追加到备份文件中。 -r 从档案文件中释放文件。 -x 创建新的档案文件。如果用户想备份一个目录或是一些文件,就要选择这个选项。 -c 说 明 常用选项
      • 表 2-11 tar 命令的辅助选项的常用选项
      • 常用选项 说      明
      • f 使用档案文件或设备,这个选项通常是必选的。
      • K 保存已经存在的文件。例如我们把某个文件还原,在 还原的过程中,遇到相同的文件,不会进行覆盖。
      • m 在还原文件时,把所有文件的修改时间设定为现在。
      • M 创建多卷的档案文件,以便在几个磁盘中存放。
      • v 详细报告 tar 处理的文件信息。如无此选项, tar 不报 告文件信息。
      • z 用 gzip 来压缩 / 解压缩文件
      • unzip 命令
      • 可以用 unzip 命令,该命令用于解扩展名为“ .zip ” 的压缩文件。该命令使用的语法格式如下:
      • unzip [ 选项 ] 压缩文件名 .zip
      • upzip 命令各选项的说明如表 2-12 所示。
    • 表 2-12 upzip 命令的常用选项 常用选项 说      明 -x 文件列表 解压缩文件,但不包括指定的 file 文件 -v 查看压缩文件目录,但不解压。 -t 测试文件有无损坏,但不解压。 -d 目录把压缩文件解到指定目录下。 -z 只显示压缩文件的注解。 -n 不覆盖已经存在的文件。 -o 覆盖已存在的文件且不要求用户确认。 -j 不重建文档的目录结构,把所有文件解压到同 一目录下。
    • 2.4.2 联机帮助  1. 显示帮助手册 通常使用者只要在命令 man 后,输入想要获取的命令的名称(例如 ls ), man 就会列出一份完整的说明,其内容包括命令语法、各选项的意义以及相关命令等。该命令的一般形式为: man   [ 选项 ]  命令名称 表 2-13 man 命令的常用选项 常用选项 说      明 -S 根据章节显示,由于一个命令名称可能会有很多 类别,其类别说明如表 2-14 所示。 -f 只显示出命令的功能而不显示其中详细的说明文件 -w 不显示手册页,只显示将被格式化和显示的文件所在 位置。 -a 显示所有的手册页,而不是只显示第一个。 -E 在每行的末尾显示 $ 符号
    • 表 2-13 man 命令的章节常用选项 章节 说      明 1 一般使用者的命令 2 系统调用的命令 3 C 语言函数库的命令 4 有关驱动程序和系统设备的解释 5 配置文件的解释 6 游戏程序的命令 7 其它的软件或是程序的命令和有关系统维护 的命令
    • 2. 系统帮助文档 help 命令用于查看所有 Shell 命令。用户可以通过该命令寻求 Shell 命令的用法,只需在所查找的命令后输入 help 命令,就可以看到所查命令的内容了。 例如:查看 cd 命令的使用方法。 $ cd --help 3. whereis 命令 这个程序的主要功能是寻找一个命令所在的位置。例如,最常用的 ls 命令,它是在 /bin 这个目录下的。如果希望知道某个命令存在哪一个目录下,可以用 whereis 命令来查询。该命令的一般形式为: whereis [ 选项 ] 命令名。 说明:一般直接使用不加选项的 whereis 命令,但用户也可根据特殊需要选用它的一些选项。该命令中各选项的说明如表 2-14 所示。  
    • 表 2-13 whereis 命令的常用选项 章节 说      明 -b 只查找二进制文件 -m 查找主要文件 -s 查找来源 -u 查找不常用的记录文件 例如:查找 cd 命令二进行文件在什么目录下。可使用如下命令: $ whereis -b cd
    • 第 3 章 Linux 系统管理 本章学习目标 在 Linux 系统中,虽然有很多应用都使用图形界面,但是大多数使用和管理 Linux 的实用程序和技巧还是通过键入命令来运行的。在本章中,将介绍一些基本的 Linux 命令,并通过一些实际的例子使读者边学边用,让读者尽快熟悉 Linux 系统。。通过对本章的学习,读者应该掌握以下主要内容:  了解对系统管理的具体工作。  理解对用户和工作组管理的基本概念及相 关的管理方法。 理解文件系统管理的基本概念及相关的管 理方法。
    • 3.1 系统管理概述 3.2 用户和工作组管理 1. 用户账号文件—— passwd Passwd 是一个文本文件,用于定义系统的用户账号,该文件位于“ /etc ” 目录下。它包含了一个系统账户列表,给出每个账户一些有用的信息,例如,用户 ID 、组 ID 、主目录、 shell 等等。由于所有用户都对 passwd 有读权限,所以该文件中只定义用户账号,而不保存口令。 passwd 文件中每行定义一个用户账号,一行中又划分为多个字段定义用户的账号的不同属性,各字段用“:”隔开。图 3-1 中显示了 passwd 文件的前 10 行内容。在图中显示出了文件显示各用户的每一个字段,各字段的说明如表 3-1 所示。
    • 图 3-1 passwd 文件的属性及部分内容
    • 表 3-1 passwd 文件各字段说明 字  段 说    明 Account 使用者在系统中的名字,它不能包含大写字母。 Password 用户口令,出于安全考虑,现在不使用该字段保存口令, 而用字母“ x” 来填充该字段,真正的密码保存在 shadow 文件。 UID 用户 ID 号,惟一表示某用户的数字。 GID 用户所属的私有组号,该数字对应 group 文件中的 GID 。 GECOS 这字段是可选的,通常用于保存用户命名的信息。 Directory 用户的主目录,用户成功登录后的默认目录。 shell 用户所使用的 shell ,如该字段为空则使用“ /bin/sh” 。
    • 2. 用户口令文件—— shadow 在 shadow 文件中,每行定义了一个用户信息,行中各字段各字段用“:”隔开。为进一步提高安全性, shadow 文件中保存的是已加密的口令。图 3-2 中显示了 shadow 文件的前 10 行内容。
    • 从图 3-2 中可以看出,“ /etc/shadow ” 文件中的每个记录用“:”隔开为 9 个域,每个域的含义分别为:           登录名           加密口令           口令上次更改时距 1970 年 1 月 1 日的天数           口令更改后不可以更改的天数           口令更改后必须再更改的天数 ( 有效期 )           口令失效前警告用户的天数           口令失效后距账号被查封的天数           账号被封时距 1970 年 1 月 1 日的天数           保留未用
    • 3. 用户组账号文件—— group 用户组是逻辑地组织用户账号集合的方便途径,它允许用户在组内共享文件。系统上的每一个文件都有一个用户和一个组的属主。使用“ ls – l ” 命令可以看到每一个文件的属主和组。 于系统上的每个组,在 /etc/passwd 文件中有一行记录,记录的格式为: groupname : passwd : GID : userlist 表 3-2 group 文件字段说明 字  段 说  明 Groupname 是组的名字 Passwd 是组的加密口令 GID 是系统区分不同组的 ID ,在 /etc/passwd 域 中的 GID 域是用这个数来指定用户的缺省 组。 Userlist 是用“,”分开的用户名,列出的是这个组 的成员。
    • 图 3-3 中显示了 shadow 文件的前 10 行内容。
    • 4. 用户口令文件—— gshadow gshadow 文件用于定义用户组口令、组管理员等信息,该文件只有 root 用户可以读取。 Gshadow 文件中每行定义一个用户组信息,行中各字段间用“:”分隔,每行记录的格式为: groupname : Encrypted password: Group administrators: Group members 各字段的的含义如表 3-3 所示。在图 3-4 中给出了该文件的属性及文件的部分内容。 表 3-3 group 文件字段说明 字  段 说  明 Groupname 用户组名称,该字段与 group 文件中的组名称 对应。 Encrypted password 用户组口令,该字段用于保存已加密的口令 Group administrators 组的管理员账号,管理员有权对该组添加删除 账号。 Group members 属于该组的用户成员列表,列表中多个用户间 用“,”分隔。
    • 图 3-4 group 文件的属性及部分内容
    • 3.2.2 用户和组账户的维护命令 1. 增加用户帐号 在命令行下使用 useradd 命令: useradd 用户名 该命令做了下面几件事: 1 )在 /etc/passwd 文件中增添了一行记录; 2 )在 /home 目录下创建新用户的主目录,并将 /etc/skel 目录中的文件拷贝到该目录中去; 但是使用了该命令后,新建的用户暂时还无法登录,因为还没有为该用户设置口令,需要再用 passwd 命令为其设置口令后,才能登录。用户的 UID 和 GID 是 useradd 自动选取的,它是将 /etc/passwd 文件中的 UID 加 1 ,将 etc/group 文件中的 GID 加 1 。
    • 增加新用户时,系统将为用户创建一个与用户名相同的组,称为私有组。这一方法是为了能让新用户与其他用户隔离,确保安全性的措施 下面通过增加一个用户“ liuyidan ” ,以及查看其相关信息,来帮助用户理解该命令所执行的操作。其在终端上的操作命令及响应如图 3­-5 所示。 #useradd liuyidan // 建立用户账号 #tail -l /etc/passwd // 查看 password 文件中添加的用户 账号信息 #tail -l /etc/shadow # ls /home // 查看所建立账号的主目录
    • 图 3-5 增加用户及相关操作 选项 功能描述 -g 用于添加用户账号时指定该用户的私 有组。如不指定“ -g ” 参数, useradd 命 令将自动建立与用户账号同名的组作 为该账号的私有组。 -D 用于显示或设置 useradd 命令所使用的 默认值    在“ -g” 选项时,其语法格式如下: useradd –g 组名 用户名  在“ -D” 选项中,如果是用来修改 useradd 命令所使用的默认值,那么该命令使用的语法格式如下: useradd –D [-g group][-b base][-s shell][-f inactive][-e expire]
    • 2. 修改用户账号—— usermod usermod 命令可用来修改用户帐号的各种属性,包括用户主目录、私有组、登录、 shell 等内容。 Usermod 的命令格式如下: usermod [-LU][-c < 备注 >][-d < 登入目录 >][-e < 有效期限 >][-f < 缓冲天数 >][-g < 群组 >] [-G < 群组 >][-l < 帐号名称 >][-s ][-u ][ 用户帐号 ] 该命令的各个参数说明如下:   -c< 备注 > : 修改用户帐号的备注文字。   -d< 登入目录 > : 修改用户登入时的目录。   -e< 有效期限 > : 修改帐号的有效期限。   -f< 缓冲天数 > :修改在密码过期后多少天即关闭该帐号。   -g< 群组 > : 修改用户所属的群组。 -l < 帐号名次 > :修改用户帐号的名称
    • 下面举例说明该命令的使用方法: ( 1 )修改用户名,把用户名“ liuyidan ” 改名为“ lyd ” ,使用的命令是: # usermod –l lyd liuyidan (2 )锁定“ lyd ” 用户,使其不能登录。命令如下: # usermod –L lyd ( 3 )解锁“ lyd ” 用户账号,使其可以登录。命令如下: # usermod –U lyd
    • 3. 删除用户—— userdel userdel 命令用于删除指定的用户账号。其使用的语法格式为: userdel [-r][ 用户账号 ] 需要补充说明的是 userdel 命令可删除用户账号与相关的文件。若不加参数,则仅删除用户账号,而不删除相关文件。 其中参数“ -f ” 是用来删除用户登入目录以及目录中所有文件。 下面举例说明该命令的使用方法: #grep lyd /etc/passwd // 查询用户账号 lyd 是否存在 #userdel lyd // 删除 lyd 账号 #grep lyd /etc/passwd // 再次查询用户账 号 lyd 是否存在 #ll –d /home // 查询用户 lyd 的主 目录是否还存在 #userdel –r lyd // 删除用户的同时 删除其工作主目录
    • 4. 组增加命令—— groupadd groupadd 命令可指定群组名称来建立新的群组账号。该组账号的 ID 值必须是惟一的,且数值不可为负。预设的最小值不得小于 500 ,且每增加一个组账号 ID 值逐次增加。 ID 值 0~499 是保留给系统账号使用。该指令使用的语法格式为: groupadd [-r] group 其中“ -r ” 参数是用来建立系统账号。系统账号的 ID 值不能大于 500 。下面举例说明该命令的使用方法: # groupadd lbgroup // 建立组账 号 lbgroup # grep lbgroup /etc/group // 查询 group 文件中 lbgroup 组是否建立 #groupadd –r syslbgroup // 建立系统组账号 # grep lbgroup /etc/group // 查询 group 文件中 syslbgroup 组是否建立
    • 5. 组账号修改 groupmod 命令用来更改群组识别码或名称。该命令 的语法格式为: groupmod [-g < 群组识别码 > <-o>][-n < 新 群组名称 >][ 群组名称 ] 命令中所使用的参数说明如下:           -g < 群组识别码 >  设置欲使用的群组识别码。           -o  重复使用群组识别码。           -n < 新群组名称 >  设置欲使用的群组名称。
    • 下面举例说明该命令的使用方法: # grep lbgroup /etc/group // 查询 group 文件 中 lbgroup 组属性 #groupmod –g 503 lbgroup // 改变 lbgroup 组 的 GID 为 503 # grep lbgroup /etc/group // 查询操作结果是 否正确 #groupmod –n ydgroup lbgroup // 改变 lbgroup 组 名为 ydgroup # grep 503 /etc/group // 查询操作结果是 否正确
    • 6. 删除组账号 groupdel 命令用于删除指定的组账号,若该群组中仍包括某些用户,则必须先删除这些用户后,方能删除群组。该命令的语法格式为: groupdel [ 群组名称 ] 7. 口令维护命令 出于系统安全考虑, Linux 系统中的每一个用户除了有其用户名外,还有其对应的用户口令。因此使用 useradd 命令增加时,还需使用 passwd 命令为每一位新增加的用户设置口令;用户以后还可以随时用 passwd 命令改变自己的口令。该命令的一般格式为: passwd [ 用户名 ] 其中用户名为需要修改口令的用户名。只有超级用户可以使用“ passwd 用户名”修改其他用户的口令,普通用户只能用不带参数的 passwd 命令修改自己的口令。
    • 另外, passwd 命令还可以使用一些参数选项,这些参数选项可对账号的口令进行不同的操作,但这些带参数的 passwd 命令只有 root 用户可以使用。这些参数选择包括:            -S :用于查询指定用户账号的状态。           -l :用于锁定账号的口令。           -u :解除锁定账号的口令。           -d :删除指定账号的口令 。
    • 8. 组中用户成员的维护 gpasswd 命令可用于把一个账户添加到组、把一个账户从组中删除、把一个账户设为组管理员。 ( 1 )添加用户到使用的命令格式为: gpasswd –a 用户账号名 组账号名 ( 2 )从组中删除用户的命令格式为: gpasswd – d 用户账号名 组账号名 ( 3 )设置用户为组管理员的命令格式为: gpasswd -A 组管理员用户列表 用户组
    • 3.2.3 用户和组的状态命令
      • id 命令
      • id 命令用于显示用户当前的 UID , gid 以及所属群组的组列表该指令的语法格式为:
      •   id [ 选项 ] [ 用户名称 ]
      • 该命令所使用的选项参数说明如下:
      •            -g :显示用户所属群组的 ID 。
      •           -G :显示用户所属附加群组的 ID 。
      •           -n :显示用户,所属群组或附加群组的名称。
      •           -r :显示实际 ID 。
      •           -u :显示用户 ID 。
    • 2. whoami 命令 whoami 命令用于显示登录者自身的用户名称,本指令相当于执行“ id –un ” 指令。 3. su 命令   su 命令是用来将当前用户转换为其他用户身份。其命令的语法格式为: su [-flmp] [-][-c < 指令 >][-s ][ 用户帐号 ] 需要指出的是 su 命令可让用户暂时变更登入的身份。变更时须输入所要变更的用户账号与密码。该命令中的选项参数说明如下:
    •            -c< 指令 > :执行完指定的指令后,即恢复原来的身份。           -f :适用于 csh 与 tsch ,使 shell 不用去读取启动文件。           - :改变身份时,也同时变更工作目录,以及 HOME , SHELL , USER , LOGNAME 。此外,也会变更 PATH 变量。           -m , -p :变更身份时,不要变更环境变量。           -s :指定要执行的 shell 。 [ 用户帐号 ] :指定要变更的用户。若不指定此参数,则预设变更为 root 。 4. groups 命令 groups 命令用于显示指定用户所属的组,如未指定用户则显示当前用户所属的组。该命令的语法格式为: groups 用户名
    • 3.3 进程管理 3.3.1 进程的定义 Linux 是一个多用户多任务的操作系统。多用户是指多个用户可以在同一时间使用计算机系统;多任务是指 Linux 可以同时执行几个任务,它可以在还未执行完一个任务时又执行另一项任务。 那到底什么叫进程? Linux 系统上所有运行的程序都可以称之为一个进程。 Linux 用分时管理方法使所有的任务共同分享系统资源。进程的一个比较正式的定义是∶在自身的虚拟地址空间运行的一个单独的程序。进程与程序是有区别的,进程不是程序,虽然它由程序产生。程序只是一个静态的指令集合,不占系统的运行资源;而进程是一个随时都可能发生变化的、动态的、使用系统运行资源的程序。而且一个程序可以启动多个进程。
    • 3.3.2 报告进程状态 要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而 ps 命令就是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行、运行的状态、进程是否结束、哪些进程占用了过多的资源等等。 ps 命令最常用的还是用于监控后台进程的工作情况,因为后台进程是不和屏幕键盘这些标准输入 / 输出设备进行通信的,所以如果需要检测其情况,便可以使用 ps 命令。其命令语法格式如下: ps [ 选项 ] 命令中的选项说明如下:
    •            -e :显示所有进程。           -f :全格式。           -h :不显示标题。           -l :给出长列表。           -a :显示终端上的所有进程,包括其他用户的进程。           -r :只显示正在运行的进程。           -x 显示没有控制终端的进程。           -txx :只显示受 tty.xx 控制的进程。           -u :打印用户格式,显示用户名和起始时间。           -j :按作业格式输出。           -v :按虚拟存储器格式显示输出。           -m :显示存储器信息。           -S :增加子 CPU 时间和页面出错。           -w :用宽格式显示,不截取命令行,使它成为一行。           -r :只显示正在运行的进程。
    • 表 2-14 ps 命令输出字段的含义 字 段 含      义 USER 进程所有者的用户名 PID 进程号 %CPU 进程自最近一次刷新以来所占用的 CPU 时间和总时间的百分比 %MEM 进程使用内存的百分比 VSZ 进程使用的虚拟内存大小,以 K 为单位 RSS 驻留空间的大小。显示当前常驻内存的程序的 K 字节数。 TTY 进程相关的终端 STAT 进程状态,用下面的代码中的一个给出: R :可执行的。 S :睡眠状态。 D :不间断睡眠。 T :停止或跟踪。 Z :僵尸。 W :进程没有驻留页。 I :空闲。 TIME 进程使用的总 CPU 时间 COMMAND 被执行的命令行 NI 进程的优先级值,较小的数字意味着占用较少的 CPU 时间 PRI 进程优先级。 PPID 父进程 ID WCHAN 进程等待的内核事件名
    • 3.3.3 结束进程 当需要中断一个前台进程的时候,通常是使用 <Ctrl+c> 组合键;但是对于一个后台进程这个组合键是不能达到目的的。这时就必须使用 kill 命令,该命令可以终止后台进程。至于终止后台进程的原因很多,或许是该进程占用的 CPU 时间过多;或许是该进程已经挂死。 kill 命令的语法格式很简单,大致有以下两种方 式 : kill [-s 信号 | -p ] [ -a ] 进程号 kill -l [ 信号 ] 命令中的参数说明如下:           -s :指定需要送出的信号。既可以是信号名也可以对应数字。           -p :指定 kill 命令只是显示进程的 pid ,并不真正送出结束信号。 -l :显示信号名称列表,这也可以在 /usr/include/linux/signal.h 文件中找到。
    • 3.3.4 进程睡眠 sleep 命令可使当前正在执行的进程在规定的时间内处于睡眠。其使用的语法格式为: sleep time 说明: time 为进程将睡眠的时间,以秒为单位。例如 : $ sleep time
    • 3.4.1 识别 Linux 中的用户 1. 查看用户的操作 系统管理员在任一时刻都可查看用户的行为, 在终端的提示符下输入 w 命令即可 命令响应中所示的信息分别说明如下: 第一行显示系统的汇总信息,字段分别表示系统当前时间、系统运行时间、登录用户总数及系统平均负载信息。对于该行显示的几个数据意义是:    4:50pm 表示执行 w 的时间是在下午 4:50 。    0days,11:18 表示系统运行 0 天 11 小时 18 分。    4users 表示当前系统登录用户总数为 4  load average 与后面的数字一起表示系统在过去 1 、 5 、 10 分钟内的负载程度,数值越小,系统负 载越轻。 3.4 查看登录用户及日志文件信息
    • 从第 2 行开始构成一个表格,共有 8 个栏目,分别显示各个用户正在做的事情及该用户所占用的系统资源:  USER :显示登录用户名。用户重复登录,该账号也会重复出 现。    TTY :用户登录所使用的终端。  FORM: 显示用户从什么地方登录到系统。如果是从本地登录, 此字段为“ - ” ;如果从远程登录便会显示主机的 IP 地 址或主机名。  LOGIN @:是 LOGIN   AT 的意思,表示登录进入系统的时间。  IDLE :用户空闲时间,从用户上一次任务结束后开始计时。  JCPU :以终端代号来区分,表示在某段时间内,所有与该终 端相关的进程任务所耗费的 CPU 时间。  PCPU :指 WHAT 域的任务执行后所耗费的 CPU 时间。  WHAT :表示当前执行的任务。
    • 另外,使用 W 命令还可在有很多用户登录时,查看某一个具体的用户名,使用的命令形式如下: # w root  
        • 2. 查看登录用户
      • 系统管理员若想知道某一时刻有哪些用户登录到系统,可以使用系统提供的 who 命令,该命令可以查看当前登录系统的用户及其他相关系统信息。
      • 3. 查看登录用户历史
      • 系统管理员可以随时查看用户登录的历史行为,还可查看某一用户曾经登录到的系统,这些功能使用 last 命令即可实现。
    • 3.4.2 查看日志文件系统 日志文件( Log files )是包含关于系统消息的文件,包括内核、服务、在系统上运行的应用程序等。不同的日志文件记载不同的信息。 1. 定位日志文件 多数日志文件位于 /var/log 目录中。某些程序如 httpd 和 samba 在 /var/log 中有单独的存放日志文件的目录。 2. 放日志文件的目录。 注意,日志文件目录中会有多个后面带有数字的文件。这些文件是在日志文件被循环时创建的。日志文件被循环使用,因此文件不会变得太大。 logrotate 软件包中包含一个能够自动根据 /etc/logrotate.conf 配置文件和 /etc/logrotate.d 目录中的配置文件来循环日志文件的 cron 任务。按照默认配置,日志每周都被循环,并被保留四周之久。
    • 2. 查看日志文件 要在互动的、真实时间的应用程序中查看系统日志文件,可使用日志查看器。要启动日志查看器应用程序,可使用如下两种方法打开: ( 11 )        依次选择“主菜单->系统工具->系统日志” ( 22 )        在 shell 终端提示下键入 redhat-logviewer 命令。 打开图 3 - 4 - 5 所示的日志查看器对话框。
    • 按照默认设置,当前可查看的日志文件每隔 30 秒被刷新一次。要改变刷新率,可从图 3 - 4 - 5 的下拉菜单中选择“编辑->首选项”。如图 3 - 4 - 6 所示的窗口会出现。在“日志文件”标签中,点击刷新率旁边的上下箭头来改变它。可单击“关闭”按钮来返回到主窗口。刷新率会被立即改变。要手工刷新当前可以查看的文件,可从图 3 - 4 - 5 中选择“文件即刻刷新”或按“ Ctrl + R ” 键。
    • 3. 检查日志文件 日志查看器可以被配置在包含警告关键字的行旁边来显示警告图标。要添加警告词,从图 3-4-5 中的下拉菜单中选择“编辑->首选项”,然后选中“警告”标签,打开图 3 - 4 - 6 所示的对话框。单击“添加”按钮来添加警告词。要删除一个警告词,可从列表中选择它,然后单击“删除”。
    • 3.5 控制面板和设置管理工具 3.5.1 Red Hat 的控制面板 3.5.2 setup 配置工具 3.5 基本系统恢复 3.5.1 常见问题 3.5.2 引导入救援模式 3.5.3 引导入单用户模式 3.5.4 引导入紧急模式 本章小结
    • 第 4 章 Linux 网络基础 本章学习目标 本章主要让读者在使用 Internet 之前对 Internet 有一个大致的了解,以帮助读者对本书后续章节的学习。通过对本章的学习,读者应该掌握以下主要内容:           什么是 Internet           Internet 的由来和发展历程           Internet 提供的主要服务有哪些           Internet 在企业内部网的应用           我国在 Internet 网络上的发展状况
    • 4.1 TCP/IP 协议 4.1.1 TCP/IP 协议概述 现在,随着 Internet 的迅速发展使得计算机网络的应用已经开始遍及到我们现实生活的方方面面,而在 Internet 网络上所使用的协议正是 TCP/IP ( Transmission Control Protocol/Internet Protocol )协议,即传输控制协议 / 网际协议 . 在 20 世纪 60 年代后期开发出来了用于“异构”网络环境中的 TCP/IP 协议。也就是说, TCP/IP 协议可以在各种硬件和操作系统上实现,并且 TCP/IP 协议已成为建立计算机局域网、广域网的首选协议,并将随着网络技术的进步和信息高速公路的发展而不断地完善。
    • 4.1.2 Internet 网际协议( IP ) 在 TCP/IP 体系中,网际协议是最主要的协议之一 。 1 . IP 地址 在 TCP/IP 网络中,每个主机都有唯一的地址,它是通过 IP 协议来实现的。 IP 协议要求在每次与 TCP/IP 网络建立连接时,每台主机都必须为这个连接分配一个唯一的 32 位地址,因为在这个 32 位 IP 地址中,不但可以用来识别某一台主机,而且还隐含着网际间的路径信息。需要强调指出的,这里的主机是指网络上的一个节点,不能简单地理解为一台计算机,实际上 IP 地址是分配给计算机的网络适配器(即网卡)的,一台计算机可以有多个网络适配器,就可以有多个 IP 地址,一个网络适配器就是一个节点。 IP 地址为 32 位地址,一般以 4 个字节表示。每个字节的数字又用十进制表示,即每个字节的数的范围是 0~255 ,且每个数字之间用点隔开,例如: 192.168.101.5 ,这种记录方法称为“点 - 分”十进制记号法。 IP 地址的结构如下所示:
    • 网络类型 网络 ID 主机 ID IP 地址的 32 位被分成了 3 个字段:网络类型字段、网络 ID 字段和主机 ID 字段。网络类型字段用于标识网络的类型,到目前为止网络划分为 A~E 五类;网络 ID 则标识该主机所在的网络,由网络类型字段和网络 ID 字段构成网络标识;主机 ID 是该主机在网络中的标识。 IP 地址的基本分配原则是要为同一网络内的所有主机分配相同的网络标识号,同一网络内的不同主机必须分配不同的主机 ID 号,以区分主机,不同网络内的每台主机必须具有不同的网络标识号,但是可以具有相同的主机标识号。按照 IP 地址的结构和其分配原则,可以在 Internet 上很方便的寻址:先按 IP 地址中的网络标识号找到相应的网络,再在这个网络上利用主机 ID 找到相应的主机。由此可看出 IP 地址并不只是一个计算机的代号,而是指出了某个网络上的某个计算机。
    • 组建一个网络时,为了避免该网络所分配的 IP 地址与其他网络上的 IP 地址发生冲突,必须为该网络向 InterNIC ( Internet 网络信息中心)组织申请一个网络标识号,这也就是整个网络使用一个网络标识号,然后再给该网络上的每个主机设置一个唯一的主机号码,这样网络上的每个主机都拥有一个唯一的 IP 地址。另外,国内用户可以通过中国互联网络信息中心( CNNIC )来申请 IP 地址和域名。当然,如果网络不想与外界通信,就不必申请网络标识号,而自行选择一个网络标识号即可,只是网络内的主机的 IP 地址不可相同。 2 . IP 地址的分类
    • 为了充分利用 IP 地址空间, Internet 委员会定义了五种 IP 地址类型以适合不同容量的网络,即 A 类至 E 类,如图 4-1 所示。其中 A 、 B 、 C 三类由 InterNIC ( Internet 网络信息信心)在全球范围内统一分配, D 、 E 类为特殊地址。 0 网络地址 ID ( 7BIT) 主机地址 ID(24BIT) 0 1 7 8 31 A 类 IP 地址 10 网络地址 ID ( 14BIT) 主机地址 ID(16BIT) 0 1 2 15 16 31 B 类 IP 地址
    • 110 网络 IP 地址( 21BIT) 主机地址 ID ( 16BIT) 012 3 23 24 31 C 类 IP 地址 1110 广播地址 ID ( 28BIT) 0123 4 31 D 类 IP 地址 11110 保留用于将来和试验使用 01234 5 31 E 类地址
    • ( 1 ) A 类地址。 从图 4-1 ( a )中可以看出,在 A 类地址中,用第一个字节来表示网络类型和网络标识号,后面三个字节用来表示主机号码,其中第一个字节的最高位设为 0 ,用来与其他 IP 地址类型区分。第一个字节剩余的 7 位用来表示网络地址,最多可提供 2 7 -2=126 个网络标识号;这种 IP 地址的后 3 个字节用来表示主机,每个网络最多可提供大约 1678 万( 2 24 -2 )个主机地址。这类地址网络支持的主机数量非常大,只有大型网络才需要 A 类地址,由于 Internet 发展的历史原因, A 类地址早已被分配完毕。
    • ( 2 ) B 类地址。 从图 4-1 ( b )中可以看出,在 B 类地址中,用前两个字节来表示网络类型和网络标识号,后面两个字节标识主机号码,其中第一个字节的最高两位设为 10 ,用来与其他 IP 地址区分开,第一个字节剩余的 6 位和第二个字节(共 14 位)用来表示网络地址,最多可提供 2 14 -2=16,384 个网络标识号。这种 IP 地址的后 2 个字节用来表示主机号码,每个网络最多可提供大约 65,534 ( 2 16 -2 )个主机地址。这类地址网络支持的主机数量较大,适用于中型网络,通常将此类地址分配给规模较大的单位。
    • ( 3 ) C 类地址。 从图 4-1 ( c )中可以看出,在 C 类地址中,用前 3 个字节来表示网络类型和网络标识号,最后一个字节用来表示主机号码,其中第一个字节的最高位设为 110 用来与其他 IP 地址区分开,第一个字节剩余的 5 位和后面两个字节(共 21 位)用来表示网络地址,最多可提供约 200 万( 2 21 -2 )个网络标识号。最后 1 个字节用来表示主机号码,每个网络最多可提供 254 ( 2 8 -2 )个主机地址。这类地址网络支持的主机数量较少,适用于小型网络,通常将此类地址分配给规模较小的单位,如公司、院校等单位。
    • D 类地址是多播地址,主要是留给 Internet 体系结构委员会 IAB ( Internet Architecture Board )使用。 E 类地址保留在今后使用。目前大量使用的 IP 地址仅有 A , B 和 C 类三种 IP 地址。 例如:一个 IP 地址为 130.12.4.34 ,其用二进制表示为 10000010 00001100 00000100 00100010 ,把其与图 4-1 相比较可以看出,此 IP 地址属于 B 类网络,其网络 ID 号为 0000010 00001100B ,即 524 ,主机号为 00000100 00100010 ,即为 1058 。
    • ( 4 )特殊的 IP 地址。 ① 如果网络 ID 为 127 ,主机地址任意,这种地址是用来做循环测试用的,不可用作其他用途。例如, 127.0.0.1 是用来将消息传给自己的。 ② 在 IP 地址中,如果某一类网络的主机地址为全 1 ,则该 IP 地址表示是一个网络或子网的广播地址。例如, 192.168.101.255 ,分析可知它是 C 类网络地址,其主机地址为最后一个字节,即 255 ,二进制为 11111111B ,表示将信息发送给该网络上的每个主机。 ③ 在 IP 地址中,如果某一类网络的主机地址为全 0 ,则该 IP 地址表示为网络地址或子网地址。例如, 192.168.101.0 ,分析可知它是 C 类网络地址,其主机地址为最后一个字节即 0 ,二进制为 00000000B ,表示一个网络地址。
    • 说明: 正是由于地址不允许全 0 (表示网络或子网地址)或全 1 (表示广播地址),所以其网络数目和主机数目都要减 2 。例如, C 类网络只能支持 2 8 -2=254 个主机地址。 另外,如果要使网络直接连入 Internet ,应使用由 InterNIC 分配的合法 IP 地址。如果通过代理服务器连入 Internet ,也不应随便选择 IP 地址,应使用由 IANA (因特网地址分配管理局)保留的私有 IP 地址,以避免与 Internet 上合法的 IP 地址相冲突。这些私有地址的范围是:           10.0.0.1 ~ 10.255.255.254 ( A 类);           172.13.0.1 ~ 172.32.255.254 ( B 类);           192.168.0.1 ~ 192.168.255.254 ( C 类)。
    • 综合来看, IP 地址具有以下一些重要特点: ① IP 地址是一种非等级的地址结构。这就是说,和电话号的结构不一样, IP 地址不能反映有关主机位置的地理信息。 ② 当一个主机同时连接到两个网络上时(作路由器用的主机即为这种情况),该主机就必须同时具有两个相应的 IP 地址,其网络号是不同的。这种主机称为多地址主机。 ③ 按照 Internet 的观点,用转发器或网桥连接起来的若干个局域网仍为一个网络,因此这些局域网都具有同样的网络号码。 ④ 在 IP 地址中,所有分配到网络号的网络都是平等的。
    • 3 .子网及子网掩码 ( 1 )子网。 子网是指在一个 IP 地址上生成的逻辑网络,它使用源于单个 IP 地址的 IP 寻址方案,把一个网络分成多个子网,要求每个子网使用不同的网络 ID ,通过把主机号(主机 ID )分成两个部分,为每个子网生成唯一的网络 ID 。一部分用于标识作为唯一网络的子网,另一部分用于标识子网中的主机,这样原来的 IP 地址结构变成如下三层结构: 网络地址部分 子网地址部分 主机地址部分
    • ( 2 )子网掩码。 子网掩码是一个 32 位地址,它用于屏蔽 IP 地址的一部分以区别网络 ID 和主机 ID ;用来将网络分割为多个子网;判断目的主机的 IP 地址是在本局域网或是在远程网。在 TCP/IP 网络上的每一个主机都要求有子网掩码。这样当 TCP/IP 网络上的主机相互通信时,就可用子网掩码来判断这些主机是否在相同的网络段内。 如表 4-2 所示为各类 IP 地址所默认的子网掩码。其中值为 1 的位用来定出网络的 ID 号,值为 0 的位用来定出主机 ID 。例如,如果某台主机的 IP 地址为 192.168.101.5 ,通过分析可以看出它属于 C 类网络,所以其子网掩码为 255.255.255.0 ,则将这两个数据作逻辑与( AND )运算后结果为 192.168.101.0 ,所得出的值中非 0 位的字节即为该网络的 ID 。默认子网掩码用于不分子网的 TCP/IP 网络。
    • 11111111.11111111.11111111.00000000 255.255.255.0 C 11111111.11111111.00000000.00000000 255.255.0.0 B 11111111.00000000.00000000.00000000 255.0.0.0 A 子网掩码的二进制表示 子网掩码 类
    • 具体的运算步骤如下: 例如: 192.168.101.5 的二进制表示为 11000000 10101000 01100101 00000101B ;子网掩码为 255.255.255.0 ,其二进制值为 11111111 11111111 11111111 00000000 ,则当 192.168.101.5 和 255.255.255.0 进行逻辑与运算 11000000 10101000 01100101 00000000 11111111 11111111 11111111 11111111 11000000 10101000 01100101 0000000 后,所得出结果为 11000000 10101000 01100101 00000000 ,其中非 0 的三个字节,即 192.168.101 为该网络 ID ,剩余的字节(即 5 )为主机 ID 。若该网络的另一台的 IP 地址为 192.168.101.250 ,子网掩码也为 255.255.255.0 ,则同样会得到网络 ID 为 192.168.101 ,因此这两台主机在同一网段内。
    • 子网掩码的另一个用途就是可将网络分割为多个以 IP 路由连接的子网。如果某单位仅申请了一个网络 ID 号,但其网络规模较大,需要按照部门划分出多个子网段,此时可以借助子网掩码来实现需求。从 IP 地址的三层结构可以看出,用于子网掩码的位数决定可能的子网数目和每个子网内的主机数目。在定义子网掩码之前,必须弄清楚网络中使用的子网数目和主机数目,这有助于今后当网络主机数目增加后,重新分配 IP 地址的时间,子网掩码中如果设置的位数使得子网越多,则对应的其网段内的主机就越少。 4 . IP 路由 路由是数据从一个节点传输到另一个节点的过程。例如,要出发到某地,一般先确定到达目的地的路线。在 TCP/IP 网络中,同一网络区段中的计算机可以直接通信,不同网络区段中的计算机要相互通信,则必须借助于 IP 路由。
    • 在网络中要实现 IP 路由必须使用路由器,而路由器可以是专门的硬件设备,如 Cisco 公司的路由器等;若没有专用的路由设备,也可以将某台计算机设置为路由器。不论用何种方式实现,路由器都是靠路由表来确定数据报的流向的, IP 路由表实际上是相互邻接的网络 IP 地址的列表,当一个节点接收到一个数据报时,便查询路由表,判断目的地址是否在路由表中,如果是,则直接送给该网络,否则转发给其他网络,直到最后到达目的地。 在 TCP/IP 网络中, IP 路由器又叫 IP 网关。每一个节点都有自己的网关。 IP 报头指定的目的地址不在同一网络区段中,就会将数据报传送给该节点的网关,如果网关知道数据报的去向,就将其转发到目的地。每一网关都有一组定义好的路由表,指明网关到特定目的地的路由。网关不可能知道每一个 IP 地址的位置,因此网关也有自己的网关,通过不断转发、寻找路径,直到数据报到达目的地为止。
    • 如图 4-2 所示,通过设置为路由器的计算机 X 来实现了两个网段 202.204.58 与 202.204.60 (它们的子网掩码为 255.255.255.0 )的互联。这两个网段的计算机可以互相发送与接受信息。 一般的,作为路由器的计算机中都安装有两块网卡,这两块网卡的 IP 分别是要路由的两个网段中的一个 IP 地址,这样该计算机就好比一座桥梁一样用来连接两个不同的网段,完成路由的功能。
    • 4.1.3 下一代的网际协议 IPv6 现在看来,当初 IP 地址的设计确实有不够合理的地方。 1995 年以后陆续公布了一系列有关 IPv6 的协议、编址方法、路由选择以及安全等问题的 RFC 文档。 IPv6 主要在以下几个方面进行扩充和改进: ( 1 ) IPv6 把原来 IPv4 地址增大到了 128bit ,其地址空间大于 3.4 × 10 38 ,是原来 IPv4 地址空间的 2 96 倍。 ( 2 )这种下一代的 IP 协议并不是完全抛弃了原来的 IPv4 ,且允许与 IPv4 在若干年内共存。它使用一系列固定格式的扩展首部取代了 IPv4 中可变长度的选项字段。 ( 3 ) IPv6 对 IP 数据报协议单元的头部与原来的 IPv4 相比进行了相应的简化,仅包含 7 个字段( IPv4 有 13 个),这样,数据报文经过中间的各个路由器时,各个路由器对其处理的速度加快,提高了网络吞吐率。
    • 4 ) IPv6 另一个主要的改善方面是在它的安全方面。在许多报纸和文章都看见过某某军事机构网络被黑客入侵,某某银行的钱款被人划进某人自己的账户等等,所以 IPv6 从一开始就致力于提高网络的安全性,身份验证和隐私权是新 IP 的关键特性。 一般来讲,一个 IPv6 数据报的目的地址可以是以下三种基本类型地址之一:单播地址、多播地址和任播地址。单播地址是传统的点对点通信。多播地址是一个站点在发送数据时,属于同一个工作组的每一个计算机都能接收。在 IPv4 中采用的广播一词 IPv6 没有采用,而是将广播地址看作多播地址的一个特例。任意播送的目的地址是一个工作组地址,但它并不是将数据报发送给该工作组的每一成员,而是将数据报在交付时只交付给其中的一个,通常是距离最近的一个。
    • IPv6 将实现 IPv6 的主机和路由器均称为结点,并将 IPv6 地址分配给结点上面的接口。一个接口可以有多个单播地址。一个结点接口的单播地址可用来唯一地标识该结点。 如同 IPv4 一样, IPv6 把一个地址与特定的网络连接(而不是与特定的计算机)相关联,因此一个 IPv6 路由器由于和两个或多个网络相连接因而具有两个或多个地址。为了地址分配和修改的方便, IPv6 允许给一个给定的网络指派多个前缀,也允许对一个主机的给定接口同时指派多个地址。 IPv6 用“冒号十六进制”记法,它把每个 16 比特的量用十六进制值表示,各量之间用冒号分隔。例如,如果前面所给的点分十进制数记法的值改为冒号十六进制记法,就变成了 FFFE:000C:0000:0000:0C00:0000:0000:000C
    • 另外, IPv6 还允许对这种冒号十六进制的地址记法进行压缩: ( 1 )一组中的前导零可以忽略不写。例如上面这个 IPv6 地址中的第二组 000C 可以直接写成 C ,则该地址可压缩为: FFFE:C:0:0:C00:0:0:C 。 ( 2 )冒号十六进制记法还可以允许零压缩,即一串连续的零可以为一对冒号所取代,为了保证零压缩有一个不含混的解释,建议中还规定,在任一地址中,只能使用一次 零 压缩。该技术对已建议的分配策略特别有用,因为会有许多地址包含连续的零串。例如:上面这个 IPv6 地址可压缩为 FFFE:C::C00:0:0:C 。
    • 其次,冒号十六进制记法结合有点分十进制记法的后缀,这种结合在 IPv4 向 IPv6 的转换阶段特别有用。例如,下面的串是一个合法的冒号十六进制记法: 0:0:0:0:0:0:192.168.101.5 请注意,在这种记法中,虽然为冒号所分隔的每个值是一个 16 比特的量,但每个点分十进制部分的值则指明一个字节的值。再使用零压缩即可得出: ::192.168.101.5 4.1.4 Internet 的域名管理 1. 概述 2. DNS 域名结构
    • DNS 数据库的结构如同一棵倒过来的树,它的根位于最顶部,紧接着在根的下面是一些主域,每个主域又进一步划分为不同的子域。由于 InterNIC 负责管理世界范围的 IP 地址分配,顺理成章,它也就管理着整个域结构,整个 Internet 的域名服务都是由 DNS 来实现的,与文件系统的结构类似,每个域都可以用相对的或绝对的名称来标识,相对于父域来表示一个域可以用相对域名,绝对域名指完整的域名,主机名指为每台主机指定的主机名称,带有域名的主机名叫全称域名。
    • 如图 4-14 所示,这是整个 Internet 的域结构图。最高层次是顶级域又叫主域,它的下面是子域,子域下面可以有主机,也可以再分子域,直到最后是主机。要在整个 Internet 来识别特定的主机,必须用全称域名,例如 : www. microsoft .com 。 顶级域名常见的有两类: ( 1 )国家级顶级域名。例如: CN 表示中国; UK 表示英国; AU 表示澳大利亚等等。 ( 2 )通用的顶级域名。例如:           COM :商业机构;           EDU :美国教育机构;           NET :网络管理机构;           ORG :社会团体;           MIL :美国军队部门;
    • 由于 Internet 上用户的急剧增加,现在又增加了七个通用的顶级域名,即:           FIRM :表示公司企业;           SHOP :表示销售公司和企业;           WEB :表示突出万维网络活动的单位;           ARTS :表示突出文化、娱乐活动的单位;           REC :表示突出消遣、娱乐活动的单位;           INFO :表示提供信息服务的单位;           NOW :表示个人。
    • 在国家顶级域名下注册的二级域名均由该国家自行确定。我们国家将二级域名划分为“类别域名”和“行政区域名”两大类。其中,类别域名 6 个,分别是 :           AC :表示科研机构;           COM :表示工、商、金融等企业;           EDU :表示教育机构;           GOV :表示政府部门;          NET :表示互联网络、接入网络的信息中心和运行中心;           ORG :表示各种非赢利性组织。 行政区域名 34 个,适用于我国的省、自治区、直辖市。例如: bj 为北京市; sh 为上海市; hb 为湖北省等等。
    • 4.1.5 Linux 的网络配置 在 Red Hat Linux 9 中提供了一个图形界面的网络配置工具。使用该配置工具,可以配置各种网络连接。下面使用该工具来对一个 Linux 系统进行网络配置,配置的主要参数如下: 网络 IP 地址: 211.85.203.22 子网掩码: 255.255.255.0 默认网关: 211.85.203.254 DNS 服务器地址: 211.85.192.8
    • 1 )启动 redhat-config-network 管理工具,方法有以下两种:           依次单击面板上的“主菜单->系统设置->网络”,可打开如图 4-3 对话框。           在终端的提示符下输入“ redhat-config-network ” 命令,可打开如图 4-3 对话框。
    • 从图 4-3 中可看出, Linux 系统在安装过程中已经自动识别出一个网络适配器(或叫网卡),但此网卡由于没有进行配置,所以其目前的状态是不活跃状态,即还没有被激活。 ( 2 )在图 4-3 中,双击需要激活的网卡记录。在本例中双击“ eth0 ” ,打开图 4-4 所示的对话框,在该对话框中进行常规网络配置。 从图 4-4 中可看出,在该对话框中可由两种方法对 IP 地址进行设置:一种是通过“自动获取 IP 地址使用”来获得 IP 地址,但这种方式的前提是必须在本机所在的局域网中拥有 DHCP 服务器;第二种是手工配置 IP 地址。在本例中采用第二种方法,手工配置 IP 地址。 ( 3 )在图 4-4 中,选中“静态设置 IP 地址”单选按钮,并在该单选按钮下面的文本框中输入相应的网络参数值,如图 4-5 所示。
    • ( 4 )当网络参数值输入完毕后,单击“确定”按钮,返回到图 4-3 。在图 4-3 所示的对话框中,选择 DNS 选项卡,打开如图 4-6 所示的对话框。 ( 5 )在图 4-6 中,输入本机的主机名:“ lbliubing.com ” ; DNS ( IP 地址):“ 211.85.192.8 ” 后,单击“设备”选项卡,返回到图 4­-3 中。
    • 图 4—6 ( 6 )此时,在图 4-3 的对话框中,单击工具条上的“激活”按钮,系统会弹出一个问题对话框,如图 4-7 所示。 4—7
    • ( 7 )在图 4-7 的对话框中,单击“是”按钮,此时会弹出一个修改信息正确的对话框,如图 4­-8 所示。 ( 8 )单击图 4-8 中的“确定”按钮,出现如图 4-9 所示。此时从图中可看到, eth0 的状态已处于激活状态,如果想让网卡起作用,最好重新启动 Linux 系统。
    • 图 4-9 激活网卡 4.2 Linux 网络配置的常用命令 4.2.1 hostname 每个系统都应该有一个名字,这个名字通常在系统安装时确定,可以使用 hostname 命令来获得当前系统的名字。同样设置计算机的名字也可以使用 hostname 命令,但这需要 root 权限:
    • # hostname lb.whpu.edu.cn # hostname lb.whpu.edu.cn 这个配置必须写入启动文件,以便每一次系统启动都能正确完成设置。因此,就需要在 rc.conf 中改动或添加相关设置。 hostname=“ lb.whpu.edu.cn ” 一些情况下,这种改动方式会产生一些无伤大雅的小问题
    • 4.2.2 ifconfig ifconfig 命令用到的执行参数可以没有,也可有一个网络接口的名字、一个 IP 地址以及其他参数选项。 ifconfig 命令会把一个 IP 地址分配给一个网络接口,然后,用户的系统就会知道存在着这样一个网络接口.还会知道它对应着某个特定的 IP 地址。此外,用户还可以定义 IP 地址到底是一个主机的地址还是一个网络的地址。用户还可以使用此 IP 地址对应的域名,当然该域名及其 IP 地址要出现在 /etc/hosts 文件的清单里。 ifconfig 命令单独使用时显示当前系统中活动的网卡设置,其在终端上的响应如图 4-10 所示 。  
    • 4-10
    • 在图 4-10 中,命令响应的以 eth0 为首的第一行是本机的以太网卡配置参数,这里显示了网卡的设备名和硬件的 MAC 地址 00:00:E8:7D:FB:51 ( MAC 地址是由生产厂家指定的,每个网卡拥有的唯一地址, MAC 地址是一个 48 位地址,图中是以 16 进制表示的)。 第二行显示本机的 IP 地址信息,分别是本机的 IP 地址,网络广播地址和子网掩码。必须确认这些信息都是正确无误的,否则 Linux 服务器无法与其它网络设备建立连接 。 第三行显示的是设备的网络状态。 MTU (最大传输单元)和 Metric (度量值)字段显示的是该接口当前的 MTU 和度量值的值。 后面几行是用来显示接口通信的网络统计值。 RX 和 TX 分别表示接收和传送的数据包。如果网卡已经完成配置却还是无法与其它设备通信,那么从 RX 和 TX 的显示数据上可以简单地分析一下故障原因。
    • 在图 4-10 中,还有一个以 lo 为首的部分。 lo 是 look-back 网络接口,从 IP 地址 127.0.0.1 就可以看出,它代表“本机”。无论系统是否接入网络,这个设备总是存在的,除非你在内核编译的时候禁止了网络支持,这是一个称为回送设备的特殊设备,它自动由 Linux 配置以提供网络的自身连接。 IP 地址 127.0.0.1 是一个特殊的回送地址(即默认的本机地址),可以在系统上用 telnet 对 IP 地址 127.0.0.1 进行测试。如果有 inetd 进程在运行的话会从机器上获得登录提示符。 Linux 可以利用这个特征在进程与仿真网络之间进行通信。 如果只是关心某个设备是否正常,可以在 ifconfig 后面加上接口名字,如下面命令:(其在终端上的响应如图 4-11 所示) # ifconfig eth0
    • 图 4-11 查看某个网络设备 图 4-12 修改 IP 地址
    • 如果要暂停某个网络接口的工作,使用 down 参数将取消 eth0 网络接口,命令如下: ifconfig eth0 down 如果使用了带有参数的 ifconfig 命令,那就可以手动设置网卡的配置参数了。有效的 ifconfig 命令参数及其意义为:            Interface 网络设备名,如 eth0 就表示本机的第一块网卡。           up :标志接口处于“ up ” 状态,也就是说, IP 层可以对其进行访问。这个选项用于命令行上给出一个地址之时。如果这个接口已被“ down ” 选项临时性取消的话(与该选项对应的标记是 UP RUNNING ),还可以用于重新启用一个接口。           down :标标志接口处于“ down ” 状态,也就是说, IP 层不能对其进行访问。这个选项有效地禁止了 IP 通信流通这个接口。注意,它并没有自动删除利用该接口的所有路由信息。如果永久性地取消了一个接口,就应该删除这些路由条目,并在可能的情况下,提供备用路由。 netmask :分配子网掩码,供接口所用。要么给一个前面是 0x 的 32 位十六进制号码,要么采用只适用于两台主机所用的点分四段式号码。对 SLIP 和 PLIP 接口来说,这个选项是必须配置的。
    •            address :设置指定接口设备的 IP 地址。           broadcast address 广播地址通常源于网络编号,通过设置主机部分的所有位得来。有的 I P 采用的方案有所不同:这个选项可适用于某些奇怪的环境(如果已经设置了广播地址, ifconfig 就会显示出一个 BROADCAST 标记)。           hw class addr :设置指定接口设备的 MAC 地址,关键字的后面必须跟硬件名或者与之等价的 ASCII 码。目前支持的硬件类有 ether, ax25, ARCnet 和 netrom 。           mtu bytes 该选项用于设置最大传输单元,也就是接口一次能处理的最大字节数。对以太网接口来说, MTU 的默认设置是 1500 个字节;对 SLIP 接口来说,则是 296 个字节。           arp 标这个选项专用于以太网或包广播之类的广播网络。它启用 ARP (地址解析协议)来保护网络上各台主机的物理地址。对广播网来说,默认设置是 &quot; on&quot; (开)。
    • 4.2.3 ifup 和 ifdown ifup 命令用于启动指定的非活动网卡设备,该命令与 ifconfig up 命令相似。 Ifdown 命令用于停止指定的活动网卡设备,该命令与 ifconfig down 命令功能相似。这两个命令的格式如下: ifup 网卡设备名 ifdown 网卡设备名 这两个命令在终端上的使用及响应结果如图 4-13 所示。
    • 图 4-13 ifup 和 ifdown 命令的使用
    • 4.2.4 route 传输过程中的一个数据包会经过一个‘路由”到达目的地。在一个大型的网络中,数据包从一个计算机传输到另一个计算机,直到它们到达目标计算机为止,路由决定着这个过程从哪里开始,也决定着为了到达目的地,用户的系统最先需要向哪台计算机传输数据包。在小型网络中,路由可能是静态的——也就是说从一个系统到另外一个系统的路由是固定不变的,一个系统知道如何才能经过固定的路径到达另外一个。而在大型网络或者因特网中,路由的安排是动态的。用户的系统知道应该把数据包第一个发送给哪台计算机,那台计算机收到数据包后,再把它传递给下一台计算机,再由它决定如何继续下去,直到到达目的地为止。对动态路由来说,需要用户系统了解的东西是很少的。而静态路由却下一样,因为用户必须记录所有网络连接的通断情况,其路由安排可能会变得很复杂。 用户的路由列在 /proc/net/route 文件里保存的路由分配表里。如果想看到路由表,请输入不带任何参数选项的 route 命令,其在终端上的响应结果如图 4-14 所示。
    • 图 4-14 不带任何参数选项的 route 命令
    • 在图 4-14 中输出结果中各个字段的含义是:        Destination :表示路由的目标 IP 地址。     Gateway :表示网关使用的主机名或者是 IP 地址。上面输出的“ * ” 表示没有网关。      Genmask :表示路由的网络掩码。内核将数据包的 IP 地址和 Genmask 按位进行 “与”操作,得到的地址与路由的目标地址进行比较,如果相同则采用相应的 路由。     Flags 是表示路由的标志。可用的标志及其意义是: U 表示路由在启 动, H 表示 target 是一台主机, G 表示使用网关, R 表示对动态路由进行复位设置; D 表示动态安装路由, M 表示修改路由,!表示拒绝路由。       Metric 表示路由的单位开销量。       Ref 表示依赖本路由现状的其它路由数目。       Use 表示路由表条目被使用的数目。      Iface 表示路由所发送的包的目的网络。
    • 在路由表里至少要有一个为回馈接口准备的设置项。如果没有,用户就必须使用 route 命令为回馈接口安排一个路由。一个接口必须在它的 IP 地址被添加到路由表之后才能提供给人们使用。添加地址的操作可以用 route 命令和它的 add 参数完成,其命令格式如下所示: route add –net 网络地址 netmask 子网掩码 dev 网卡设备名 下面的例子把回馈接口的 IP 地址添加到路由表里去: route add 127.0.0.1 通过 route 命令还可进行添加或删除系统当前路由表中的默认网关记录,添加和删除的命令格式如下: route add default gw 网关 IP 地址 dev 网卡设备名 route del default gw 网关 IP 地址 在图 4-16 中显示了增加和删除当前路由表中默认网关记录的操作及响应过程。
    • 图 4-16 增加和删除当前路由表中默认网关记录
    • 4.2.5 ping ping 命令是最常用的网络测试命令,该命令通过向被测试的目的主机地址发送 ICMP 报文并收取回应报文,来测试当前主机到目的主机的网络连接状态。在 Linux 系统中, ping 命令默认会不间断地发送 ICMP 报文直到用户使用“ Ctr+C ” 键来终止该命令,使用“ -c ” 参数可指定发送 ICMP 报文的数目。该命令的格式如下 : ping [-c 发出报文数 ]  目的主机地址
    • 在图 4-17 中,是运行 ping 命令的使用及响应过程。从图中可看出,运行 ping 命令后会在几秒钟内回显域名所对应的 IP 地址,这是用户察看一域名对应的 IP 地址的一种方法。时间分别为最小、平均值、最大值,通过他们可以了解到网络不同时间传输的差异。 需要说明的就是关于网络安全问题的所谓 ping flood ,洪水发送。 Ping 命令消耗网络带宽并占用系统资源,当向一个网络发 ping flood 包,必然会导致服务器服务拒绝,采取一定措施的除外。现在很多的服务器都安装防火墙,可以防止这样的 ICMP 攻击。 4.2.6 traceroute traceroute 命令就是跟踪本地和远程两台主机间的 UDP 路由数据报。其语法很简单,使用命令格式 traceroute IP 地址
    • traceroute 是通过设置待发送分组的存活时间 (time to live, TTL) 来工作的。 TTL 减为零时,最后的网关就会给源主机发送一个 ICMP(internet control message protocol) 出错消息。所以它的原理就是先发送一个 TTL 为 1 的数据报,第一个路由器将 TTL 值减 1 ,发现 TTL 变为零,将该数据报丢弃,并发送给源主机一个 ICMP 报文。这样,源主机就得到了从源主机到目的主机的第一个路由器的地址。同样源主机再发送 TTL 为 2 的数据报……,这样源主机每发送三个 UDP 报文, TTL 值增 1 。最后,对目的主机可选择一个不可能的值( 33434 )作为 UDP 端口值,这样在数据报到达时,目标主机会发送一个“ ICMP 端口不可达”的消息,表示到达目标主机,并终止 traceroute 跟踪。
    • 4.2.5 netstat netstat 命令用来显示各种各样的与网络相关的状态信息,它的主要用途有:察看网络的连接状态(仅对 TCP 有效,对 UDP 无效)、检查接口的配置信息、检查路由表、取得统计信息。不带参数时表示显示获得的 TCP 、 UDP 端口状态,因为 UDP 为无连接的协议,所以状态对其无意义。常见的状态有: ESTABLISHED 、 LISTENING 、 TIME-WAIT ,分别表示处于连接状态、等待连接、关闭连接。 netstat 程序有几个参数选项,用户可以用来查看网络上不同方面的信息,其参数说明如下:
    •            -a :选项为显示所有配置的接口           -i :选项为显示接口统计信息           -n :选项为以数字形式显示 IP 地址           -r :选项显示内核路由表           -s: 选项表示计数器的值。 4.2.6 nslookup nslookup 是一条查询 DNS 数据库的用户级命令。所谓的域名系统( DNS , Domain Name System )就是一个分布式的数据库,用于处理了整个 Internet 上的域名与 IP 地址的映射。数据信息在网络中,需要底层的协议根据其 IP 地址来传送。 nslookup 可以向服务器直接查询信息,一般情况下均使用交互模式。此时会出现提示符“>”, nslookup 提供了许多可用命令。下面列举其中一些常用的详细说明。
    •           help 命令:显示帮助信息,及一些简单的命令的作 用。           exit 命令:退出 nslookup 命令。           lserver 命令:查找指定的域名服务器并将其设置为 默认的域名服务器。           server 命令:和 lserver 相似,解析另一台域名服务 器并将其设置为默认的服务器,不同在于本命令使 用当前的默认服务器来解析。           set 命令:修改工作参数,它也是 nslookup 中最常用 的命令,其可使用的工作参数如表 4-1 所示。
    • 表 4-1 nslookup 程序的 set 命令中的工作参数 工作参数 说       明 set class 设置查询的类型,一般情况下为 I nternet 。 set de bug 设置调试模式 /set nodebug : 设置为非调试模式 set d2 设置详细调试模式。 /set nod2 :设置为非详细 调试模式。 set [no]defname 设置为 defname ,会在所有没有加 “ o“ 的名字后 自动加上默认的域名。它是默认的方式。 set domain 设置默认的域名。 set port DNS 的默认端口为 53 ,用本命令可以设置其 他端口,一般用于调试。 set q(querytype) 改变查询的信息的类型。默认的类型为 A 纪录 set recurse 设置查询类型为递归; set retry 设置重试的次数。默认的值为 4 。 set root 设置默认的根服务器。 set timeout 设置等待应答的限制时间(单位为秒),超 出即为超时,如果还可以重试,就会将长超 时值加倍,重新查询。默认的超时值为 5 秒。
    • 图 4-20 nslookup 的使用方法 在图 4-20 中显示了使用 nslookup 命令的使用方法。在该图中,首先输入待查询的域名“ www.whpu.edu.cn ” ,然后输入待查询的 IP 地址“ 211.85.192.1 ” ,最后使用 exit 命令退出 nslookup 命令环境。    
    • 图 4-21 nslookup 命令可直接带域名或 IP 地址
    • 4.2.9 tcpdump tcpdump 命令用于监视 TCP/IP 连接并直接读取数据链路层的数据包的头部信息。用户可以指定哪些数据包被监视、哪些控制要显示格式。例如要监视所有 Ethernet 上来往的通信,执行下述命令: # tcpdump -i eth0 实际上, tcpdump 命令的格式为: tcpdump [ - 选项 ] [ -c 数量 ] [ -F 文件名 ][ -i 网络接口 ] [ -r 文件名 ] [ -s snaplen ]            [ -T 类型 ] [ -w 文件名 ] [ 表达式 ] tcpdump 命令中的选项参数说明如表 4-2 所示。 Tcpdump 命令中的表达式是一个正则表达式, tcpdump 利用它作为过滤报文的条件,如果一个报文满足表达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包将会被截获。
    • 表 4-2 tcpdump 命令的选项介绍 参数选项 说      明 -a 将网络地址和广播地址转变成名字; -d 将匹配信息包的代码以人们能够理解的汇编格式给出; -dd 将匹配信息包的代码以 c 语言程序段的格式给出; -ddd 将匹配信息包的代码以十进制的形式给出; -e 在输出行打印出数据链路层的头部信息; -f 将外部的 Internet 地址以数字的形式打印出来; -l 使标准输出变为缓冲行形式; -n 不把网络地址转换成名字; -t 在输出的每一行不打印时间戳; -v 输出一个稍微详细的信息,例如在 ip 包中可以包括 ttl 和服务类型的信息; -vv 输出详细的报文信息; -c 在收到指定的包的数目后, tcpdump 就会停止; -F 从指定的文件中读取表达式 , 忽略其它的表达式; -I 指定监听的网络接口; -r 从指定的文件中读取包 ( 这些包一般通过 -w 选项产生 ) ; - w 直接将包写入文件中,并不分析和打印出来; -T 将监听到的包直接解释为指定的类型的报文,常见的类型有 rpc (远程过程调用)和 snmp (简单网络管理协议;)
    • 下面我们介绍几种典型的 tcpdump 命令的输出信息 ( 1 ) 数据链路层头信息 # tcpdump --e host ice ice 是一台装有 linux 的主机,其 MAC 地址是 0 : 90 : 27 : 58 : AF : 1A , H219 是一台装有 SOLARIS 的 SUN 工作站,它的 MAC 地址是 8 : 0 : 20 : 79 : 5B : 46 ;上一条命令的输出结果如下所示: 21:50:12.847509 eth0 < 8:0:20:79:5b:46 0:90:27:58:af:1a ip 60: h219.33357 > ice. telnet 0:0(0) ack 22535 win 8760 (DF)
    • ( 2 ) ARP 包的 TCPDUMP 输出信息 使用命令 #tcpdump arp 得到的输出结果是:    22:32:42.802509 eth0 > arp who-has route tell ice (0:90:27:58:af:1a)    22:32:42.802902 eth0 < arp reply route is-at 0:90:27:12:10:66 (0:90:27:58:af:1a) ( 3 ) TCP 包的输出信息 用 TCPDUMP 捕获的 TCP 包的一般输出信息是: src > dst: flags data-seqno ack window urgent options
    • ( 4 ) UDP 包的输出信息 用 TCPDUMP 捕获的 UDP 包的一般输出信息是:    route.port1 > ice.port2: udp lenth 4.3 网络配置文件及程序 4.3.1 网络配置文件 在 Linux 系统中, TCP/IP 网络是通过若干个文本文件进行配置的,可以通过编辑这些文件来完成联网工作。系统中重要的有关网络配置文件有:
    •           1. 网络设置 /etc/sysconfig/network 该文件用来指定服务器上的网络配置信息,包含了控制和网络有关的文件和守护程序的行为的参数。下面是一个例子文件: NETWORKING=yes HOSTNAME=machine1 GATEWAY=210.34.6.2 FORWARD_IPV4=yes GATEWAYDEV= 其中, NETWORK=yes/no 表示网络是否被配置; HOSTNAME=hostname hostname 表示服务器的主机名; GATEWAY=gw-ip gw-ip 表示网络网关的 IP 地址; FORWARD_IPV4=yes/no 是否开启 IP 转发功能; GAREWAYDEV=gw-dev gw-dw 表示网关的设备名,
      • 主机名 /etc/HOSTNAME
      • 该文件包含了系统的主机名称,包括完全的域名,如:
      • 192.168.0.1 lb.whpu.edu.cn
      • 这个文件是在启动时从文件 /etc/sysconfig/network 中的 HOSTNAME 行中得到的,用于在启动时设置系统的主机名。
      • 3. IP 地址和主机名的映射 /etc/hosts
      • /etc/hosts 文件中包含了 IP 地址和主机名之间的映射,还包括主机名的别名, IP 地址的设计使计算机容易识别,但对于人来说却很难记忆,为了解决这个问题,就创建了 /etc/hosts 这个文件。 下面是一个例子文件:
      • 127.0.0.1 machine1 localhost.localdomain localhost
      • 192.168.1.100 machine7
      • 192.168.1.101 otherpc otheralias
      • 在这个例子中,本机名是 machine1 , otherpc 还有别名 otheralias ,它可以指向 otheralias 。一旦配置完机器的网络配置文件,应该重新启动网络以使修改生效,使用下面的命令来重新启动网络:
      • /etc/rc.d/init.d/network restart
      • 端口号和服务器名之间的映射 /etc/services
      • /etc/services 中包含了服务名和端口号之间的映射,不少系统程序要使用这个文件
      • 5. 配置名字解析器 /etc/host.conf
      • /etc/host.conf 文件指定如何解析主机名
      • 3 中解析方式: /etc/hosts, DNS, NIS
      • 例: order hosts, bind
      • multi on # 是否 /etc/hosts 中允许一个主机有多个 IP 地址
      • 配置 DNS 客户 /etc/resolv.conf
      • 文件 /etc/resolv.conf 配置 DNS 客户,它包含了主机的域名搜索顺序和 DNS 服务器的地址,每一行应包含一个关键字和一个或多个的由空格隔开的参数。下面是一个例子文件:
      • search mydom.edu.cn
      • nameserver 210.34.0.14
      • nameserver 210.34.0.2
    • 4.3.2 使用 netconfig 程序配置网络
      • 启动 netconfig 程序
      • 当用户登录到 Linux 系统后,在终端上使用“ netconfig ” 命令启动该程序,其在终端上的响 应结果如图 4-22 所示。
      图 4-22 确认网络配置 图 4-22 确认网络配置
    • 图 4-23 进行网络配置 单击图中对话框上的“ yes ” 按钮,确认要进行网络配置,即于如图 4-23 所示的配置网络属性界面。
    • 2. 配置网络属性 进入“ Configuer TCP/IP ” 窗口后,设置相应的网络属性,如 IP 地址、子网掩码、默认网关和 DNS 服务器地址,确认配置完成后单击“ OK ” 按钮保存设置。 3. 重新启动网络服务 使用 netconfig 程序进行网络配置后只是修改了相应的网络配置文件,并没有使用所作的配置在当前系统中生效,需要使用“ service network restart ” 命令重新启动网络服务,才可以使新的配置在当前系统中生效。图 4-24 显示在终端上重新启动网络服务及响应过程。 图 4-24 显示
    • 4.3.3 测试网络 测试网络的第一步是,确认局域网中的计算机在启动之后能否与其他主机通讯。可以先在每台计算机上输入 reboot 命令。在 Linux 重新启动过程中,要仔细观看屏幕上滚动的测试信息。注意寻找下列信息:    Setting hostname: <hostname you assigned to this computer>    Bringing up Interface lo: <OK> or <FAILED>    Bringing up interface eth0 <OK> or <FAILED> 也可以使用 ping 命令来判断计算机能否与其他计算机通讯。在当前主机上打开一个终端窗口,并输入命令 ping <IP address> 或 ping <hostname> 。其中, <IP address> 或 <hostname> 是分配给这个计算机的 IP 地址和主机名。需要注意的是,为了让 ping 命令正确工作,就必须输入 IP 地址或者主机名作为参数。
    • 如果已经正确配置了 DNS nameserver 规范,那么 ping <hostname> 命令就会将 hostname 这个主机名映射成相应的 IP 地址。否则,只好在 ping 命令后面给出确切 IP 地址来测试,也就意味着现在要拥有该局域网上所有计算机的 IP 地址列表。 ping 命令通过局域网将消息发送到目的 IP 地址所表示的计算机。如果这台计算机能够与其他主机通讯,就可以看到一些消息或包(包括信息的字节数)。这些包应该象下面这样: 64 bytes from 192.168.1.x : icmp_seq=0 ttl=255 time=0.8ms 64 bytes from 192.168.1.x : icmp_seq=0 ttl=255 time=0.8ms 64 bytes from 192.168.1.x : icmp_seq=0 ttl=255 time=0.8ms 如果不能够 ping 到局域网中的另外一台主机,可以按照下面的方法寻找问题的根源。首先,用 halt 命令关掉局域网上所有的计算机。在所有计算机的命令行上输入 halt 。关掉所有计算机的目的在于,可以在再启动这些计算机的时候观察到启动程序的反馈信息 。
    • 检查所有计算机之间的网线,确信所有的 RJ45 接口都被正确连接。在确保所有网线安全正确连接之后,逐个启动局域网上的计算机,并观察启动过程中的下列响应信息: Setting hostname: hostname.networkname [OK] 下面给出一个实例,在局域网中有一台 Linux 主机,其通过网关连接到互联中,现在该 Linux 主机不能通过浏览器访问到互联网中的某个站点,通常查找这种故障的步骤如下:
    • ( 1 )检测是否该站点是否关闭,即可通过是否能打开其他知名站点来确认。如是否能访问新浪、 Yahoo 、搜狐等。 ( 2 )查看本机 IP 地址及相关网络参数设置是否正确。 ( 3 )检测本机与网关之间的通讯是否正常。 ( 4 )检测与互联网的连接。如使用 Ping 命令进行测试。 ( 5 )测试域名解析是否正常。 ( 6 )测试与特定站点的连接是否正常。
    • 第 5 章 Intranet 服务器 本章学习目标 在 Linux 系统中,虽然有很多应用都使用图形界面,但是大多数使用和管理 Linux 的实用程序和技巧还是通过键入命令来运行的。在本章中,将介绍一些基本的 Linux 命令,并通过一些实际的例子使读者边学边用,让读者尽快熟悉 Linux 系统。。通过对本章的学习,读者应该掌握以下主要内容:           命令的使用方式           文件及目录操作命令           文件压缩命令           联机帮助命令           进程管理的命令
    • smbclient 命令是 Samba 提供的一个类似 FTP 客户程序的客 Samba 客户程序,用以访问 Windows 共享或 Linux 提供的 Samba 共享。其命令格式为: smbclient //hostname/sharename -U username
    • 5.1 Samba 服务器 5.1.1 Samba 简介 1. Samba 的基础知识 Samba 是一组软件包,使 Linux 支持 SMB 协议,是一套让 Linux 系统能够应用 Microsoft 网络通讯协议的软件。它使执行 Linux 系统的机器能与执行 Windows 系统的计算机进行文件与打印机共享 . 2. Samba 的主要功能 ( 1 )提供 Windows 操作系统风格的文件和打印机共享 Windows 98 、 Windows XP 、 Windows 2000 等以据此共享 Linux 等其他操作系统的资源,外表看起来和共享 Windows 资源没有区别,并支持 Windows 客户使用网上邻居浏览网络。
    • ( 2 )提供 SMB 客户功能:利用 Samba 提供的 smbclint 程序可以从 Linux 下以类似于 FTP 的方式访问 Windows 的资源。 ( 3 )备份 PC 上的资源:利用一个叫 smbtar 的 shell 脚本,可以使用 tar 格式备份和恢复一台远程 Windows 上的共享文件。 ( 4 )提供一个命令行工具,在其上可以有限制地支持 NT 的某些管理功能。 3.Samba 组成 一个 samba 服务器实际上包含了两个服务器程序: smbd 和 nmbd 。 Smbd 是 samba 的核心。它负责建立对话进程、验证用户身份、提供对文件系统和打印机的访问机制。 Nmbd 实现了“ Network Brower” (网络浏览服务器)的功能。它的作用是对外发布 samba 服务器可以提供的服务。
    • Samba 还包含了一些实用工具。 Smbclient 是一个 SMB 客户工具,有 shell-based 用户界面并同 FTP 有些类似。应用它可以复制其它的 SMB 服务器资源,还可以访问其它 SMB 服务器提供的打印机资源。 Testparm 命令用来快速检查 smb.conf 文件的语法错误。其它工具用来配置 samba 的加密口令文件、配置用于 samba 国际化的字符集。 5.1.2 安装与配置 Samba 服务器 1. Samba 服务器的安装 ( 1 )如果在安装 Linux 时,已经安装的 Samba ,就不需要再安装了。但如果不确定是否已经安装了 Samba ,即可使用下面的命令来确认: # rpm –qa | grep samba
    • ( 2 )如果确认没有安装 samba ,可将 Red Hat Linux 9 的第一张安装光盘放入光盘驱动器中,然后通过下面的命令进行挂装: # mount /mnt/cdrom ( 3 )将终端的当前工作目录切换到 Red Hat Linux 9 的安装光盘的 Red Hat/RPMS 目录,使用如下命令: # cd /mnt/cdrom/Red Hat/RPMS ( 4 )安装所需要 RPM 包。使用如下命令: # rpm –ivh samba-common-2.2.7a-7.9.0.i386.rpm # rpm –ivh samba -2.2.7a-7.9.0.i386.rpm # rpm –ivh samba-client-2.2.7a-7.9.0.i386.rpm ( 5 )安装 samba 的图形配置工具。使用如下命令: # rpm –ivh redhat-config-samba-1.0.4-1.noarch.rpm
    • ( 6 )弹出光盘。使用如下命令: # cd;eject 2. Samba 服务器的配置 Samba 服务器的配置步骤如下: ( 1 )启动 Samba 服务器配置工具。 ( 2 )从图 5-1 中依次选择“首选项->服务器设置”,打开 5-2 所示的对话框。在“基本”标签上,指定计算机应在的工作组以及对计算机的简短描述。这步操作是今后在 Windows 系统的网上邻居中所看到的计算机名。
    • 5-2 ( 3 )下面选中图 5-2 中的“安全性”选项卡,打开如图 5-3 所示的对话框。这步操作的目的是允许用户从网络中以什么样的验证方式访问该 Samba 服务器。 ( 4 )管理允许那些用户访问该 Samba 服务器,可以添加、修改、删除用户。
    • ( 5 )添加共享。也就是当局域网中的用户登录到 Samba 服务器后,能够访问那些资源。要添加共享,在图 5-1 对话框的工具条上单击“添加”按钮,打开图 5-6 所示的对话框。 图 5-6 添加共享 在图 5-5 中的“访问”选项卡上,选择是否要只允许指定的用户来访问共享还是允许所有 Samba 用户来访问共享。如果选择了要允许指定用户访问,从可用的 Samba 用户列表中选择这些用户。 当输入或选择完成并确认正确后,单击“确定”按钮,共享就会被立即添加。
    • 5.1.3 启动或停止 Samba 服务 安装并配置完 Samba 服务器后,下一步就是启动 Samba 服务。在通过 Samba 共享目录的服务器上必须运行 smb 服务。 ( 1 )使用以下命令来查看 Samba 守护进程的状态: # /sbin/service smb status ( 2 )使用以下命令来启动守护进程: # /sbin/service smb start ( 3 )使用下面的命令来检验 Samba 服务是否被启动。 # pstree | grep mbd ( 4 )使用以下命令来停止守护进程,即停止 Samba 服务: # /sbin/service smb stop ( 5 )要在引导时启动 smb 服务,使用以下命令: # /sbin/chkconfig --level 345 smb on 这几条命令在终端上的使用及响应结果如图 5-7 所示。
    • 图 5-7 Samba 服务的启动与停止
    • 5.1.4 在 Windows 的网上邻居中访问 Samba 共享 在 Windows 的环境中访问 Samba 共享可有两种方式,一种是通过“开始->搜索计算机”,然后输入 Samba 服务器所在计算机的 IP 地址或计算机名;另一种是通过 Windows 的网上邻居来访问。下面以网上邻居为例来说明其访问过程: ( 1 )在 Windows 的桌面上,单击“网上邻居”图标,打开如图 5-8 所示的对话框。 5-8
    • ( 2 )在图 5-9 中显示了该组中在图 5-2 中所设置计算机的说明。双击图中的计算机图标,弹出需要用户输入的登录 Samba 服务器的用户名和密码,如图 5-9 所示。 图 5-9 进入 Liubing 工作组
    • ( 3 )在图 5-10 中输入在图 5-5 中创建或修改用户所确定的用户名和密码。这里的用户名是“ jly ” 。 图 5-10 输入登录 Samba 服务器的用户名和密码
    • ( 3 )当正确的输入了登录 Samba 服务器的用户名和密码后,单击“确定”按钮就能看到 Samba 服务器所提供的资源了,如图 5-11 所示。 图 5-11 Samba 服务器所共享的资源
    • 5.1.5 Linux 系统中 Samba 服务器的客户端软件  Samba 服务器的资源可在 Samba 管理工具中进行管理。另外,用户还可以在终端上使用下面的命令来检查服务器所共享的资源。 # smbclient –L localhost 图 5-12 检查 Samba 服务器所提供的资源
    • smbclient 命令是 Samba 提供的一个类似 FTP 客户程序的客 Samba 客户程序,用以访问 Windows 共享或 Linux 提供的 Samba 共享。其命令格式为 : smbclient //hostname/sharename -U username 在命令的实际使用过程中,把 hostname 替换为想连接的 Samba 服务器的主机名或 IP 地址,把 sharename 替换为想浏览的共享目录的名称,把 username 替换成系统的 Samba 用户名。输入正确的口令或按“ Enter ” 键(若该用户不要求输入口令)。 需要特别说明的是,当访问 Windows 共享时, Username 参数要使用 Windows 计算机中的用户账号,验证口令是 Windows 计算机中的用户账号的密码;当访问 Linux 系统提供的 Samba 共享时, Username 参数要使用所访问 Linux 系统中的 Samba 服务器所提供的账号,口令也是 Samba 用户的账号口令。
    • 如果看到了 smb:> 提示,就表示已成功地登录了。登录后,键入 help 来获得一个命令列表。如果想浏览主目录的内容,把 sharename 替换成用户名。如果没有使用 -U 选项,当前 Linux 系统的登录用户的用户名就会被传递给 Samba 。 要退出 smbclient ,在 smb:> 提示下键入 exit , 如图 5-12 所示。 图 5-12 通过 smbclient 访问 Samba 服务器
    • 另外,还可以在终端上使用下面的命令来查看 Samba 资源的使用情况。 # smbstatus 可以使用下面的命令来简要显示 Samba 资源的使用情况。 # smbstatus -b 其在终端上的显示结果如图 5-13 所示。  
    • 5.2 NFS 服务器 5.2.1 NFS 概述 NFS 的全称是 Network Files System ,网络文件系统。 NSF 是一种在网络上的机器间共享文件的方法,文件就如同位于客户的本地硬盘驱动器上一样。 Red Hat Linux 既可以是 NFS 服务器也可以是 NFS 客户,这意味着它可以把文件系统导出给其它系统,也可以挂载从其它机器上导入的文件系统。 5.2.2 NFS 服务的启动和停止 要把自己的文件系统共享出去,首先保证自己的机器上启动了 NFS 服务。启动了 NFS 服务就是需要启动一组程序,包括装配服务器和 NFS 协议服务器。可以使用以下命令来启动 NFS 守护进程: # service nfs start
    • 可使用以下命令来查看 NFS 守护进程的当前状态: #service nfs status 可使用以下命令来停止 NFS 守护进程: # service nfs stop 如果修改了 NFS 的配置,可使用以下命令来重新启动国 NFS 的守护进程: #service nfs restart 该命令在终端上的显示结果如图 5-14 所示。
    • 要在引导时启动 nfs 服务,使用以下命令: # chkconfig --level 345 nfs on 5.2.3 NFS 服务器的配置 使从 NFS 服务器中共享文件又称导出目录。在 Linux 系统中可使用 NFS 服务器配置工具来配置 NFS 服务器。要使用 NFS 服务器配置工具,必须运行 X 窗口系统,并要具备根特权,且安装了 redhat-config-nfs RPM 软件包。要启动服务器配置工具,可以有以下两种方式: ( 1 )依次单击面板上的“主菜单系统设置服务器设置 NFS 服务器”打开如图 5-15 所示的对话框。 ( 2 )在终端提示符下键入 redhat-config-nfs 命令,也可打开如图 5-15 所示的对话框。
    • 图 5-15 NFS 服务器配置工具 另外,还要建立一个共享目录,本书中的例子在“ /home ” 目录下建立了一个 PUB 子目录,如图 5-16 所示。
    • 下面来说明通过 NFS 服务器配置工具来共享文件的方法,步骤如下 : ( 1 )要添加 NFS 共享,单击图 5-15 中的“添加”按钮,打开如图 5-16 所示的对话框。 图 5-17 添加 NFS 共享
    • 在图 5-17 中,“基本”活页标签所输入的信息说明: 目录:指定要共享的目录,如 /tmp 。主机: 指定要共享目录的主机。主机所输入的信息可以使用以下格式:         单个机器:一个全限定域名(能够被服务器解析的),主机名(能够被服务器解析的),或 IP 地址。           使用通配符指定的一系列机器:使用“ * ” 或“ ? ” 字符来指定字符串匹配。通配符不能被用在 IP 地址中;如果逆向 DNS 查寻失败了,通配符可能碰巧会奏效。当你在全限定域名中指定通配符时,点( . )不包括在 通配符的匹配项目内。例如: *.example.com 包括 one.example.com ,但不包括 one.two.example.com.          IP 网络: 使用 a.b.c.d/z ,这里的 a.b.c.d 是网络, z 是子网掩码中的位数(如 192.168.0.0/24 )。另一种可以接受的格式是 a.b.c.d/netmask ,这里的 a.b.c.d 是网络, netmask 是子网掩码(如 192.168.100.8/255.255.255.0 )。 N
    •        Netgroups :格式为 @group-name ,这里的 group-name 是 NIS netgroup 的名称。 基本权限:指定目录应该有只读权限还是读写权限。 ( 2 )单击“常规选项”活页标签,打开如图 5-17 所示的对话框。 图 5-17 “ 常规选项”活页标签
    • “ 常规选项”活页标签允许配置以下选项:           允许来自高于 1024 的端口的连接:在号码小于 1024 的端口上启动的服务必须以根用户身份启动。选择这个选项来允许根用户以外的用户来启动 NFS 服务。           允许不安全的文件锁定:不需要锁定请求。          禁用子树检查:如果某文件系统的子目录被导出,但是整个文件系统没有被导出,服务器会检查所请求的文件是否在导出的子目录中。这种检查叫做子树检查( subtree checking )。选择这个选项来禁用子树检查。如果整个文件系统被导出,选择禁用子树检查可以提高传输率           按要求同步写操作:默认被启用,该选项不允许服务器在请求被写入磁盘前回复这些请求。 立即强制同步写操作:不推迟写入磁盘的操作。该选项和 no_wdelay 相对应。
    • ( 3 )单击“用户访问”活页标签,打开如图 5-18 所示的对话框。 图 5-18 “ 用户访问”活页标签
    • 图 5-19 共享文件添加后的 NFS 服务器配置工具 “ 用户访问”活页标签允许配置以下选项:
    •            把远程根用户当作本地根用户:按照默认设置,根用户的用户 ID 和组群 ID 都是 0 。根权限压缩( Root squashing )把用户 ID 0 和组群 ID 0 映射为匿名的用户和组群 ID ,因此客户上的根用户就不会在 NFS 服务器上具备根特权。如果这个选项被选,根用户就不会被映射为匿名用户,客户上的根用户就会对导出的目录拥有根特权。选择这个选项会大大降低系统的安全性。除非绝对必要,请不要选择它。           把所有客户用户当作匿名用户: 如果该选项被选,所有用户和组群 ID 都会被映射为匿名用户。           为匿名用户指定本地用户 ID :如果“把所有客户用户当作匿名用户”被选,这个选项会让为匿名用户指定一个用户 ID 。           为匿名用户指定本地组群 ID :如果“把所有客户用户当作匿名用户”被选,这个选项会让 你为匿名用户指定一个组群 ID 。
    • ( 4 )当确认以上各项都正确输入之后,单击“确定” 按钮。共享添加成功,如图 5-19 所示。 5.2.4 NFS 服务器的状态查询 showmount 命令可用来显示连接到指定 NFS 服务器的所有主机,如不指定 NFS 服务器,默认设置为显示当前主机中 NFS 服务器的信息。命令格式如下: showmount   [NFS 服务器主机地址 ] 另外,还使用该命令来显示 NFS 服务器的输出列表,命令格式如下: showmount –e [NFS 服务器主机地址 ] 还可以使用 -d 参数来不指定 NFS 服务器中已被客户端连接的所有输出目录,以及用 - a 参数显示指定 NFS 服务器的所有客户端主机及其所连接的目录。其命令格式如下: showmount –d [NFS 服务器主机地址 ] showmount –a [NFS 服务器主机地址 ]
    • 5.2.4 NFS 的客户端配置 在 Red Hat Linux 9 中使用 mount 命令可以把网络中 NFS 服务器的共享目录挂载到主机的文件系统中,就象使用本地文件系统中的目录一样使用 NFS 挂载目录,用户不会感觉到有什么不同之处。方法如下: ( 1 )显示 NFS 服务器的输出共享目录:在使用 mount 命令挂载 NFS 服务器的共享目录之前,使用下面的命令先来查询 NFS 服务器中是否允许本机连接相应的共享目录。 # showmoutn –e 211.85.203.22 ( 2 )挂载 NFS 服务器中的共享目录:在确认 NFS 服务器设置正确后,在客户端主机使用 mount 命令来挂载 NFS 服务器的共享目录到本地目录。 mount 命令的格式如下: mount NFS 服务器地址 : 共享目录 本地挂载点目录
    • 特别说明,在 NFS 服务器地址与共享目录之间用“:”隔开,挂载点为本地空目录。本例中采用在“ /mnt ” 目录下建立一个 nfs 子目录,然后把用户在 NFS 服务器上的共享目录挂载到本地的空目录 /mnt/nfs 上。使用命令如下: # mount lbliubing.com:/home/public /mnt/nfs 该命令在终端上的显示结果如图 5-21 所示。 图 5-21 用户使用 NFS 服务器的共享目录
    • ( 3 )当把某个 NFS 服务器的共享目录正确的挂载在本地之后,可使用如下的命令来查询该目录的挂载状态。 # mount | grep nfs ( 4 )当用户不需要在使用某个 NFS 服务器的共享目录时,可使用下面的命令来卸载目录的共享。 # unmount /mnt/nfs 5.3 DHCP 服务器 5.3.1 DHCP 协议 动态主机配置协议( Dynamic Host Configuration Protocol )是用来自动给客户机器分配 TCP/IP 信息的网络协议。每个 DHCP 客户都连接到中央位置的 DHCP 服务器,该服务器会返回包括 IP 地址、子网掩码、网关和 DNS 服务器信息的客户网络配置。
    • 1. DHCP 的工作过程 DHCP 工作时要求客户机和服务器进行交互,由客户机通过广播向服务器发起申请 IP 地址的请求,然后由服务器分配一个 IP 地址以及其他的 TCP/IP 设置信息。整个过程可以分为以下步骤: ( 1 ) IP 地址租用申请 DHCP 客户机的 TCP/IP 首次启动时,就要执行 DHCP 客户程序,以进行 TCP/IP 的设置。由于此时客户机的 TCP/IP 还没有设置完毕,就只能使用广播的方式发送 DHCP 请求信息包,广播包使用 UDP 端口 67 和 68 进行发送,广播信息中包括了客户机的网络界面的硬件地址和计算机名字,以提供 DHCP 服务器进行分配。
    • ( 2 ) IP 地址租用提供 当接收到 DHCP 客户机的广播信息之后,所有的 DHCP 服务器均为这个客户机分配一个合适的 IP 地址,将这些 IP 地址、网络掩码、租用时间等信息,按照 DHCP 客户提供的硬件地址发送回 DHCP 客户机。这个过程中对 DHCP 服务器没有对客户计算机进行限制,因此客户机能收到多个 IP 地址提供信息。 ( 3 ) IP 地址租用选择 由于客户机接收到多个服务器发送的多个 IP 地址提供信息,客户机将选择一个 IP 地址,拒绝其他提供的 IP 地址,以便这些地址能分配给其他客户。客户机将向它选择的服务器发送选择租用信息。
    • ( 4 ) IP 地址租用确认 服务器将收到客户的选择信息,如果也没有例外发生,将回应一个确认信息,将这个 IP 地址真正分配给这个客户机。客户机就能使用这个 IP 地址及相关的 TCP/IP 数据,来设置自己的 TCP/IP 堆栈。 2. IP 地址租约更新。 ( 1 )更新租用 在 DHCP 中,每个 IP 地址是有一定租期的,若租期已到, DHCP 服务器就能够将这个 IP 地址重新分配给其他计算机。 ( 2 )释放 IP 地址租用 客户机可以主动释放自己的 IP 地址请求,也可以不释放,但也不续租,等待租期过期而释放占用的 IP 地址资源。
    • 5.3.2 DHCP 服务器配置 1. DHCP 服务器的安装 在进行 DHCP 服务器配置之前,首先要确认 Linux 系统中已经安装了 DHCP 服务器,可使用下面的命令: # rpm –qa | grep dhcp 如果没有安装,可 Red Hat Linux 9 的第 2 张光盘放入光驱后,输入下面的命令来安装: # rpm ivh dhcp-3.0pl1-23.i386.rpm 2. DHCP 的配置文件
    • 在 Red Hat Linux 9 中, DHCP 服务器的配置文件是: /etc/dhcpd.conf ,但 Red Hat Linux 9 安装后的默认情况下,此文件是不存在的。用户必须手工建立该文件,但在系统在有一个该文件的模板,其所存贮位置是: /usr/share/doc/dhcp-3.0pl1/dhcpd.conf .sample ,把这个文件拷贝到“ /etc ” 目录,并把文件名的后缀改成“ .conf ” 。可使用下面的命令: cp/usr/share/doc/dhcp-3.0pl1/dhcpd.conf.sample /etc/dhcpd.conf 下面通过一个具体的应用来说明如何配置 /etc/dhcpd.conf 文件。该应用的具体要求如下: (1 ) IP 地址的使用范围是: 211. 211.85.203.101 到 211.85.203.200 ( 2 )子网掩码: 255.255.255.0 ( 3 )默认网关是: 211.85.203.254 ( 4 ) DNS 域名服务器的地址是: 211.85.203.22 则 /etc/dhcpd.conf 文件的内容如下所示:
    • ddns-update-style interim; ignore client-updates; subnet 211.85.203.0 netmask 255.255.255.0 { option routers 211.85.203.254; option subnet-mask 255.255.255.0; option nis-domain &quot;liubing.com&quot;; option domain-name &quot;liubing.com&quot;; option domain-name-servers 211.85.203.22; option time-offset -18000; range dynamic-bootp 211.85.203.101 211.85.203.200; default-lease-time 21600; max-lease-time 43200; host ns { hardware ethernet 00:02:A5:9C:25:97; fixed-address 207.175.42.254; } }
    • 在局域网的一个 Windows 客户端的所获得的地址租约结果如图 5-22 所示。 从图 5-22 中可看出,该网卡获得的 IP 地址是 211.85.203.199 。另外,从图中可看出该网的物理地址是: 00:02:A5:9C:25:97 ,如果想把该物理地址对应的网卡固定设为 IP 地址是: 211.85.203.88 ,那么仅需要把上述文件中的 host ns { hardware ethernet 00:02:A5:9C:25:97; fixed-address 207.175.42.254; } 替换为 host ns {
    • hardware ethernet 00:02:A5:9C:25:97; fixed-address 211.85.203.88; } 即可。其 Windows 客户端的所获得的地址租约结果如图 5-23 所示。 图 5-22 Windows 的 DHCP 客户所获得的租约
    • 图 5-23 根据物理地址设定固定 IP 地址
    •    3. DHCP 服务的重新启动 当修改了 /etc/dhcpd.conf 这个 DHCP 服务器的配置文件后,如果想让配置后的功能起作用必须要重新启动 dhcpd 服务。可使用下面的指令 : # # service dhcpd restart 另外,还可以使用下面的命令来停止 dhcpd 服务: # # service dhcpd stop 5.3.3 在 Windows 和 Linux 操作系统中 DHCP 客户端的设 置方法 当 DHCP 服务器配置成功之后,各工作站想使用 DHCP 服务器所提供的资源进行相应的设置。 1. DHCP 的 Windows 客户端设置 下面以 Windows XP 为例来说明其客户端的设置方法:
    • ( 1 )依次单击“开始->控制面板->网络连接->本地连接”,打开图 5-24 。
    • ( 2 )在图 5-24 中单击“属性”按钮,打开“本地连接属性”设置对话框,如图 5-25 所示。
    • ( 3 )在图 5-25 中选择“ Internt 协议( TCP/IP )”后,单击“属性”按钮,打开“ Internet 协议属性”对话框,如图 5-26 所示。
    • ( 4 )在该图中选择“自动获得 IP 地址”,并单击“确定”按钮即完成客户端的设置工作。 当客户端按照这种方式设置完成后,可重新启动客户端计算机,当计算机重启完成之后,在 Windows 的命令行方式使用“ ipconfig /all ” 命令进行验证,命令的响应如图 5-23 和 5-22 所示。看其 IP 地址是不是 DHCP 服务器所设置的 IP 地址范围,某个固定的 MAC 地址是否分配的是特定的 IP 地址。另外有一点要特别说明,如果按照这种方式取得 IP 地址,那么今后在启动各计算机时要先启动 DHCP 服务器,再启动 DHCP 客户端。 2. DHCP 的 Linux 客户端设置 Linux 的 DHCP 客户端的设置与 Window 的设置方法相似,也是在设置 IP 地址时用“自动获取 IP 地址使用”,如图 4-4 所示。
    • Linux 实用教程 刘兵 吴煜煌等编著
    • 第 6 章 Internet 应用服务器的配置 本章学习目标 本章主要讲解 Internet 应用服务器的配置方法,包括 DNS 服务器、 FTP 服务器、 E-mail 服务器。通过对本章的学习,读者应该掌握以下主要内容:
    • 主要内容:
      • DNS 服务器的安装、配置以 DNS 客户端的设置方法
      • FTP 服务器的安装、设置方法。
      • FTP 客户端的常用命令与客户端软件的使用方法。
      • E-mail 邮件的工作原理, Sendmail 服务器的配置与客户端软件的使用方法。
    • 6.1 域名系统( DNS )
      • 1. 概述
      • DNS 用于“名称— IP 地址”
      • 早期用 Hosts 文件 ,但存在一些缺点 .
      • DNS (域名系统)是一种基于分布式的数据库系统,并采用客户 / 服务器模式进行主机名称与 IP 地址之间的转换。
    • 2. DNS 域名结构
      • DNS 数据库的结构如同一棵倒过来的树,它的根位于最顶部
      • 顶级域名常见的有两类:
      • ( 1 )国家级顶级域名。
      • 例如: CN 表示中国; UK 表示英国等等 。
      • ( 2 )通用的顶级域名。
          •            COM :商业机构;
          •           EDU :美国教育机构;
          •           NET :网络管理机构;
          •           ORG :社会团体;
          •           MIL :美国军队部门;
          •           GOV :美国政府部门。
      • 由于 Internet 上用户的急剧增加,现在又增加了七个通用的顶级域名,即:
      • FIRM :表示公司企业;
      • SHOP :表示销售公司和企业;
      • WEB :表示突出万维网络活动的单位;
      • ARTS :表示突出文化、娱乐活动的单位;
      • REC :表示突出消遣、娱乐活动的单位;
      • INFO :表示提供信息服务的单位;
      • NOW :表示个人。
      • 在国家顶级域名下注册的二级域名均由该国家自行确定。我们国家将二级域名划分为“ 类别域名 ”和“ 行政区域名 ”两大类。其中,类别域名 6 个,分别是:
      • AC :表示科研机构;
      • COM :表示工、商、金融等企业;
      • EDU :表示教育机构;
      • GOV :表示政府部门;
      • NET :表示互联网络、接入网络的信息中心和运行中心;
      • ORG :表示各种非赢利性组织。
      • 行政区域名 34 个,适用于我国的省、自治区、直辖市。
      • 例如: bj 为北京市; sh 为上海市; hb 为湖北省等等。
    • 3. DNS 域名解析的工作原理
      • ( 1 ) DNS 客户机提出域名解析请求,并将该请求发送给本地的域名服务器。
      • ( 2 )当本地的域名服务器收到请求后,就先查询本地的缓存,如果有该记录项,则本地的域名服务器就直接把查询的结果返回。
      • ( 3 )如果本地的缓存中没有该记录,则本地域名服务器就直接把请求发给根域名服务器,然后根域名服务器再返回给本地域名服务器一个所查询域(根的子域)的主域名服务器的地址。
      • ( 4 )本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自己的缓存,如果没有该记录,则返回相关的下级的域名服务器的地址。
      • ( 5 )重复第四步,直到找到正确的记录。
      • ( 6 )本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时还将结果返回给客户机。
    • 6.1.2 DNS 服务器的配置
      • 1. DNS 服务器的启动与停止
      • 在进行 DNS 服务器配置之前,首先要检查系统中是否安装了 BIND 域名服务器,检查的方法可使用下面的命令:
      • # rpm –qa | grep bind
      • 可使用下面的命令来对 BIND 域名服务器的进行启动和停止。
      • # service named start
      • # service named stop
      • #service named restart
    • 2. 启动域名服务器的配置工具
      • 启动 Bind 配置工具,可使用以下两种方法:
      • ( 1 )单击面板上的“主菜单->系统设置->服务器设置->域名服务” 。
      • ( 2 )在 shell 提示(如 XTerm 或 GNOME 终端)下,键入 redhat-config-bind 命令。
    • 3. 正向主区块配置
      • 正向主区块配置主要的作用是进行从域名到 IP 地址的转换。其设置步骤如下:
    •  
    •  
    •  
    •  
    • 4. 反向 DNS 服务器的配置
    • 4. 反向 DNS 服务器的配置
    • 6.1.3 在 Windows 中 DNS 客户端的设置方法
    • 6.1.3 在 Windows 中 DNS 客户端的设置方法
    • 6.1.3 在 Linux 中 DNS 客户端的设置方法
    • 3. 测试 DNS 服务器 当 DNS 服务器配置完成之后,要想在客户端对其进行测试,必须首先使用下面的命令来重新启动 DNS 服务器: # service named restart
    • 6.2  文件传输协议服务器( FTP ) 1. FTP 协议概述 FTP 是 TCP/IP 的一种具体应用, FTP 工作在 OSI 模型的第七层, TCP 模型的第四层上,即应用层, FTP 使用的是传输层的 TCP 传输而不是 UDP ,这样 FTP 客户在和服务器建立连接前就要经过一个被广为熟知的“三次握手”的过程,其意义在于客户与服务器之间的连接是可靠的,为数据的传输提供了可靠的保证。
    • 2. 什么是 FTP 协议 FTP 是 TCP/IP 协议族中的一个协议,是英文 File Transfer Protocol 的缩写。该协议定义的是一个在远程计算机系统和本地计算机系统之间传输文件的一个标准,是 Internet 文件传送的基础。
    • 3. FTP 的基本工作原理 ( 1 )打开熟知端口(端口号为 21 ),使客户进程能连接上; ( 2 )等待客户进程发起连接建立请求; ( 3 )启动从属进程来处理客户进程发来的请求。从属进程对客户进程的请求处理完毕后即终止,但从属进程在运行期间根据需要还可能创建其他一些子进程。 ( 4 )回到等待状态,继续接受其他客户进程发来的请求。主进程与从属进程的处理是并发地进行。
    •  
    • 4. FTP 用户授权 FTP 地址如下: ftp:// 用户名:密码 @FTP 服务器 IP 或域名: FTP 命令端口 / 路径 / 文件名 上面的参数除了 FTP 服务器 IP (或域名)为必要项外,其他项都是可有可无的。如以下地址都是有效 FTP 地址: ftp://ftp.whpu.edu.cn ftp://lb:123456@ ftp.whpu.edu.cn ftp:// lb:123456@ ftp.whpu.edu.cn ftp:// lb:123456@ ftp.whpu.edu.cn:2003/soft/demo.doc
    • 互连网中大多数 FTP 服务器都支持“匿名”( Anonymous )登录。这类服务器的目的是向公众提供文件拷贝服务,不要求用户事先在该服务器进行登记注册,也不用取得 FTP 服务器的授权。
    • 5. FTP 的传输模式 ( 1 ) ASCII 传输方式 ( 2 )二进制传输模式
    • 6.2.2 Linux 环境下的 FTP 服务器 1. Wu-ftpd 2. ProFTPD 3. vsftpd
    • 6.2.3 FTP 服务器的启动与配置 1. FTP 服务器的安装与启动 在进行 DNS 服务器配置之前,首先要检查系统中是否安装了 BIND 域名服务器,检查的方法可使用下面的命令: # rpm –qa | grep vsftpd
    • 6.2.3 FTP 服务器的启动与配置 可使用下面的命令来进行 BIND 域名服务器的启动和停止。 # service vsftpd start # service vsftpd stop # service vsftpd restart 下面的命令是用来检查 vsftpd 是否被启动: # pstree | grep vsftpd
    • 2. vsftpd 的默认配置文件 # 是否允许匿名 ftp, 如否则选择 NO anonymous_enable=YES # 是否允许本地用户登录 local_enable=YES # 是否开放本地用户的写权限 write_enable=YES # 设置本地用户的文件的掩码是 022, 默认值是 077 local_umask=022 # 是否允许匿名用户上传文件 #anon_upload_enable=YES # # 是否允许匿名用户创建新的文件夹
    • 2. vsftpd 的默认配置文件 #anon_mkdir_write_enable=YES # # 是否显示目录说明文件 , 默认是 YES 但需要手工创建 .message 文件 dirmessage_enable=YES # # 激活上传下载日志 xferlog_enable=YES # # 启用 FTP 数据端口的连接请求 (ftp-data). connect_from_port_20=YES #
    • 2. vsftpd 的默认配置文件 # 是否改变上传文件的属主 , 如果是需要输入一个系统用户名 , 可以把上传的文件都改成 root 属主 #chown_uploads=YES #chown_username=whoever # # 传输日志的路径和名字默认是 /var/log/vsftpd.log #xferlog_file=/var/log/vsftpd.log # # 是否使用标准的 ftp xferlog 模式 xferlog_std_format=YES # # 设置默认的断开不活跃 session 的时间 #idle_session_timeout=600 #
    • 2. vsftpd 的默认配置文件 # 设置数据传输超时时间 #data_connection_timeout=120 # 运行 vsftpd 需要的非特权系统用户默认是 nobody #nopriv_user=ftpsecure # 是否使用 ascii 码方式上传和下载文件 #ascii_upload_enable=YES #ascii_download_enable=YES # 定制欢迎信息 #ftpd_banner=Welcome to blah FTP service. # # 是否允许禁止匿名用户使用某些邮件地址,如果是,输入禁止的邮件地址的路径和文件名 #deny_email_enable=YES #banned_email_file=/etc/vsftpd.banned_emails #
    • 2. vsftpd 的默认配置文件 # 是否将系统用户限止在自己的 home 目录下 , 如果选择了 yes 那么 chroot_list_file=/etc/vsftpd.chroot_list 中列出的是不 chroot 的用户的列表 #chroot_list_enable=YES #chroot_list_file=/etc/vsftpd.chroot_list # 设置 PAM 认证服务的配置文件名称,该文件存放在 /etc/pam.d/ 目录下 pam_service_name=vsftpd # 由于默认情况下 userlist_deny=YES, 所以 /etc/vsftpd.user_list 文件中 # 所列出的用户不允许访问 vsftpd 服务器。 userlist_enable=YES # 使 vsftpd 处于独立启动模式 listen=YES # 使用 tcp_wrappers 作为主机的访问控制方式 tcp_wrappers=YES
    • 3.        修改 vsftpd 的默认配置 具体的步骤如下: ( 1 )修改 /etc/vsftpd/vsftpd.conf 配置文件,激活以下两项,即在原文件以下两行前的“#”去掉。 anon_upload_enable= YES // 允许匿名用户上传 anon_mkdir_write_enable=YES // 允许匿名用户创建新目录
    • 3.        修改 vsftpd 的默认配置 ( 2 )在原配置文件中添加下面一行,目的是开放匿名用户的浏览权限。 anon_world_readable_only=NO 如果允许匿名用户对服务器上的文件或文件夹有更名或删除操作的权限,还需在配置文件中添加下面一行: anon_other_write_enable=YES
    • 3.        修改 vsftpd 的默认配置 ( 3 )开放本地用户写的权限必须打开。 Write_enable=YES ( 4 )修改完配置文件并存盘后,使用下面的命令重新启动 vsftpd 服务。 # service vsftpd restart ( 5 )修改匿名用户上传目录的权限,匿名用户的默认目录是“ /var/ftp/pub” 。可使用下面的命令修改: # chmod +777 /var/ftp/pub
    • 6.2.4 FTP 客户端的常用命令 1. 与某个 FTP 服务器建立连接
    • 2. 列出 FTP 服务器上的目录 : 在提示符“ ftp> ” 下,执行“ ls ” 或“ dir ” 命令后,屏幕会显示当前目录下的文件或子目录。显示格式与 Linux 命令提示行所显示的某个目录文件方式完全相同。
    • 3. 改变当前目录 在提示符“ ftp> ” 下,执行“ cd ” 或“ pwd ” 命令,可以查看当前目录;执行“ cd.. ” 命令可以进入上一级目录;执行“ cd 子目录名”命令,可以进入子目录,例如,输入“ cd mail ” ,表示进入当前目录下的“ mail ” 子目录。
    • 4. 一般文件传送 ( 1 )下载单个文件 get 命令能从远程计算机上下载一个文件,其命令格式如下: get  源文件名 目标文件名 ( 2 )下载多个文件 mget 命令是从远程计算机取多个文件。命令格式为: mget 源文件列表
    • ( 3 )上传单个文件 将本地计算机的文件传送到远程计算机上,其命令格式为: put  源文件名 目标文件名 ( 4 )上传多个文件 mput 命令可以将本地计算机的多个文件一起送到远程主机。其命令格式为: mput 文件名列表
    • 6.2.5 FTP 客户端软件的配置方法 1. Windows 系统下的 FTP 客户端软件的配置方法
    • 2.        Linux 系统下的 FTP 客户端软件的配置方法
    • 6.3 邮件服务器( E-mail ) 6.3.1 概述 电子邮件( Electronic mail )服务是 Internet 网络为用户提供的一种最基本的、最重要的服务之一。 电子邮件将邮件发送到收信人的邮箱( mail box )中,收信人可随时读取邮件。 电子邮件有非常高的效率。
    • 1 E-mail 的工作原理 在 Internet 网上,一封电子邮件的实际传递过程如下: ( 1 )由发送方计算机(客户机)的邮件管理程序将邮件进行分拆,即把一个大的信息块分成一个个小的信息块,并把些小的信息块封装成传输层协议( TCP 层)下的一个或多个 TCP 邮包(分组)。 ( 2 ) TCP 邮包又按网际层协议( IP 层)要求,拆分成 IP 邮包(分组),并在上面附上目的计算机的地址( IP 地址)。
    • 1 E-mail 的工作原理 ( 3 )根据目的计算机的 IP 地址,确定与哪一台计算机进行联系,与对方建立 TCP 连接。 ( 4 )如果连接成功,便将 IP 邮包送上网络。 IP 邮包在 Internet 的传递过程中,将通过对路径的路由选择,经过许许多多路由器存储转发的复杂传递过程,最后到达接收邮件的目的计算机。 ( 5 )在接收端,电子邮件程序会把 IP 邮包收集起来,取出其中的信息,按照信息的原始次序复原成初始的邮件,最后传送给收信人
    • ( 1 ) SMTP 协议 SMTP ( Simple Mail Transfer Protocol ,简单邮件传输协议)是 Internet 上基于 TCP/IP 应用层的协议,适用于主机之间电子邮件交换。 使用 SMTP 时,收信人可以是和发信人连接在同一个本地网络上的用户,也可以是 Internet 上其它网络的用户,或者是与 Internet 相连但不是 TCP/IP 网络上的用户,
    • ( 2 ) POP3 POP3 ( Post Office Protocol version 3  邮局协议版本 3 )是系统的基本协议之一 允许用户在不同的地点访问服务器上电子邮件,并决定是把电子邮件存放在服务器邮箱上,还是存入在本地邮箱内。
    • ( 3 ) MIME MIME ( Multipurpose Internet Mail Extensions ,称为“多用途 Internet 邮件扩展协议”)是一种编码标准,解决了 SMTP 协议仅能传送 ASCII 码文本的限制 MIME 定义了各种类型的数据,例如,声音、图像、表格、二进制数据等编码格式。
    • 2. E-mail 的地址 完整的电子邮件地址由二部分组成,第一部分为计算机上的邮箱,第二部分为计算机。一种广泛使用的格式是用“ @ ” 隔开二部分,例如: [email_address]
    • 3. E-mail 邮件格式 信息由 ASCII 文本组成,包括两个部分,中间用一个空行分隔。第一部分是一个头部( header ),包括有关发送方、接收方、发送日期和内容格式等等文本;第二部分是正文( body ),包括信息的文本,这部分是让用户自由撰写
    • 3. E-mail 邮件格式
    • 6.3.2 Sendmail 的安装与启动 1. 安装 Sendmail 在 Red Hat Linux 9 的安装光盘中提供了 Sendmail 的 RPM 包,其内容包括: Ø    sendmail : sendmail 服务器 Ø    sendmail-cf :与 sendmail 服务器配置相关的文件和程序 Ø    sendmail-doc : sendmail 服务器的文档
    • 6.3.2 Sendmail 的安装与启动 1. 安装 Sendmail 当不能确定在 Red Hat Linux 9 中是否安装了 sendmail 服务器时,可使用下面的命令来进行测试: # rpm –qa | grep sendmail
    • 6.3.2 Sendmail 的安装与启动 1. 安装 Sendmail 如果在安装 Red Hat Linux 9 时没有安装 sendmail 服务器,可把 Red Hat Linux 9 的安装光盘的第一张放入光驱,并执行如下的命令: # rpm –ivh sendmail-8.12.8-4.i386.rpm 该命令是安装了 sendmail 服务器,另外,还需要安装 sendmail-cf 和 sendmail-doc ,把 Red Hat Linux 9 的安装光盘的第三张放入光驱,并执行如下的命令: # rpm –ivh sendmail-cf-8.12.8-4.i386.rpm # rpm –ivh sendmail-doc-8.12.8-4.i386.rpm
    • 2. 启动 Sendmail
    • 3. 配置 DNS 的 MX 记录 $TTL 86400 @ IN SOA lbliubing.com. root.localhost ( 2 ; serial 28800 ; refresh 7200 ; retry 604800 ; expire 86400 ; ttl ) IN NS lbliubing.com. @ IN MX 1 computer computer IN A 211.85.203.22
    • 6.3.3 Sendmail 的配置 1. Sendmail 配置 Sendmail 配置的步骤如下: ( 1 )单击面板上的“主菜单->系统设置->服务器设置->服务配置”。 ( 2 )在打开的对话框中,选中“ ipop3” 和“ sendmail” 并启动。 ( 3 )修改 Sendmail 的配置文件“ /etc/mail/sendmail.cf” 。将该文件中的行 Cwlocalhost 修改为 Cwcomputer.lbliubing.com lbliubing.com 然后存盘。
    • 6.3.3 Sendmail 的配置 1. Sendmail 配置 ( 4 )修改 Sendmail 的配置文件“ /etc/mail/sendmail.mc” 。将该文件中有以下字符串开头的四行用注释符号“ #” 注释掉。 “ DAE_option” ( 5 )使用下面的命令重新生成配置文件。 # make –C /etc/mail ( 6 )修改 /etc/mail/access 文件,在该文件中加入下面一行: compuer.lbliubing.com Replay
    • 6.3.3 Sendmail 的配置 2. Sendmail 邮件服务器的验证
    • 6.3.4 在 Linux 操作系统中邮件客户端的设置方法
      • 在 Red Hat Linux 9 系统中邮件客户端可以采用以下三种方式:
      • Ø     Evolution 程序;
      • Ø     Mozilla Mail 程序;
      • 基于文本的电子邮件客户
    •  
    •  
    •  
    •  
    •  
    •  
    • 本章小结 本章主要讲解 Internet 应用服务器的配置方法,这些服务器包括 DNS 服务器、 FTP 服务器、 E-mail 服务器。在域名系统一节中首先介绍了什么是 DNS 、 DNS 的域名结构、 DNS 解析的工作过程,然后介绍了在 Linux 下如何进行 DNS 服务器的配置,最后讲解了在 Windows 和 Linux 操作系统下 DNS 客户端的配置方法以及如何来测试 DNS 配置是否正确;在文件传输协议服务器一节中,介绍了 FTP 协议的工作原理、 Linux 中 FTP 服务器的配置方法、 FTP 客户端常用命令的使用方法、在不同系统中 FTP 客户端常用软件的与 FTP 服务器的连接方法;在邮件服务器一节中,介绍了邮件的工作原理、邮件的格式、 Linux 中邮件服务器的安装与配置方法、在不同操作系统中如何使用邮件的客户端软件进行邮件的收发。通过对本章的学习,读者应该熟练掌握这几种服务器的安装、启动、设置方法。
    • Linux 实用教程 刘兵 吴煜煌等编著
    • 第 7 章 Web 应用服务 本章学习目标 本章主要让读者了解有关 Red Hat Linux 上如何安装和设置 Web 服务器、如何使用 Web 的程序设计语言 --PHP 和数据库服务器 --MySQL 。通过对本章的学习,读者应该掌握以下主要内容:
    • 主要内容:
      • Apache 安装、启动与配置
      • Apache 虚拟主机的建立与站点的管理
      • MySQL 服务器的安装与使用方法
      • PHP 程序设计语言
      • PHP 连接 MySQL 数据库的方法
    • 7.1 Apache 服务器 7.1.1 Apache 服务器简介 Apache 服务器一个主要的特点是完全免费,并且完全公开其源代码,由此用户可根据自身的需要去进行相关模块的开发。 Apache 服务器另一个主要的特点是其跨平台性,其可在 UNIX 、 Windows 、 Linux 等多种操作系统上运行。如果需要创建一个每天有数百万人访问的 Web 服务器, Apache 可能是最佳选择。
    • 7.1.2 安装和启动 Apache 服务器 1. 检测与安装 Apache 在 Red Hat Linux 9 中自带了以下两个 Apache2.0 的安装文件: Ø          httpd : Apache 2.0 Ø         httpd-manual : Apache2.0 手册 检测 Linux 系统中是否已经安装了 Apache 服务器可以使用下面的命令: # rpm –qa | grep httpd
    • 7.1.2 安装和启动 Apache 服务器 1. 检测与安装 Apache 如果确认在 Linux 系统中没有安装 Apache ,可将 Red Hat Linux 9 的三张安装光盘的第一张放入光驱,然后执行下面的命令: # rpm –ivh httpd-2.0.40-21.i386.rpm # rpm –ivh httpd-manual-2.0.40-21.i386.rpm
    • 2. Apache 服务器的启动和停止
      • 当安装完 Apache 服务器后,如果想让其提供 Web 服务还必须启动它。下面的命令用来查看 Apache 服务器是否启动:
      • # pstree | grep httpd
      • 可以使用如下命令查看 Apache 服务器的运行状态:
      • # service httpd status
      • 可以使用下面的命令来启动或重新启动 Apache 服务器:
      • # service httpd start
      • # service httpd restart
    • 7.1.3 Apache 服务器的配置
      • 打开 HTTP 配置工具的方法有两种:
      • ( 1 )依次单击“主菜单->系统设置->服务器设置-> HTTP 服务器”。
      • ( 2 )在终端提示中键入 下面的命令。
          • # redhat-config-httpd
    • 7.1.3 Apache 服务器的配置
      • 使用 HTTP 配置工具来配置 Apache HTTP 服务器的一般步骤如下:
      • ( 1 )在“主”标签下配置基本设置。
      • ( 2 )在“虚拟主机”标签下来配置默认设置。
      • ( 3 )在“虚拟主机”标签下,配置默认的虚拟主机。如果要为多个 URL 或虚拟主机提供服务,则添加额外的虚拟主机。
    • 7.1.3 Apache 服务器的配置
      • ( 4 )在“服务器”标签下配置服务器设置。
      • ( 5 )在“调整性能”标签下配置连接设置。
      • ( 6 )把所有必要的文件复制到 DocumentRoot 和 cgi-bin 目录中。
      • ( 7 )保存设置并退出 HTTP 配置工具。
    • 1. 基本设置
      • ( 1 )服务器名称
      • ( 2 )网主电子邮件地址
      • ( 3 )可用地址
      • ( 4 )单击“添加”按钮,用来定义接受请求的其它端口。
    • 2. 默认设置
      • ( 1 )站点配置
      • ( 2 )记录日志
      • ( 3 )环境变量
      • ( 4 )目录
    • 3. 服务器设置
    • 4. 调整性能
    • 7.1.4 配置虚拟主机 虚拟主机是在一台 Web 服务器上为多个单独的域名提供 Web 服务,每个域名具有特定的目录和配置,相当于将一台主机分为多台主机,虚拟主机技术对于主机数量不足,但又想为不同的用户提供独立的 Web 服务的需求非常有效。 Apache 有两种方式支持虚拟主机 : 基于 IP 的虚拟主机 基于名字的虚拟主机。
    • 1. 基于名字的虚拟主机 假设某一学院按照系部或者职能部门组建基于名字的虚拟主机。有一台 Apache 服务器和一个 IP 地址: 211.85.203.22 ,假设有两个单位需要建立网站,一个为办公室网站,域名为 office.lyd.com ,另一个为计算机系网站,域名为 computer.lyd.com
    • ( 1 )基于名称的虚拟主机的 DNS 配置 现在想要创建一个名为 computer.lyd.com 和 office.lyd.com 的虚拟主机,并使用同一个 Apache 服务器 www.lyd.com 。所需要进行的工作仅仅是在提交的 DNS 配置文件中,为 lyd.com 创建如下的别名: office.lyd.com IN CNAME www.lyd.com computer.lyd.com IN CNAME www.lyd.com 或者 office IN CNAME www computer IN CNAME www
    • 在上面的配置中,在提交的 DNS 配置文件以及返回的配置文件中, www.lyd.com 已经具有如下的 A 记录和 PTR 记录,分别为: www IN A 211.85.203.22 1 PTR CNAME www.lyd.com
    • ( 2 )修改配置文件 NameVirtualHost 211.85.203.22   <VirtualHost 211.85.203.22 > ServerName office.lyd.com DocumentRoot /var/www/html/office </VirtualHost>   <VirtualHost 211.85.203.22 > ServerName computer.lyd.com DocumentRoot /var/www/html/computer </VirtualHost>
    • 2. 基于 IP 的虚拟主机 ( 1 )基于 IP 虚拟主机的 DNS 配置 如果用户想要创建二个基于 IP 的虚拟主机, office.lyd.com 、 computer.lyd.com 。这二个虚拟主机站点的共同域名是 lyd.com 。用户可以按照如下所示在 DNS 配置文件中进行配置: computer IN A 211.85.203.2 office IN A 211.85.203.1 另外,还需要在 DNS 的配置文件中添加以下的 PTR 记录: 1 IN PTR office.lyd.com 2 IN PTR computer.lyd.com
    • ( 2 )修改配置文件 <VirtualHost 211.85.203.2> ServerAdmin computer@lyd.com DocumentRoot /var/www/html/computer ServerName computer.lyd.com ErrorLog /var/www/html/computer/logs/error_log TransferLog /var/www/html/computer/logs/access_log </VirtualHost>
    • ( 2 )修改配置文件 <VirtualHost 211.85.203.1> ServerAdmin office@lyd.com DocumentRoot /var/www/html/office ServerName office.lyd.com ErrorLog /var/www/html/office/logs/error_log TransferLog /var/www/html/office/logs/access_log </VirtualHost>
    • 7.2 数据库服务器 My SQL 1. 什么是 MySQL MySQL 是一个多用户、多线程的 SQL 数据库,是一个客户机 / 服务器结构的应用,它由一个服务器守护程序 mysqld 和很多不同的客户程序和库组成。 MySQL 主要的目标是快速、稳定和容易使用。
    • 2. MySQL 的主要特点
      • 使用核心线程的完全多线程。
      • 有多种编程接口( API )
      • 支持不同的平台, MySQL 几乎提供了现存的所有操作系统的对应版本。
      • 支持多种字段类型
      • 一个非常灵活且安全的权限和口令系统,并且允许基于主机的认证。
    • 7.2.2 安装和启动 MySQL
      • 1. 安装
      • 当无法确认 Red Hat Linux 9 系统中是否安装了 MySQL ,可以使用下面的命令来确认:
      • # rpm – qa | grep mysql
      • 如果确认没有安装 MySQL ,在 Red Hat Linux 9 的第 2 张安装光盘中提供了 MySQL 的 RPM 安装包,这些安装 RPM 包有:
        • mysql-2.23.54a-11.i386.rpm
        • mysql-server-2.23.54a-11.i386.rpm
        • mysql-devel-2.23.54a-11.i386.rpm
    • 在使用 MySQL 数据库之前,必须要先启动 MySQL 服务,可以通过以下两个命令来启动该服务: ( 1 )使用命令: # service mysqld start ( 2 )使用命令: # /etc/init.d/mysqld start 另外,可以通过下面的命令来检查 MySQL 是否被启动。 # service mysqld status 或者 # pstree | grep mysqld
    • ( 11 )防火墙配置: 若要重新启动 MySQL 服务,可使用如下命令之一: # service mysqld restart # /etc/init.d/mysqld restart 如果需要停止服务,可使用下面的命令之一: # service mysqld stop # /etc/init.d/mysqld stop # mysqladmin shutdown
    • 7.2.3 MySQL 基本操作 1. 连接与断开 MySQL 服务器 当使用 mysql 命令来连接 MySQL 服务器时,通常需要提供一个 MySQL 用户名和密码。如果 MySQL 服务器运行在不是用户所登录的计算机上时,还将需要指定主机名。连接 MySQL 服务器的语句格式如下: # mysql -h host -u user -p Enter password: ********
    • 7.2.3 MySQL 基本操作 1. 连接与断开 MySQL 服务器 , 调用 mysql 命令与该服务器连接,命令格式如下: # mysql 如果成功地连接后,用户可以在“ mysql>” 提示符下输入 QUIT 随时断开:(也可以键入 control-D 断开 ) 。 mysql> QUIT Bye
    • 2. 数据库的创建与删除 创建该数据库可使用下面的命令: mysql> CREATE DATABASE lbuser; 把新创建的数据库作为当前数据库,命令如下: mysql> USE lbuser; Database changed 当用户的数据库建立成功之后,可以使用下面的命令来查看数据库是否建成: mysql> show databases; 当建立的数据库没有用时,可使用下面的命令来删除它: mysql> DROP DATABASE lbuser;
    •  
    • 3. 数据表的创建与删除 使用下面的命令 CREATE TABLE 语句来创建数据表: mysql> CREATE TABLE user (ID int primary key,name VARCHAR(20) not null, -> password VARCHAR(20), -> sex VARCHAR(2),email VARCHAR(50), -> birthday DATE, city VARCHAR(20);
    • 3. 数据表的创建与删除 使用 SHOW TABLES 命令来查看在数据库是不是真的建立了 user 数据表: mysql> SHOW TABLES; DESCRIBE 语句命令来显示 user 表的字段结构: mysql> DESCRIBE user;
    • 4. 数据记录的增加、删除与修改 在 MySQL 中可使用 LOAD DATA 和 INSERT 语句来增加数据记录。 其中, LOAD DATA 语句可允许用户一次增加多条记录。但在使用该语句之前,必须首先创建一个文本文件“ user.txt ” , 其格式如下 : 1 liubing 12345 男 [email_address] 1968-04-03 武汉 2 lyd 12345 女 [email_address] N 武汉 可使用下面的命令来装载文本文件“ user.txt ” 到 user 表中: mysql> LOAD DATA LOCAL INFILE &quot;user.txt&quot; INTO TABLE user;
    • 另一种向数据表中增加记录的方法是用 INSERT 语句 , 下面的命令是使用 INSERT 语句增加一条新记录: mysql> INSERT INTO user -> VALUES (3, ‘jiangli’, ‘12345’, ‘ 女 ’ , ‘lb@whpu.edu.cn’, ‘1972-10-18’, ‘ 武汉 ’ ); 用户可以使用下面的命令来显示 user 表中的所有数据记录信息。 mysql> SELECT * FROM user;
    • 下面这条指令删除数据表中的所有记录: mysql> DELETE FROM user; 删除在数据表 user 中新增加的“ ID=2” 的数据记录,语句如下: mysql> DELETE FROM user WHERE ID=2; 要修改 user 数据表中的用户名为 liubing 的用户密码,可使用下面的语句: mysql> UPDATE user SET password = &quot;567890&quot; WHERE ID=1;
    • 5. 数据表记录的查询 mysql> SELECT * FROM user WHERE sex= “ 男 ” ; mysql> SELECT * FROM user WHERE sex= &quot; 男 &quot; and ID<100; mysql> SELECT name,birthday,sex FROM user WHERE sex= &quot; 男 &quot; ORDER BY birthday DESC; mysql> SELECT * FROM user WHERE name LIKE &quot;j%&quot;; mysql> SELECT sex, COUNT(*) FROM user GROUP BY sex;
    • 7.2.4 MySQL 数据库的用户权限 1. 用户权限概述 MySQL 权限系统的主要功能是控制某个用户是否能够连接到指定的 MySQL 数据库,以及控制该用户是否具有在一个数据库中进行查询( select )、增加( insert )、更新( update )和删除( delete )的权限。
    • 2. 建立初始的 MySQL 权限 为 root 用户增加口令: # mysql -u root mysql mysql> UPDATE user SET Password=PASSWORD('new_password') WHERE user='root'; mysql> FLUSH PRIVILEGES;
    • 删除匿名用户可使用下面的命令: # mysql –u root –pcrq mysql mysql> DELETE from user WHERE user=' ';
    • 7.2.5 MySQL 数据库的备份与恢复 1. 使用 mysqldump 备份和拷贝数据库 mysqldump 语句的命令格式如下: # mysqldump [OPTIONS] database [tables] 例如,把数据库 lbuser 备份到 /home/lb 目录。可使用如下命令: # cd /var/lib/mysql # mysqldump –u root –pcrq –opt lbuser > /home/lb/lbuser040403.sql
    • 2. 使用直接拷贝数据库的备份和拷贝方法 下列命令给出如何将整个 lbuser 数据库备份到 /home/lb :   # cd /var/lib/mysql # cp -r lbuser /home/lb/ lbuser040403
    • 7.3 Web 程序设计语言( PHP ) 7.3.1 PHP 简介 PHP 是一种服务器内置式的 Script 语言,它的出现使得在 UNIX 上快速地开发动态 Web 网页成为现实, PHP 代表的是超文本预处理器。 PHP3 大量采用了 C 、 Java 和 Perl 语言的语法,并加入了各种 PHP 的特征。它与 JavaScript 等语言的一个区别就是 PHP3 是在服务器端执行,客户机所看到的是其在服务器上运行的结果 . PHP 支持面向对象的编程,即 PHP 提供了类和对象,同时 PHP 还支持构造器、提取类等。基于 Web 的编程工作非常需要面向对象编程能力。
    • 7.3.2 PHP 的基础―― HTML 语言 1. HTML 语言的结构 HTML (超文本标记语言)是一种描述文档结构的标注语言,它使用一些约定的标记对 WWW 上的各种信息进行标注。 HTML 文件是标准的 ASCII 文件,且其后缀名为 htm 或 html 的文件。 HTML 文件看起来像是加入了许多被称为链接签( tag )的特殊字符串的普通文本文件。
    • <HTML> <HEAD> <TITLE> 武汉工业学院 </TITLE> </HEAD> <BODY bgcolor= yellow> <P> 这是一 HTML 的测试文件 </P> </BODY> </HTML>
    • 链接签的格式为: < 起始链接签 属性名=属性值 > 内容 < 结束链接签 > 元素名也叫链接签名。需要注意的是: ( 1 )“ < ” 和起始链接签之间不能有空格。 ( 2 )元素名称不区分大小写。 ( 3 )一个元素可以有多个属性,属性及其属性值不区分大小写,且各个属性用空格分开。
    • 2. 超文本链接指针 ( 1 )统一资源定位器 URL 在互连网上同样找一个文件,除了要知道以上内容之外,显然还需要知道该文件存放在哪个网络的哪台主机中才行。 一个 URL 包括了以上所有的信息。它的构成如下: protocol : // machine.name[:port] / directory / filename
    • ( 2 )建立一个链接 在 HTML 文件中用链接指针指向一个目标。其基本格式为: <a href = &quot;…&quot;> zzz </a> 例如: <a href = &quot;http://www.whpu.edu.cn/&quot;> 武汉工业学院 </a>
    • 3. 表单的应用 ( 1 )什么是表单 HTML 提供的表单是用来将用户所输入的数据从客户端浏览器传递给 Web 服务器的。 PHP 程序是在服务器端工作,并且通过服务器端的编译,动态地送出 HTML 文件给客户端, PHP 程序负责处理 HTML 文件与运行在服务器端的程序之间的数据交换。
    •  
    • ( 2 )表单的标记 < FORM ACTION = “…” METHOD=”…” > … </FORM> ( 3 ) HTML 中的 INPUT 标记 <INPUT TYPE=“…” VALUE =“…”> TYPE = “ TEXT ” 表示在表单中使用单行文本框 = “ PASSWORD ” 表示在表单中为用户提供密码输入框 = “ RADIO ” 表示在表单中使用单选按钮 = “ CHECKBOX ” 表示在表单中使用多选按钮 = “ SUBMIT ” 表示在表单中使用提交按钮 = “ RESET ” 表示在表单中使用重置按钮
    • <HTML> 2 <HEAD> 3 <TITLE> 这是个测试页 </TITLE> 4 </HEAD> 5 <BODY> 6 <form action= “ reg.php ” method=POST> 7 请输入您的真实姓名 : <input type=text name= 姓名 ><br> 8 您的主页的网址 : <input type=text name= 网址 value=http://><br> 9 密码 : <input type=password name= 密码 ><br> 10 <input type=submit value=&quot; 发送 &quot;><input type=reset value=&quot; 重设 &quot;> 11 </form> 12       </BODY> 13       </HTML>
    • 7.3.3 PHP 语法简介 1. PHP 的一个简单程序 <html> <head> <title> 第一个 PHP 程序 </title> </head> <body> <?php echo &quot;hello, world &quot;; ?> </body> </html>
    • 2. 程序注释 “ // ” 符号是对单行进行注释; “ /* …… */ ” 可对多行语句进行注释。 <?php echo &quot; 这是第一种例子。 &quot;; // 本例是 C++ 语法的单行注释 /* 本例采用多行的 注释方式 */ echo &quot; 这是第两种例子。 &quot;; echo &quot; 这是第三种例子。 &quot;; # 本例使用 UNIX Shell 语法注释 ?>
    • 3. PHP 程序中的变量 ( 1 )变量类型 PHP 的变量类型不多,有以下五种: string 、 integer 、 double 、 array 和 object 。 以下为变量的使用范例: $universty = &quot; 武汉工业学院 &quot;; // 字符串变量 $int1 = 38; // 数字型变量 $MyArray1 = array(&quot;lb&quot;, &quot;jl&quot;, &quot;lyd&quot;, &quot;lx&quot;); // 数组变量
    • ( 2 )变量的使用 PHP 程序中的变量使用范围分为全局变量与局部变量。 可以透过 $GLOBALS[“ 变量名称 ” ] 将需要的全局变量取出。
    • 4. PHP 中的表单变量 next.php 在执行时,系统会自动产生两个变量 $username 及 $sex ,可直接使用。 <form action=next.php method=post> 姓名 : <input type=text name=&quot;username&quot;><br> 性别 : <input type=text name=&quot;sex&quot;><br> <input type=submit> </form>
    • 5. PHP 运算符 ( 1 )算术运算 加法运算(+)、 减法运算 (-)、乘法运算(*)、除法运算( / )、取余数( % )、累加(++)和递减(――)。 ( 2 )字符串运算 <?php $a = &quot;PHP 4&quot;; $b = &quot; 功能强大 &quot;; echo $a.&quot;: &quot;.$b; ?>
    • ( 3 )位运算 PHP 的位运算 (bitwise operators) 共有六个:与( & )、或( | )、异或( ^ )、向左移位( << )、向右移位( >> )、取 1 的补( ~ )。 ( 4 )逻辑运算 逻辑运算 (logical operators) 通常用来测试真假值。小于( < )、大于( > )、小于等于( <= )、大于等于( >= )、等于 ( == )、不等于( != )、与( and )、或( || )、异或 ( xor )、非( ! )。
    • 6. 流程控制 ( 1 ) if 条件语句 If (expr) { code_block1 } else { code_block2 }
    • ( 2 ) switch 语句 switch ( 表达式 ) { case 值 1 : code_block1 break; case 值 2 : code_block2 break; case 值 3 : code_block3 break; … default : code_blockn }
    • ( 2 )循环语句 ① for 语句 for 语句用来产生一段程序循环,其语法格式如下: for ( init; test; incre) { code_block }
    • ② while 语句 while (expr) { code_block; } ③ do…while 语句 do{ code_block } while (expr) ;
    • <HTML> <HEAD> <TITLE>text</TITLE> </HEAD> <BODY> <?php for($i=1;$i<7;$i++){ echo &quot;<font size=&quot;.$i.&quot;>hello<br>&quot;; } ?> </BODY> </HTML>
    • 7.3.4 PHP 连接 MySQL 的方法 ( 1 )与 MySQL 服务器建立连接。 ( 2 )选择准备操作和使用的指定数据库。 ( 3 )发出 SQL 命令。用一个函数向 MySQL 服务器发出 SQL 的查询指令语句字符串。发出的字符串可以是 SQL 的任何 DML 查询指令,包括 INSERT 、 DELETE 等,但是要取得数据应使用 SQL 查询语句―― SELECT 。查询函数会返回一个查询结果指针。 ( 4 )取得结果。上一个步骤返回的是查询的结果指针,用这个指针值就可以从查询结果中,返回特定的数据。通常会返回一笔记录,返回的类型为数组或对象。 ( 5 )关闭链接,关闭与数据库的链接。
    • 1. 与 MySQL 的连接与关闭 int mysql_connect(hostname : port , username , password) <?php $username='root'; $passwd=''; //MySQL 初始安装时, root 用户的密码为空 // 连接数据库 $link_mess=mysql_connect('localhost',$username,$passwd); // 显示数据库连接的返回信息 if (!$link_mess){ echo &quot; 对不起,与 MySQL 服务器连接失败! &quot;; exit(); } else { echo &quot; 已经成功地与 MySQL 服务器连接 &quot;; } ?>
    • 当要关闭 MySQL 连接时,可以使用 mysql_close() 函数。当关闭成功会返回“ True ” ,否则返回“ Flase ” 。语法如下:     mysql_close( 变量 )
    • 2. 数据库的选择 mysql_select_db() 主要是选取所要使用的数据库,如果能成功选取数据库则返回“ True ” ,若找不到数据库或选取失败则返回“ False ” 。语法如下: mysql_select_db( 数据库名称 )
    • <HTML> <HEAD> <TITLE> 数据库的选择 </TITLE> </HEAD> <BODY> <?php $myconn=mysql_connect(&quot;localhost&quot;,&quot;root&quot;,&quot;&quot;); if (mysql_select_db(&quot;lbuser&quot;)){ echo &quot;lbuser 数据库已被选取 &quot; ; } else { echo &quot;lbuser 数据库选取不成功 &quot;; } ?> </BODY> </HTML>
    • 3. 发送 SQL 命令    在读取数据库中的数据表之前,先要用 Mysql_query() 函数来将 SQL 命令传给 MySQL 来处理。该函数的语法如下:      mysql_query(SQL 命令或变量 , 链接指针 )    读取数据表可使用 Mysql_fetch_field() 函数,该函数的语法如下:      Mysql_fetch_field( 数据查询结果 )
    • <HTML> <HEAD> <TITLE> 数据库的选择 </TITLE> </HEAD> <BODY> <?php Mysql_connect(&quot;localhost&quot;,&quot;root&quot;,&quot;&quot;); Mysql_select_db(&quot;lbuser&quot;); $SQL_String=&quot;Select * from user&quot;;    $Exec=Mysql_query($SQL_String);    If($field=Mysql_fetch_field($Exec))      { echo &quot; 标题名称: $field->name <br>&quot;; echo &quot; 所属数据表: $field->table <br>&quot;; echo &quot; 数据类型: $field->type <br>&quot;; echo &quot; 字段最大长度: $field->max_length <br>&quot;; } else { echo &quot; 没有相关信息 &quot;; } ?> </BODY>
    • 4. 取得数据     下面的示例是在数据表中读取三条记录,并把读取结果的两个字段在浏览器中显示。
    • <HTML> <HEAD> <TITLE> 从数据库中取打开的当前记录 </TITLE> </HEAD> <BODY> <?php $dbname='lbuser'; $dbtable='user'; $myconn=mysql_connect(&quot;localhost&quot;,&quot;root&quot;,&quot;&quot;); mysql_select_db(&quot;lbuser&quot;); $SQL_String=&quot;Select * from user order by id &quot;; $Exec=mysql_query($SQL_String,$myconn); mysql_close($myconn); for ($i=1;$i<4;$i++){ $record=mysql_fetch_row($Exec); echo &quot;user : &quot;;
    • echo $record[1]; echo &quot;<br>&quot;; echo &quot;&quot;; echo $record[2]; echo &quot;<br>&quot;; echo &quot;<br>&quot;; } ?> </BODY> </HTML>
    • 本章小结 本章主要讲解在 Linux 操作系统中如何架设与 Web 应用相关的服务器及程序设计语言,主要包括: Apache 服务器、数据库服务器 MySQL 、 Web 程序设计语言( PHP )。在 Apache 服务器一节中着重介绍了 Apache 服务器的安装与启动方法、 Apache 服务器的配置方法;在数据库服务器一节中,着重介绍了 MySQL 的启动与安装方法、如何建立数据库、如何新建一个数据表、如何对数据表中的记录进行添加、删除、修改,如何设置数据库的存取权限、如何对数据库进行备份;在 Web 程序设计语言一节中,对 PHP 的语法、与M ySQL 数据库的连接方法都做了十分详细的说明。通过对本章的学习,读者应该熟练掌握以下 Apache 服务器地安装、启动与配置方法、 MySQL 服务器的安装与使用方法、PH P 程序设计语言 .
    • 第 8 章 网络安全 本章学习目标 通过对本章的学习,读者应该掌握以下主要内容:  计算机网络安全的基本概念及 Linux 系统安全      防火墙技术基本知识      用 iptales 实现包过滤型防火墙
    • 8.1 计算机网络安全基础知识 8.1.1 网络安全的含义 网络安全从其本质上来讲就是网络上的信息安全,其所涉及的领域相当广泛。这是因为在目前的公用通信网络中存在着各种各样的安全漏洞和威胁。从广义来说,凡是涉及到网络上信息的保密性、完整性、可用性、真实性和可控性的相关技术和理论,都是网络安全所要研究的领域。下面给出网络安全的一个通用定义: 网络安全是指网络系统的硬件、软件及其系统中的数据受到保护,不受偶然的或者恶意的原因而遭到破坏、更改、泄露,系统连续可靠正常地运行,网络服务不中断。 因此,网络安全在不同的环境和应用中会得到不同的解释。 ( 1 )运行系统安全,即保证信息处理和传输系统的安全。包括计算机系统机房环境的保护,法律、政策的保护,计算机结构设计上的安全性考虑,硬件系统的可靠安全运行,计算机操作系统和应用软件的安全,数据库系统的安全,电磁信息泄露的防护等。它侧重于保证系统正常的运行,避免因为系统的崩溃和损坏而对系统存储、处理和传输的信息造成破坏和损失,避免由与电磁泄漏,产生信息泄露,干扰他人(或受他人干扰),本质上是保护系统的合法操作和正常运行。
    • ( 2 )网络上系统信息的安全。包括用户口令鉴别、用户存取权限控制、数据存取权限、方式控制、安全审计、安全问题跟踪、计算机病毒防治、数据加密等。 ( 3 )网络上信息传播的安全,即信息传播后的安全。包括信息过滤等。它侧重于防止和控制非法、有害的信息进行传播后的后果。避免公用通信网络上大量自由传输的信息失控。它本质上是维护道德、法律或国家利益。 ( 4 )网络上信息内容的安全,即讨论的狭义的“信息安全”。它侧重于保护信息的保密性、真实性和完整性。避免攻击者利用系统的安全漏洞进行窃听、冒充和诈骗等有损于合法用户的行为。它本质上是保护用户的利益和隐私。 计算机网络安全的含义是通过各种计算机、网络、密码技术和信息安全技术,保护在公用通信网络中传输、交换和存储信息的机密性、完整性和真实性,并对信息的传播及内容具有控制能力。网络安全的结构层次包括:物理安全、安全控制和安全服务。 可见,计算机网络安全主要是从保护网络用户的角度来进行的,是针对攻击和破译等人为因素所造成的对网络安全的威胁。而不涉及网络可靠性、信息的可控性、可用性和互操作性等领域。
    • 8.1.2 网络安全的特征 网络安全应具有以下四个方面的特征: ( 1 )保密性是指信息不泄露给非授权的用户、实体或过程,或供其利用的特性。 ( 2 )完整性是指数据未经授权不能进行改变的特性,即信息在存储或传输过程中保持不被修改、不被破坏和丢失的特性。 ( 3 )可用性是指可被授权实体访问并按需求使用的特性,即当需要时应能存取所需的信息。网络环境下拒绝服务、破坏网络和有关系统的正常运行等都属于对可用性的攻击。 ( 4 )可控性是指对信息的传播及内容具有控制能力。 8.1.3 对网络安全的威胁 与网络连通性相关的有三种不同类型的安全威胁: ( 1 )非授权访问( Unauthorized Access )指一个非授权用户的入侵。 ( 2 )信息泄露( Disclosure of Information )指造成将有价值的和高度机密的信息暴露给无权访问该信息的人的所有问题。 ( 3 )拒绝服务( Denial of Service )指使系统难以或不能继续执行任务的所有问题。
    • 8.1.4 网络安全的关键技术 从广义上讲,计算机网络安全技术主要有: ( 1 )主机安全技术: ( 2 )身份认证技术: ( 3 )访问控制技术: ( 4 )密码技术: ( 5 )防火墙技术: ( 6 )安全审计技术: ( 7 )安全管理技术: 8.1.5 Linux 系统的网络安全策略 1 .简介
    • 随着 Internet / Intranet 网络的日益普及,采用 Linux 网络操作系统作为服务器的用户也越来越多,这一方面是因为 Linux 是开放源代码的免费正版软件,另一方面也是因为较之微软的 Windows NT 网络操作系统而言, Linux 系统具有更好的稳定性、效率性和安全性。在 Internet / Intranet 的大量应用中,网络本身的安全面临着重大的挑战,随之而来的信息安全问题也日益突出。以美国为例,据美国联邦调查局( FBI )公布的统计数据,美国每年因网络安全问题所造成的经济损失高达 75 亿美元,而全球平均每 20 秒钟就发生一起 Internet 计算机黑客侵入事件。一般认为,计算机网络系统的安全威胁主要来自黑客攻击和计算机病毒 2 个方面。那么黑客攻击为什么能够经常得逞呢?主要原因是很多人,尤其是很多网络管理员没有起码的网络安全防范意识,没有针对所用的网络操作系统,采取有效的安全策略和安全机制,给黑客以可乘之机。 由于网络操作系统是用于管理计算机网络中的各种软硬件资源,实现资源共享,并为整个网络中的用户提供服务,保证网络系统正常运行的一种系统软件。如何确保网络操作系统的安全,是网络安全的根本所在。只有网络操作系统安全可靠,才能保证整个网络的安全。因此,详细分析 Linux 系统的安全机制,找出可能存在的安全隐患,给出相应的安全策略和保护措施是十分必要的。
    • 2 . Linux 网络操作系统的基本安全机制 Linux 网络操作系统提供了用户帐号、文件系统权限和系统日志文件等基本安全机制,如果这些安全机制配置不当,就会使系统存在一定的安全隐患。因此,网络系统管理员必须小心地设置这些安全机制。 ( 1 ) Linux 系统的用户帐号 ( 2 ) Linux 的文件系统权限 ( 3 )合理利用 Linux 的日志文件 3 . Linux 网络系统可能受到的攻击和安全防范策略 Linux 操作系统是一种公开源码的操作系统,因此比较容易受到来自底层的攻击,系统管理员一定要有安全防范意识,对系统采取一定的安全措施,这样才能提高 Linux 系统的安全性。对于系统管理员来讲特别是要搞清楚对 Linux 网络系统可能的攻击方法,并采取必要的措施保护系统。 ( 1 ) Linux 网络系统可能受到的攻击类型 “ 拒绝服务”攻击 、 “口令破解”攻击 、 “欺骗用户”攻击、 “ 扫描程序和网络监听”攻击 。
    • ( 2 ) Linux 网络安全防范策略 仔细设置每个内部用户的权限 、 确保用户口令文件 /etc/shadow 的安全 、 加强对系统运行的监控和记录 、合理划分子网和设置防火墙 、定期对 Linux 网络进行安全检查 、制定适当的数据备份计划确保系统万无一失 。 4 .加强对 Linux 网络服务器的管理,合理使用各种工具 ( 1 )利用记录工具,记录对 Linux 系统的访问 ( 2 )慎用 Telnet 服务 ( 3 )合理设置 NFS 服务和 NIS 服务 ( 4 )小心配置 FTP 服务 ( 5 )合理设置 POP-3 和 Sendmail 等电子邮件服务 ( 6 )加强对 WWW 服务器的管理,提供安全的 WWW 服务 ( 7 )最好禁止提供 finger 服务
    • 8.1.6 Linux 网络安全工具 1 . sudo sudo 是系统管理员用来允许某些用户以 root 身份运行部分 / 全部系统命令的程序。一个明显的用途是增强了站点的安全性,如果用户需要每天以 root 身份做一些日常工作,经常执行固定的几个只有 root 身份才能执行的命令,那么用 sudo 是非常适合的。 下面以 Redhat 9.0 为例,介绍 sudo 的安装及设置过程: 一般情况下, Redhat 9.0 中都已经缺省安装了当前较新的版本 sudo-1.6.6-3 。如果你的系统中没有安装,你能从下面的地址中下载 for Redhat Linux 的 rpm package 。 ftp://ftp. rediris . es /sites/ftp. redhat .com/pub/ redhat / linux /9/en/ os /i386/ RedHat /RPMS/ sudo -1.6.6-3.i386.rpm 执行 #rpm -ivh sudo* 进行安装,然后用 /usr/sbin/visudo 编辑 /etc/sudoers 文件。 sudoers 这个文件是由一个选择性的主机别名 (host alias) 节区,一个选择性的指令别名 (command alias) 节区以及使用者说明 (user specification) 节区所组成的。所有的指令别名或主机别名必须需以自己的关键字作为开始 (Host_Alias/Cmnd_Alias) 。
    • 使用者说明节区格式: 使用者 接取群组  [:  接取群组  ]... 接取群组  ::=  主机象征  = [op] 指令象征  [,[op] 指令象征 ]... 主机象征  ::=  一个小写的主机名称或主机别名。 指令象征  ::=  一个指令或指令别名。 op ::=  逻辑的  '!'  否定运算元。 主机别名节区格式: Host_Alias  主机别名  =  主机列表  Host_Alias ::=  这是一个关键字。 主机别名  ::=  一个大写的别名。 主机列表  ::=  以逗号间隔的一些主机名称。 指令别名节区格式: Cmnd_Alias  指令别名  =  指令列表 Cmnd_Alias ::=  这是一个关键字。 指令别名  ::=  一个大写的别名。 指令列表  ::=  以逗号间隔的一些指令。
    • 所有在“ #” 符号后面的文字都会被当作是注解。 太长的行可以使用倒斜线“ ” 字符来分成新的行。保留的别名“ ALL” 在“ {Host,Cmnd}_Alias” 里都可以使用。不要用“ ALL” 来定义一个别名,这个别名无效。注意到“ ALL” 暗示全部的主机和指令。 可以使用这个语法从整个范围中减掉一些项目: user  host=ALL,!ALIAS1,!/etc/halt...  2 . Sniffit sniffit 是一个有名的网络端口探测器,可以配置它在后台运行,以检测哪些 TCP/IP 端口上用户的输入 / 输出信息。最常用的功能是可以用它来检测系统的 23(telnet) 和 110(pop3) 端口上的数据传送以轻松得到系统的登录口令和 mail 帐号密码,当然, sniffit 基本上是被破坏者所利用的工具。 sniffit 的主页在 http://reptile.rug.ac.be/~coder/ sniffit / sniffit .html 用户能从那里下载最新的版本,用户在根目录运行: #tar xvfz sniff*
    • 解开所有文件到对应目录后,先仔细阅读其中的 README.FIRST 文件,可能有些版本需要预先进行编译才能使用。用户能运行 sniffit -i 以交互式图形界面查看所有在指定网络接口上的输入 / 输出信息。例如:为了得到所有用户通过某接口 a.b.c.d 接收邮件时所输入的 pop3 帐号和密码,用户能运行: #sniffit -p 110 -t a.b.c.d & #sniffit -p 110 -s a.b.c.d & 记录文件放在目录 /usr/doc/sniffit* 下面: log file 根据访问者的 IP 地址,随机用高端端口号和用来检测的网络接口 IP 地址和检测端口来命名。它利用了 TCP/IP 协议天生的虚弱性,因为普通的 telnet 和 pop3 所传的用户名和密码信息都是明文,不带任何方式的加密。 因此对 telnet/ftp ,可以用 ssh/scp 来替代。 sniffit 检测到的 ssh/scp 信息基本上是一堆乱码,因此不需要担心 ssh 所传送的用户名和口令信息会被第三方所窃取。 3 、 nmap nmap 是用来对一个比较大的网络进行端口扫描的工具,它能检测该服务器有哪些 TCP/IP 端口目前正处于打开状态。可以运行它来确保已经禁止掉不该打开的不安全的端口号。 nmap 的主页在 http://www.insecure.org/ nmap /index.html
    • 8.2 防火墙技术 8.2.1 什么是防火墙 防火墙是指设置在不同网络(如可信任的企业内部网和不可信的公共网)或网络安全域之间的一系列部件的组合,是不同网络或网络安全域之间信息的唯一出入口,能根据企业的安全政策控制(允许、拒绝、监测)出入网络的信息流,且本身具有较强的抗攻击能力。防火墙是提供信息安全服务,实现网络和信息安全的基础设施。 在逻辑上,防火墙是一个分离器,一个限制器,也是一个分析器,有效地监控了内部网和 Internet 之间的任何活动,保证了内部网络的安全,如图 8-1 。 图 8-1 防火墙逻辑位置示意图
    • 使用防火墙地作用如下: (1) 防火墙是网络安全的屏障 (2) 防火墙可以强化网络安全策略 (3) 对网络存取和访问进行监控审计 (4) 防止内部信息的外泄 8.2.2 防火墙的三种类型 1 .数据包过滤型防火墙 数据包过滤 (Packet Filtering) 技术是在网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制表 (Access Control Table) 。通过检查数据流中每个数据包的源地址、目的地址、所用的端口号、协议状态等因素,或它们的组合来确定是否允许该数据包通过。数据包过滤防火墙逻辑简单,价格便宜,易于安装和使用,网络性能和透明性好,通常安装在路由器上。路由器是内部网络与 Internet 连接必不可少的设备,因此,在原有网络上增加这样的防火墙几乎不需要任何额外的费用。
    • 数据包过滤防火墙有两个主要缺点:一是非法访问一旦突破防火墙,即可对主机上的软件和配置漏洞进行攻击;二是数据包的源地址、目的地址以及 IP 的端口号都在数据包的头部,很有可能被窃听或假冒。 2 .应用级网关型防火墙 应用级网关 (Application Level Gateways) 是在网络应用层上建立协议过滤和转发功能。 它针对特定的网络应用服务协议使用指定的数据过滤逻辑,并在过滤的同时,对数据包进行必要的分析、登记和统计,形成报告。应用级网关型防火墙的工作流程示意图请见图 8-2 。 图 8-2 应用级网关型防火墙的工作流程 数据包过滤和应用网关防火墙有一个共同的特点,就是仅仅依靠特定的逻辑判定是否允许数据包通过。一旦满足逻辑,则防火墙内外的计算机系统建立直接联系,防火墙外部的用户便有可能直接了解防火墙内部的网络结构和运行状态,这有利于实施非法访问和攻击。
    • 3 .代理服务型防火墙 代理服务 (Proxy Service) 也称链路级网关或 TCP 通道 (Circuit Level Gateways or TCP Tunnels) , 也有人将它归于应用级网关一类。代理服务是针对数据包过滤和应用网关技术存在的缺点而引入的防火墙技术, 其特点是将所有跨越防火墙的网络通信链路分为两段。防火墙内外计算机系统间应用层的“链接”, 由两个终止代理服务器上的“链接”来实现,外部计算机的网络链路只能到达代理服务器, 从而起到了隔离防火墙内外计算机系统的作用。此外,代理服务也对过往的数据包进行分析、注册登记, 形成报告,同时当发现被攻击迹象时会向网络管理员发出警报,并保留攻击痕迹。使用代理服务型防火墙的网络结构示意图请见图 8-3 。 图 8-3 代理服务型防火墙的网络结构
    • 8.2.3 防火墙体系结构 1 .双重宿主主机体系结构 双重宿主主机体系结构围绕双重宿主主机构筑。双重宿主主机至少有两个网络接口。这样的主机可以充当与这些接口相连的网络之间的路由器;能够从一个网络到另外一个网络发送 IP 数据包。然而双重宿主主机的防火墙体系结构禁止这种发送。因此 IP 数据包并不是从一个网络(如外部网络)直接发送到另一个网络(如内部网络)。外部网络能与双重宿主主机通信,内部网络也能与双重宿主主机通信。但是外部网络与内部网络不能直接通信,它们之间的通信必须经过双重宿主主机的过滤和控制。如图 8-4 。 图 8-4 双重宿主主机体系结构
    • 2 .被屏蔽主机体系结构 双重宿主主机体系结构防火墙没有使用路由器。而被屏蔽主机体系结构防火墙则使用一个路由器把内部网络和外部网络隔离开,如图 8-5 。在这种体系结构中,主要的安全由数据包过滤提供(例如,数据包过滤用于防止人们绕过代理服务器直接相连)。 图 8-5 被屏蔽主机体系结构 这种体系结构涉及到堡垒主机。堡垒主机是因特网上的主机能连接到的唯一内部网络上的主机。任何外部的系统要访问内部的系统或服务都必须先连接到这台主机。因此堡垒主机要保持更高等级的主机安全。
    • 3 .被屏蔽子网体系结构 被屏蔽子网体系结构添加额外的安全层到被屏蔽主机体系结构,即通过添加周边网络更进一步的把内部网络和外部网络(通常是 Internet )隔离开。 被屏蔽子网体系结构的最简单的形式为,两个屏蔽路由器,每一个都连接到周边网。一个位于周边网与内部网络之间,另一个位于周边网与外部网络(通常为 Internet )之间。这样就在内部网络与外部网络之间形成了一个“隔离带”。为了侵入用这种体系结构构筑的内部网络,侵袭者必须通过两个路由器。即使侵袭者侵入堡垒主机,他将仍然必须通过内部路由器。如图 8-6 。 图 8-6 被屏蔽子网体系结构
    • 8.2.4 包过滤技术 包过滤 (Packet Filter) 技术是在网络层中对数据包实施有选择的通过。根据系统内事先设定的过滤逻辑,检查数据流中每个数据包后,根据数据包的源地址、目的地址、 TCP/UDP 源端口号、 TCP/UDP 目的端口号及数据包头中的各种标志位等因素来确定是否允许数据包通过,其核心是安全策略即过滤算法的设计。 例如,用于特定的因特网服务的服务器驻留在特定的端口号的事实(如 TCP 端口 23 用于 Telnet 连接),使包过滤器可以通过简单的规定适当的端口号来达到阻止或允许一定类型的连接的目的,并可进一步组成一套数据包过滤规则。 包过滤技术作为防火墙的应用有三类:一是路由设备在完成路由选择和数据转发之外 , 同时进行包过滤,这是目前较常用的方式;二是在工作站上使用软件进行包过滤 , 这种方式价格较贵;三是在一种称为屏蔽路由器的路由设备上启动包过滤功能。
    • 8.3 使用 Linux 架构包过滤防火墙 8.3.1 包过滤型防火墙的一般概念 1 .什么是包过滤 包过滤就是用一个软件查看所流经的数据包的包头 (header) ,由此决定整个数据包是否允许通过。它可能会决定丢弃 (DROP) 这个包,可能会接受 (ACCEPT) 这个包 ( 让这个包通过 ) ,也可能执行其他更复杂的动作。 在 Linux 系统下,包过滤功能是内建于核心的 ( 作为一个核心模块,或者直接内建 ) ,同时还有一些可以运用于数据包之上的技巧,不过最常用的依然是查看包头以决定是否允许通过。 2 .包过滤防火墙的工作层次 包过滤防火墙示意图如图 8-7 所示。包过滤是一种内置于 Linux 内核路由功能之上的防火墙类型,其防火墙工作在网络层。
    • 图 8-7 包过滤防火墙示意图 3 .包过滤防火墙的工作原理 (1) 使用过滤器。数据包过滤用在内部主机和外部主机之间,过滤系统是一台路由器或是一台主机。过滤系统根据过滤规则来决定是否让数据包通过。如图 8-8 所示,用于过滤数据包的路由器被称为过滤路由器。 应用层 数据 应用层 物理层 数据链路层 网络层 传输层 应用层 物理层 数据链路层 网络层 传输层 数据 应用层 应用层
    • 图 8-8 用过滤路由器过滤数据包
      • 数据包过滤是通过对数据包的 IP 头和 TCP 或 UDP 头的检查来实现的,主要信息有:
        • IP 源地址
        • IP 目的地址
        • 协议 (TCP 包、 UDP 包和 ICMP 包 )
        • TCP 或 UDP 包的源端口
        • TCP 或 UDP 包的目的端口
        • ICMP 消息类型
        • TCP 包头中的 ACK 位
        • 数据包到达的端口
        • 数据包送出的端口
      • (2) 过滤器的实现。数据包过滤一般使用过滤路由器来实现,这种路由器与普通的路由器有所不同。
      • 普通的路由器只检查数据包的目的地址,并选择一个达到目的地址的最佳路径。它处理数据包是以目的地址为基础的,存在着两种可能性:若路由器可以找到一条路径到达目的地址则发送出去;若路由器不知道如何发送数据包则发送一个“数据不可达”的数据包给发送者。
      • 过滤路由器会进一步地检查数据包,除了决定是否有到达目的地址的路径外,还要决定是否应该发送数据包,“应该与否”是由路由器的过滤策略决定并强行执行的。路由器的过滤策略主要有:
        • 拒绝来自某主机或某网段的所有连接。
        • 允许来自某主机或某网段的所有连接。
        • 拒绝来自某主机或某网段的指定端口的连接。
        • 允许来自某主机或某网段的指定端口的连接。
        • 拒绝本地主机或本地网络与其他主机或其他网络的所有连接。
        • 允许本地主机或本地网络与其他主机或其他网络的所有连接。
        • 拒绝本地主机或本地网络与其他主机或其他网络的指定端口的连接。
        • 允许本地主机或本地网络与其他主机或其他网络的指定端口的连接。
      4 、包过滤器操作的基本过程 下面给出包过滤器的操作流程图,如图 8-9 所示。 图 8-9 包过滤操作流程图 存储包过滤规则 分析包报头字段 IP 、 UDP 、 TCP 应用下一个包规则 包规则是否允许传输 包规则是否阻止传输 是否是最后一个包规则 否 是 否 否 允许包 阻止包 是 是
    • 8.3.2 Netfilter/iptables 简介 1 . Linux 下的包过滤防火墙管理工具
      • 从 1 . 1 内核开始, Linux 就已经具有包过滤功能了,随着 Linux 内核版本的不断升级 Linux 下的包过滤系统经历了如下 3 个阶段:
        • 在 2.0 的内核中,采用 ipfwadm 来操作内核包过滤规则。
        • 在 2.2 的内核中,采用 ipchains 来控制内核包过滤规则。
        • 在 2.4 的内核中,采用一个全新的内核包过滤管理工具—— iptables 。
      现在最新 Linux 内核版本是 2.4.1 ,在 2.4 内核中不再使用 ipchains ,而是采用一个全新的内核包过滤管理工具 --iptables 。这个全新的内核包过滤工具将使用户更易于理解其工作原理,更容易被使用,当然也将具有更为强大的功能。 iptables 作为一个管理内核包过滤的工具, iptables 可以加入、插入或删除核心包过滤表格 ( 链 ) 中的规则。实际上真正来执行这些过滤规则的是 Netfilter(Linux 核心中一个通用架构 ) 及其相关模块 ( 如 iptables 模块和 nat 模块等 ) 。
    • 2 . Netfilter 的工作原理 Netfilter 是 Linux 核心中的一个通用架构,它提供了一系列的“表” (tables) ,每个表由若干“链” (chains) 组成,而每条链中可以有一条或数条规则 (rule) 组成。因此,可以理解 netfilter 是表的容器,表是链的容器,而链又是规则的容器,如图 8-10 所示。 图 8-10 Netfilter 总体结构 系统缺省的表为“ filter ” ,该表中包含了 INPUT 、 FORWARD 和 OUTPUT 3 个链。每一条链中可以有一条或数条规则,每一条规则都是这样定义的“如果数据包头符合这样的条件,就这样处理这个数据包”。当一个数据包到达一个链时,系统就会从第一条规则开始检查,看是否符合该规则所定义的条件:如果满足,系统将根据该条规则所定义的方法处理该数据包;如果不满足则继续检查下一条规则。最后,如果该数据包不符合该链中所有规则的话,系统就会根据该链预先定义的策略 (policy) 来处理该数据包。
    • 数据包在 filter 表中的流程如图 8-11 所示。有数据包进入系统时,系统首先根据路由表决定将数据包发给哪一条链,则可能有三种情况: 图 8-11 数据包在 Filter 表中的流程图 ( 1 )如果数据包的目的地址是本机,则系统将数据包送往 INPUT 链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没通过规则检查,系统就会将这个包丢弃; ( 2 )如果数据包的目的地址不是本机,也就是说,这个包将被转发,则系统将数据包送往 FORWARD 链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没通过规则检查,系统就会将这个包丢掉; ( 3 )如果数据包是由本地系统进程产生的,则系统将其送往 OUTPUT 链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没通过规则检查,系统就会将这个包丢掉。 路由选择 FORWARD 链 INPUT 链 OUTPUT 链 本地处理进程 入站包 出站包
    • Red Hat linux 9 使用 2.4 版本地内核,并且内核的编译选项中包含对 Netfilter 地支持,同时 iptables 软件包是默认安装的,所以可以直接使用。 另外,为了完成转发功能,必须打开系统内核的 IP 转发功能,使 Linux 变成路由器。 在 Red Hat 中有两种方法: (1) 修改内核变量 ip_forward 。 # echo “1”>/proc/sys/net/ipv4/ip_forward (2) 修改脚本 /etc/sysconfig/network 。 将 FORWARD_IPV4=false 改为 FORWARD_IPV4=true 3 . iptables 语法 iptables 的语法通常可以简化为下面的形式: iptables [-t table] CMD [chain] [rule-matcher] [-j target]
    • iptables 工具的调用语法如下: ( 1 )对链的操作 ( 2 )对规则的操作 ( 3 )指定源地址和目的地址 ( 4 )指定协议 ( 5 )指定网络接口 ( 6 )指定 IP 碎片 ( 7 )指定非 ( 8 ) TCP 匹配扩展 ( 9 ) mac 匹配扩展 ( 10 ) limit 匹配扩展 ( 11 ) LOG 目标扩展 ( 12 ) REJECT 目标扩展
    • 4 、 iptables 与 ipchains 的区别
        • iptables 的缺省链的名称从小写换成大写,并且意义不再相同: INPUT 和 OUTPUT 分别放置对目的地址是本机以及本机发出的数据包的过滤规则。
        • -i 选项现在只代表输入网络接口,输入网络接口则使用 -o 选项。
        • TCP 和 UDP 端口现在需要用 --source-port 或 --sport (或 --destination-port/--dport )选项拼写出来并且必须置于“ -p tcp ” 或“ -p udp ” 选项之后,因为分别是载入 TCP 和 UDP 扩展的。
        • 以前 TCP 的“ -y ” 标志现在改为“ — syn ” ,并且必须置于“ -p tcp ” 之后。
        • 原来的 DENY 目标最后改为了 DROP 。
        • 可以在列表显示单个链的同时将其清空。
        • 可以在清空内建链的同时将策略计数器清零。
        • 列表显示链时可显示计数器的当前瞬时值。
        • REJECT 和 LOG 现在变成了扩展目标,即意味着成为独立的内核模块。
        • 链名可以长达 31 个字符。
        • MASQ 现在改为 MASQUERADE ,并且使用不同的语法。 REDIRECT 保留原名称,但也改变了所使用的语法。
    • 8.3.3 包过滤防火墙配置实例 1 .网络结构 本节要为如图 8-12 所示的网络结构建立一个包过滤防火墙。 这个网络结构假设内部网有有效的 Internet 地址。为了将内部网段 192.168.80.0/24 与 Internet 隔离,在内部网络和 Internet 之间使用了包过滤防火墙。防火墙的内网接口是 eth1 ( 198.168.80.254 ),防火墙的 Internet 接口是 eth0 ( 198.199.37.254 )。另外,内网中有 3 台服务器对外提供服务。 图 8-12 包过滤防火墙结构图
    • WWW 服务器: IP 地址为 198.168.80.251 FTP 服务器: IP 地址为 198.168.80.252 E_mail 服务器: IP 地址为 198.168.80.253 2 .防火墙的建立过程 本例主要是对内部的各种服务器提供保护。下面采用编辑并执行可执行脚本的方法建立此防火墙。具体过程如下: ( 1 )在 /etc/rc.d/ 目录下用 touch 命令建立空的脚本文件,执行 chmod 命令添加可执行权限。 # touch /etc/rc.d/filter-firewall # chmod u+x /etc/rc.d/filter-firewall ( 2 )编辑 /etc/rc.d/rc.local 文件,在末尾加上 /etc/rc.d/filter-firewall 以确保开机时能自动执行该脚本。 # echo “/etc/rc.d/filter-firewall” >>/etc/rc.d/rc.local ( 3 )使用文本编辑器编辑 /etc/rc.d/filter-firewall 文件,插入如下内容 :
    • # !/bin/bash # 在屏幕上显示信息 echo “Starting iptables rules…” # 开启内核转发功能 echo “1” >/proc/sys/net/ipv4/ip_forward ########################################################################## # 定义变量 IPT=/sbin/iptables WWW-SERVER=198.168.80.251 FTP-SERVER=198.168.80.252 EMAIL-SERVER=198.168.80.253 IP_RANGE=“198.168.80.0/24” ########################################################################## # 刷新所有的链的规则 $IPT –F ########################################################################## # 首先禁止转发任何包,然后再一步步设置允许通过的包 # 所以首先设置防火墙 FORWARD 链的策略为 DROP $IPT –P FORWARD DROP ########################################################################## # 下面设置关于服务器的包过滤规则
    • # 由于服务器 / 客户机交互是双向的,所以不仅仅要设置数据包 # 出去的规则,还要设置数据包返回的规则 # # 1 、下面建立针对来自 Internet 数据包的过滤规则 # # ( 1 ) WWW 服务 # 服务端口为 80 ,采用 tcp 或 utp 协议 # 规则为: eth0=> 允许目的为内部网 WWW 服务器的包 $IPT –A FORWORD –p tcp –d $WWW-SERVER –dport www –i eth0 –j ACCEPT # # ( 2 ) FTP 服务 # 服务端口为:命令端口 21 ,数据端口 20 # FTP 服务采用 tcp 协议 # 规则为: eth0=> 允许目的为内部网 FTP 服务器的包 $IPT –A FORWORD –p tcp –d $FTP-SERVER –dport ftp –i eth0 –j ACCEPT # # ( 3 ) EMAIL 服务 # 包含两个协议,一个是 smtp ,另一个是 pop3 # 出于安全性考虑,通常只提供对内的 pop3 服务 # 所以在这里我们只考虑针对 smtp 的安全性问题
    • # smtp 端口 25 ,采用 tcp 协议 # 规则为: eth0=> 允许目的为内部网 E_mail 服务器的 smtp 请求 $IPT –A FORWORD –p tcp –d $EMAIL-SERVER –dport smtp –i eth0 –j ACCEPT # # 2 、下面设置针对 Intranet 客户的过滤规则 # 本例中防火墙位于网关的位置,所以主要是防止来自 Internet 的攻击 # 不能防止来自 Intranet 的攻击 # 假如网络中的服务器都是基于 Linux 的,也可以在每一部服务器上设置 # 相关的过滤规则来防止来自 Intranet 的攻击 # 对于 Internet 对 Intranet 客户的返回包,定义如下规则 # # ( 1 )允许 Intranet 客户采用被动模式访问 Internet 的 FTP 服务器 $IPT –A FORWORD –p tcp –s 0/0 –sport ftp-data –d $IP_RANGE –i eth0 –j ACCEPT # # ( 2 )接受来自 Internet 的非连接请求 tcp 包 $IPT –A FORWORD –p tcp –d 198.168.80.0/24 ! –syn –i eth0 –j ACCEPT # # ( 3 )接受所有 udp 包,主要是针对 oicq 等使用 udp 的服务 $IPT –A FORWORD –p utp –d 198.168.80.0/24 –i eth0 –j ACCEPT #
    • # 3 、然后接受来自整个 Intranet 的数据包过滤,定义如下规则 $IPT –A FORWORD –s 198.168.80.0/24 –i eth0 –j ACCEPT # ########################################################################## # 处理 IP 碎片 # 接受所有的 IP 碎片,但采用 limit 匹配扩展对其单位时间可以通过的 # IP 碎片数量进行限制,以防止 IP 碎片攻击 $IPT –A FORWORD –f –m limit --limit 100/s --limit –burst 100 –j ACCEPT # 说明:对不管来自哪里的 IP 碎片都进行限制,允许每秒通过 100 个 IP 碎片 # 该限制触发的条件是 100 个 IP 碎片 # ########################################################################## # 设置 icmp 包过滤 # icmp 包通常用于网络测试等,故允许所有的 icmp 包通过 # 但是黑客常常采用 icmp 进行攻击,如 ping of death 等 # 所以我们采用 limit 匹配扩展加以限制 $IPT –A FORWORD –p icmp –m limit --limit 1/s --limit –burst 100 –j ACCEPT # 说明:对不管来自哪里的 icmp 包都进行限制,允许每秒通过一个包 # 该限制触发的条件是 10 个包 #########################################################################
    • ( 4 )执行脚本,使之立刻生效 # /etc/rc.d/filter-firewall 通过执行上面的脚本,建立了一个相对完整的防火墙。该防火墙只对外开放了有限的几个端口,同时提供了客户对 Internet 的无缝访问,并且对 IP 碎片攻击和 icmp 的 ping of death 提供了有效的防护手段。 本章小结
    • 第 9 章 Linux 程序设计基础 本章学习目标 通过对本章的学习,读者应该掌握以下主要内容:           Linux 编程风格           Linux 下 IDE 的使用           Linux 下使用 GNU cc 开发应用程序           Linux 程序的调试           Linux 下使用 RCS/CVS 来管理源程序           Linux 下软件打包
    • 9.1 概述 9.1.1 Linux 编程 Linux 软件开发一直在 Internet 环境下讲行。这个环境是全球性的,编程人员来自世界各地。只要能够访问 Web 站点,就可以启动一个以 Linux 为基础的软件项目。 Linux 开发工作经常是在 Linux 用户决定共同完成一个项目时开始的。当开发工作完成后,该软件就被放到 Internet 站点上,任何用户都可以访问和下载它。由于这个活跃的开发环境,新的以 Linux 为基础的软件功能日益强大,而且呈现爆炸式的增长态势。 大多数 Linux 软件是经过自由软件基金会( Free Software Foundation )提供的 GNU ( GNU 即 GNU’s not UNIX )公开认证授权的,因而通常被称作 GNU 软件。 GNU 软件免费提供给用户使用,并被证明是非常可靠和高效的。许多流行的 Linux 实用程序如 C 编译器、 shell 和编辑器都是 GNU 软件应用程序。
    • Linux 程序需要首先转化为低级机器语言即所谓的二进制代码以后,才能被操作系统执行。例如编程时,先用普通的编程语言生成一系列指令,这些指令可被翻译为适当的可执行应用程序的二进制代码。这个翻译过程可由解释器一步步来完成,或者也可以立即由编译器明确地完成。 shell 编程语言如 BASH 、 TCSH 、 GAWK 、 Perl 、 Tcl 和 Tk 都利用自己的解释器。用这些语言编制的程序尽管是应用程序文件,但可以直接运行。编译器则不同,它将生成一个独立的二进制代码文件然后才可以运行。
    • 9.1.2 Linux 编程风格 ( 1 )函数返回类型说明和函数名分两行放置,函数起始字符和函数开头左花括号放到最左边。 ( 2 )尽量不要让两个不同优先级的操作符出现在相同的对齐方式中,应该附加额外的括号使得代码缩进可以表示出嵌套。 ( 3 )按照如下方式排版 do-while 语句: ( 4 )每个程序都应该以一段简短的说明其功能的注释开头。 ( 5 )请为每个函数书写注释,说明函数是做什么的,需要哪些入口参数,参数可能值的含义和用途。如果用了非常见的、非标准的东西,或者可能导致函数不能工作的任何可能的值,应该进行特殊说明。如果存在重要的返回值,也需要说明。 ( 6 )不要声明多个变量时跨行,每一行都以一个新的声明开头。 ( 7 )当一个 if 中嵌套了另一个 if-else 时,应用花括号把 if-else 括起来。 ( 8 )要在同一个声明中同时说明结构标识和变量或者结构标识和类型定义 (typedef) 。先定义变量,再使用。 1 . GNU 风格
    • ( 9 )尽量避免在 if 的条件中进行赋值。 ( 10 )请在名字中使用下划线以分割单词,尽量使用小写;把大写字母留给宏和枚举常量,以及根据统一惯例使用的前缀。例如,应该使用类似 ignore_space_change_flag 的名字;不要使用类似 iCantReadThis 的名字。 ( 11 )用于表明一个命令行选项是否给出的变量应该在选项含义的说明之后,而不是选项字符之后被命名。 2 . Linux 内核编程风格 ( 1 ) Linux 内核缩进风格是 8 个字符。 ( 2 ) Linux 内核风格采用 K&R 标准,将开始的大括号放在一行的最后,而将结束的大括号放在一行的第一位。 ( 3 )命名尽量简洁。不应该使用诸如 ThisVariableIsATemporaryCounter 之类的名字。应该命名为 tmp ,这样容易书写,也不难理解。但是命名全局变量,就应该用描述性命名方式,例如应该命名“ count_active_users()” ,而不是“ cntusr()” 。本地变量应该避免过长。
    • ( 4 )函数最好短小精悍,一般来说不要让函数的参数多于10个,否则应该尝试分解这个过于复杂的函数。 ( 5 )通常情况,注释说明代码的功能,而不是其实现原理。避免把注释插到函数体内,而写到函数前面,说明其功能,如果这个函数的确很复杂,其中需要有部分注释,可以写些简短的注释来说明那些重要的部分,但是不能过多。 9.2 IDE 使用 9.2.1 VIM 编辑器 1 . VIM 的简介 VI 是 Linux 世界里最常用的全屏编辑器,所有的 Linux 机器都提供该编辑器,而 Linux 里提供的是 VI 的加强版—— VIM ,但同 VI 是完全兼容。 VI 的原意是“ visual interface ” ,即可视编辑器,用户键入的内容会立即被显示出来、而且其强大的编辑功能可以同任何一种最新的编辑器相媲美。它在 Linux 上的地位就仿佛 Edit 程序在 DOS 上一样。它可以执行输出、删除、查找、替换、块操作等众多文本操作,而且用户可以根据需要对其进行定制,这是其他编辑程序所没有的。 VI 不是一个排版程序,不象 Word 或 WPS 那样可以对字体、格式、段落等其他属性进行编排,它只是一个文本编辑程序。
    • 2 . VIM 的基本观念
      • VIM 有三种操作方式,分别是:
        • 命令方式
        • 插入方式
        • 命令行方式
      3 . VIM 的进入与离开 在系统提示符“ $” 下键入命令 VIM ,后面跟上想要编辑(或者建立)的文件名, VIM 可以自动载入所要编辑的文件或是开启一个新文件。 VIM 的退出,可以在命令行方式下使用命令“ :wq” 或者“ :q !”,前者的功能是写文件并从 VIM 中退出,后者的功能是从 VIM 中退出,但不保存所作的修改(注意冒号)。
    • 4 . VIM 的命令方式 ( 1 )光标移动 要对正文内容进行修改,必须先把光标移动到要修改的内容所在的位置,用户除了通过按键盘的上、下、左、右箭头键来移动光标,还可以利用 VIM 提供的众多字符组合键,在正文中移动光标,迅速达到指定的行或列,实现定位,常用的快捷键有:表 9-1 ( 2 )替换和删除 将光标定位于文档中指定位置后,可以用其他字符替换光标所指向的字符,或从当前光标位置删除一个或多个字符,常用命令有:表 9-2 ( 3 )粘贴和复制 在 VIM 编辑器中,与 Windows 系统不同的是从正文中删除的内容(如字符、字段或行)并没有真正丢失,而是被剪贴并复制到了一个内存缓冲区中,用户可将其粘贴到正文中的任意位置,完成这一操作的命令是:表 9-3
    • ( 4 )查找字符串 为了方便文档的编辑, VIM 提供了强大的字符串查找功能,要查找文件中指定字符或字段出现的位置,可以用该功能直接进行搜索,搜索方法是:在命令行键入字符“ /” ,后面加上要搜索的字符串,然后按回车键,编辑程序将执行正向搜索(从光标所在的位置向文件末尾方向),并在找到指定字符串后,将光标停在该字符串的开头;键入 n 命令可以继续执行搜索,找出这一字符串下次出现的位置,用字符“ ?” 取代“ /” ,可以实现反向搜索(从光标所在的位置向文件开头方向),举例说明如下:表 9-5 ( 5 )撤销和重复 在编辑文档的过程中,可以取消错误的编辑命令造成的后果,另外,如果用户希望在新的光标位置再次执行先前的编辑命令,可用重复命令。表 9-6
    • 5 . VIM 的插入方式 ( 1 )进入插入方式 在命令方式下正确定位光标之后,可用一下命令切换到插入方式:表 9-7 如果用户想利用已有的文件内容,可以使用命令“: i filename ” ,则 VIM 将指定文件的内容输入当前光标的下一行,且 VIM 仍处于命令方式。 ( 2 )退出插入方式 退出插入方式的方法是,按 ESC 键或组合键 Ctrl+I ( 3 )正文替换 除了几种简单的切换到插入方式的方法外,还有一些命令允许用户在插入模式之前首先删去一段文字,从而实现正文的替换,这些命令包括:表 9-8 6 . VIM 的命令方式 ( 1 )行号与文件 编辑中文档的每一行正文都有隐藏的行号,用下列命令可以移动光标到指定行:表 9-9
    • 在命令方式下,用户可以规定命令操作的行号范围,数值用来指定绝对行号;字符“ , ”表示光标所在行的行号;字符“ $ ” 表示正文最后一行的行号,示例如下:表 9-10 在命令方式下,用户还可以对文件进行操作,允许从文件中读取正文,或将正文写入文件,常用命令如下:表 9-11 9.2.1 VIM 编辑器 1 . emacs 的简介 emacs 文本编辑器可以用来编辑文本、剪辑和粘贴文本内容、提供个人日历和日记,阅读 Usenet 新闻、发送电子邮件,同时还是一种程序语言解释器,可以编辑 C 、 Lisp 、 Tev 源代码文件、以及 Linux 的 Shell 。 emacs 是由 Richard Stallman 发明的,这位发明者还创建了自由软件基金会( Free Software Foundation ,简称 FSF )。最初的 emacs 是用来编辑宏命令的,现已进一步扩充为 UNIX 用户中装机用户数量最大、功能最齐全的免费文本编辑器了。
    • emacs 同 VI 不一样,没有编辑状态和指令状态之分,其最重要的概念是其独特的缓冲区, emacs 编辑的所有文件都是放在缓冲区中的, emacs 支持同时编辑多个缓冲区,可以将一个文件在多个缓冲区中打开不同的拷贝,甚至其所有的在线帮助和文档以及出错信息都是作为一个缓冲区来显示的,当然这些缓冲区是不可写的,用户可以在这些缓冲区之间拷贝和粘贴文本。并且一般所有的缓冲区在硬盘上都有一个以“ #” 开头的备份文件,这样在系统突然崩溃的时候可以即时将用户的工作进行备份。 在编辑文件时,如果用户在编辑一些特殊类型的文件,例如当用户编辑扩展名为 .c 的 C 语言文件时, emacs 会产生菜单选项 c ,向用户提供一些针对编辑 c 程序特别有用的一些命令。当用户编辑扩展名为 .txt 的文件则会多出菜单选项 tex ,让用户在编辑完 tex 文件后可以即时地观看输出并打印。首先介绍一下几个常见的键盘操作符号的意义:所有的 emacs 的操作键都是由 Control 键(一般是键盘上的 Ctrl 键)和 META 键(一般是键盘上的 Alt 键)加上一些键的组合组成的,如果没有 Alt 键,则可以用输入一个 Esc ,再输入相应的键来代替。例如: Ø         C-x :表示同时按住 Ctrl 键和 x 键。 Ø         C x :表示先按住 Ctrl 键,然后释放它,再按下 x 键。 Ø         M-x :表示同时按住 Alt 键和 x 键。 Ø         M x :表示先按住 Alt 键,释放它,再按下 x 键。
    • 2 . emacs 的启动和退出 emacs 可以用两种方法启动。第一种启动 emacs 的方法是不装载任何文本文件启动 emacs ,输入以下命令行: # emacs 在屏幕上会出现无任何文本 emacs 编辑窗口,如图 9-2 所示。 如果用户是初学者,最好的学习方法是:按下 Ctrl-h 键(即按住 Ctrl 键后不放,再按下 h 字母键),就会自动进入 emacs 的联机帮助,在屏幕底部 emacs 命令行中会出现一个提示符,这时再按下字母键 t 和回车键,便进入了简捷有效的 emacs 文本编辑器的教程。参照此教程的步骤,用户将对如何使用 emacs 有个概括的了解。
    • 第二种启动 emacs 的方法是通过装载某一个文本文件启动 emacs ,输入以下命令行: # emacs filename 如果装载的文件不在当前目录时必须输入该文件名的全称(包括所在目录)。例如,当前目录下有一个文本文件 myfile.txt ,用 emacs 对其编辑时,输入命令行启动 emacs : # emacs myfile.txt 屏幕上将出现如图 9-3 所示的 emacs 编辑窗口。
    • 3 . emacs 的基本操作 ( 1 )光标的移动 下面列出 emacs 中的光标的移动情况及其键盘操作: Ø         M-b :光标移动到光标左边的单词的开始处。 Ø         M-f :光标移动到光标右边的单词的开始处。 Ø         M-a :光标移动到当前句子的开始处。 Ø         M-e :光标移动到当前句子的结束处。 Ø         C-n :光标移动到下一行。 Ø         C-p :光标移动到上一行。 Ø         C-a :光标移动到行首。 Ø         C-e :光标移动到行尾。 Ø         M-> :光标移动到文件尾。 Ø         M-< :光标移动到文件头。
    • ( 2 )文本的操作 ① 插入文本的操作 ② 删除文本的操作 ③ 取消操作 ④ 粘贴操作 ⑤ 查找和替换 ( 3 )文件的操作 C-x C-f :在屏幕底部出列“ Findfile : /_ ” 等待用尸输入文件名,如输入“ /myfile.txt ” 则提示( newfile ),清屏后光标出现在左上角,等待用户输入文本的内容。 C-x C-s :当将文本输入完毕后选择存盘操作,屏幕底部提示出文本所在的目录及文件名“ /myfile.txt” ,指示出该文件存放在磁盘何处。
    • C-x C-w :当对一个原有的文本文件继续编辑或修改后;需将改变后的文件重新保存。这时 emacs 会提示“ /myfile.txt”exists ; overwrite ?( y or n ) _ 当回答“ y” 后,提示信息“ /myfile.txt” (重写该文件)。 C-x C-c :当确定结束对 emacs 编辑器的使用,可选择 File 菜单中的 Exitemacs 选项退出 emacs 。如果没有对输入或修改的内容存盘, emacs 会提醒用户别忘记做保存文件操作。 ( 4 )窗口的操作 窗口就是屏幕区域,用户可以使用多个窗口来对一个缓冲区的不同部分进行操作,或对不同的缓冲区进行操作。 当用户使用 C-x C-f 来打开一个文件的时候, emacs 将会创建一个缓冲区,用户在其中进行编辑操作。 emacs 允许同时对多个缓冲区中的文本进行编辑,比如在缓冲区互相粘贴、剪辑等等。用户还可以直接输入快捷键( C-x C-b )查看所选择的是哪个缓冲区,如图 9-4 所示。
    • 用户可以使用两种方法在当前窗口的不同缓冲区间进行切换: ( 1 )使用 Buffers 菜单,它包括当前时刻打开的所有的缓冲区,在其中选择,就能切换到想要编辑的文件。 ( 2 )使用键盘对缓冲区进行操作,键入 C-x b 命令,然后按下 RET ( RET ,即键盘上的回车键 Enter 。任何一个命令输入完毕时,必需紧跟着一个 Enter ,它的作用是用来告诉系统,命令输入已经结束,可以开始执行相关的动作了),就能立刻切换到位于当前编辑缓冲区的前一个缓冲区,或按 Tab 键,得到一个缓冲区的列表,然后输入需使用的缓冲区的名字(也可以用鼠标单击名字)。要关闭一个缓冲区,先切换到该缓冲区,键入 C-x k ,最后按下回车键。
    • 4 .在 emacs 中执行 Shell 在 emacs 中有两种执行 shell 的方法:一种是进入 shell command mode ,另一种是进入 shell mode 。二者都可以执行 shell ,其最大不同之处是,进入 shell mode 的状态,执行 shell 的同时,仍可以切换到其他模式处理别的工作,但如果使用 shell command mode ,就必须等 shell 执行完后才可以做其他的事。 使用 shell command mode 时,使用者在屏幕的最下方输入要执行的 shell 命令, emacs 会开启一个名为“ *shell command mode*” 的窗口,将 Shell 命令执行的结果显示在此窗口中。 shell mode 则是执行一个子 shell ,其输入与输出都是通过同一个缓冲区,所以输入与输出是在同一个地方,它不像 shell command mode ,命令输入与结果的显示在不同的地方。 1 ) shell command mode ESC-! ( shell-command )启动 shell command mode ESC- ( shell-command-on-region ) 2 ) shell mode ESC-x shellindex ESC-x shell 是启动 shell mode 的命令
    • 5 .用 emacs 进行程序的编辑、编译与测试 emacs 是一个综合的环境,在提供程序编辑的同时,自然会提供一个可供程序执行的环境。以下就要谈谈 emacs 可以为程序开发者提供那些服务。 emacs 针对不同的语言提供不同的编译摸式。 emacs 提供的服务有程序缩进的安排、括号对应的提示、程序注解的安排、光标移动的方式与程序的删除等等。基本上, emacs 是提供一个编写程序的格式,只是此格式可根据使用者的需要而自行设计。 emacs 选择适合的语言模式,是根据所编辑的文件名称扩展名来判断的。像上面提到的那样,如果用户编辑扩展名为 .c 的 C 语言程序, emacs 会自动给予 C 语言模式,而不需使用者自行处理。 emacs 提供的程序语言模式有 LISP 、 SCHEME 、 C 、 C++ 、 FORTRAN 、 MAKEFILE 、 AWK 、 PERL 、 ICON 与 MUDDLE 等。 编辑好的程序可以直接进入 emacs 的编译模式,不需离开 emacs 到 Linux 的 shell 下进行编译。进入 emacs 的编译模式很简单,只要输入“ ESC –x compile” 即可。 emacs 缺省的编译命今是 make ,执行 ESC –x compile 命令的结果如下所示: compile command : make -k 如果要使用其他的编译器,只需在“ compile command :”的后面加上对应的的编译命令即可,此命令与在 Linux shell 下使用编译的方法完全相同。
    • 除了编辑、编译之外,程序开发者还需要的功能是调试器, emacs 也提供了在编辑器内部调试程序的功能。 emacs 提供了四种调试器,分别为 gdb 、 dbx 、 xdb 与 sdb ,使用者可根据需要来选择合适的调试器。下面是使用调试器的命令: ESC –X gdb RET file RET ESC –X dbx RET file RET ESC –X xdb RET file RET ESC –X sdb RET file RET 9.2.3 使用 Kdevelop 开发 C 程序 1 . Kdevelop 的简介 Kdevelop 是一套功能强大的集成开发环境,其整合了开发程序所需的编译器、连接器、除错工具、版本控制工具等,可以用 Kdevelop 快速地建立各式各样的应用程序,包括: KDE 程序 ; GNOME ; Qt 程序 ; 终端程序 ; 其它
    • 2 .启动 Kdevelop 如果是第一次使用 Kdevelop , Kdevelop 会先启动“ Kdevelop 设置”进行 Kdevelop 的环境设定,共需要完成 9 个步骤的设置工作,如图 9-5 所示。 单击“ Kdevelop 设置”欢迎画面对话框中的【下一步】按钮开始进行 Kdevelop 的设定。“ Kdevelop 设置”的第二项设定为“选择语法高亮风格”,这里选择缺省的“ Kdevelop 2.0 风格”,如图 9-6 所示。 图 9-5 Kdevelop 设置 图 9-6 选择语法高亮风格
    • 选择喜欢的语法高亮表示风格后,单击【下一步】按钮进入“用户交换界面模式”的选择窗口,如图 9-7 所示。 同样选择好用户交换界面模式后,单击【下一步】按钮进入“ Kdevelop 中所使用的工具检测窗口”,如图 9-8 所示。 图 9-7 选择用户交换界面模式 图 9-8 Kdevelop 所使用的工具检测窗口
    • 单击“工具程序检测窗口”对话框中的【下一步】按钮,进行下一个步骤。下一个步骤为“寻找 Qt 文档”,并设定文件路径,一般而言这个步骤应该会成功完成,将见到如图 9-9 所示对话框。 单击“寻找 Qt 文档”对话框之中的【下一步】按钮,进入下一个步骤。下一个步骤为“寻找 KDE 程序库文件”,同样,一般而言这个步骤也应该会成功完成。再缺省完成两步以后, Kdevelop 设置将显示“安装过程成功完成”的对话框,如图 9-10 所示,此为 Kdevelop 设置的最后步骤,单击【下一步】按钮,稍待一会 Kdevelop 便会启动。 图 9-9 Qt 文档查找 图 9-10 安装过程成功完成窗口
    • 3 .新建一个新项目 在 Kdevelop 中开发 C 程序,需要用创建项目的方式进行。请执行“项目 / 新建”命令,打开应用程序向导对话框,创建过程如图 9-11 所示。 选择要创建程序的种类,这里选择 C 程序,然后单击【下一步】按钮进行下一步骤。下一个步骤为关于项目资讯的设定,如图 9-12 所示,在此输入项目的名称、目录、版本号码、作者姓名、以及作者电子邮件地址。 图 9-11 选择创建程序的种类 图 9-12 设定项目信息
    • 单击【创建】按钮开始产生项目档案,结果如图 9-13 所示,此处可能会看到一些警告信息,但是一般而言并不影响项目的建立。 4 .修改项目 创建项目后,在 Kdevelop 窗口的左边选择源程序,开始编写程序。 Kdevelop 会将程序加上一些默认的内容,可视需求自行修改,如图 9-14 所示。 图 9-13 产生项目档案的过程 图 9-14 修改项目
    • 5 .项目的编译与执行 写好程序后,执行“建立 -> 编译”命令进行程序的编译,如图 9-15 所示。如果程序没有出错,将看到 Kdevelop 下方的信息框之中显示编译成功的信息。 接着便可以执行应用程序了,执行“建立 -> 执行”命令进行程序的连接,如图 9-16 所示。若没有发生问题,就会在另一个窗口中看到程序的执行结果,如图 9-17 所示。 图 9-15 编译应用程序
    • 图 9-16 执行应用程序 图 9-17 应用程序的执行结果
    • 9.3 使用 GNU cc 开发应用程序 9.3.1 使用 GNU cc 1 . gcc 的简介 gcc 可以使程序员灵活地控制编译过程。编译过程一般可以分为下面四个阶段,每个阶段分别调用不同的工具进行处理,如图 9-18 所示。 2 . gcc 的版本信息 一般来说,系统安装后就已经安装和设定好了 gcc 。在 shell 的提示符下键入 gcc v ,屏幕上就会显示出目前正在使用的 gcc 的版本,同时这可以确定系统所支持的是 ELF 还是 a.out 可执行文件格式。 预处理 链接 编译 组译 源程序 (*.c) 可执行文件 预处理器 编译器 组译器 连接器
    • Linux 系统中可执行文件有两种格式。第一种格式是 a.out 格式,这种格式用于早期的 Linux 系统以及 Unix 系统的原始格式。 a.out 来自于 Unix C 编译程序默认的可执行文件名。当使用共享库时, a.out 格式就会发生问题。把 a.out 格式调整为共享库是一种非常复杂的操作,由于这个原因,一种新的文件格式被引入 Unix 系统 5 的第四版本和 Solaris 系统中。它被称为可执行和连接的格式( ELF )。这种格式很容易实现共享库。 ELF 格式已经被 Linux 系统作为标准的格式采用。 gcc 编译程序产生的所有的二进制文件都是 ELF 格式的文件(即使可执行文件的默认名仍然是 a.out )。较旧的 a.out 格式的程序仍然可以运行在支持 ELF 格式的系统上。 3 . gcc 的使用 gcc 的使用格式如下: $ gcc [options][filenames] 其中 filenames 为所要编译的程序源文件。 当使用 gcc 时, gcc 会完成预处理、编译、汇编和连接。前三步分别生成目标文件,连接时,把生成的目标文件链接成可执行文件。 gcc 可以针对支持不同的源程序文件进行不同处理,文件格式以文件的后缀来识别,常见的如表 9-1 所示。
    • 4 .使用优化选项
      • 当用 gcc 编译 C 代码时,它会试着用最少的时间完成编译并且使编译后的代码易于调试 . 易于调试意味着编译后的代码与源代码有同样的执行次序,编译后的代码没有经过优化。有很多选项可用于告诉 gcc ,在耗费更多编译时间和牺牲易调试性的基础上,产生更小更快的可执行文件。这些选项中最典型的是 -O 和 -O2 选项。
        • -O 选项告诉 gcc 对源代码进行基本优化。这些优化在大多数情况下都会使程序执行的更快。
        • -O2 选项告诉 gcc 产生尽可能小和尽可能快的代码。 -O2 选项将使编译的速度比使用 -O 时慢。但通常产生的代码执行速度会更快。
      5 .使用调试和剖析选项
      • GCC 支持数种调试和剖析选项。在这些选项里最常用的是 -g 和 -pg 选项。
        • -g 选项告诉 gcc 产生能被 GNU 调试器使用的调试信息以便调试程序。 gcc 提供了一个很多其他 C 编译器里没有的特性,在 gcc 里能使 -g 和 -O( 产生优化代码 ) 连用。这一点非常有用,因为能在与最终产品尽可能相近的情况下调试代码。同时使用这两个选项时必须清楚所写的某些代码已经在优化时被 gcc 作了改动。
        • -pg 选项告诉 gcc 在程序里加入额外的代码,执行时,产生 gprof 用的剖析信息以显示程序的耗时情况。
    • 9.3.2 使用 GNU make 编辑 makefile 1 .准备工作 要使用 make ,必须编写一个叫做 Makefile 的文件,这个文件描述了软件包中文件之间的关系,提供更新每个文件的命令。一般在一个软件包里,通常是可执行文件靠目标文件来更新,目标文件靠编译源文件来更新。 Makefile 写好之后,每次改变了某些源文件,只要执行 make 命令: # make 所有必要的重新编译将执行。 Make 程序利用 makefile 中的数据和每个文件的最后修改时间来确定那个文件需要更新,对于需要更新的文件, make 程序执行 makefile 数据中定义的命令来更新。 2 . makefile 文件的基本结构 GNU make 的主要功能是读进一个文本文件 makefile 并根据 makefile 的内容执行一系列的工作。 makefile 的默认文件名为 GNUmakefile 、 makefile 或 Makefile ,当然也可以在 make 的命令行中指定别的文件名。如果不特别指定, make 命令在执行时将按顺序查找默认的 makefile 文件。多数 Linux 程序员使用第三种文件名 Makefile 。因为第一个字母是大写,通常被列在一个目录的文件列表的最前面。
    • Makefile 是一个文本形式的数据库文件,其中包含一些规则来告诉 make 处理哪些文件以及如何处理这些文件。这些规则主要是描述哪些文件(称为 target 目标文件,不要和编译时产生的目标文件相混淆)是从哪些别的文件(称为 dependency 依赖文件)中产生的,以及用什么命令( command )来执行这个过程。 依靠这些信息, make 会对磁盘上的文件进行检查,如果目标文件的生成或被改动时的时间(称为该文件时间戳)至少比它的一个依赖文件还旧的话, make 就执行相应的命令,以更新目标文件。目标文件不一定是最后的可执行文件,可以是任何一个中间文件并可以作为其他目标文件的依赖文件。 一个 Makefile 文件主要含有一系列的规则,每条规则包含以下内容。 一个目标( target ),即 make 最终需要创建的文件,如可执行文件和目标文件;目标也可以是要执行的动作,如“ clean” 。 一个或多个依赖文件( dependency )列表,通常是编译目标文件所需要的其他文件。 一系列命今 (command) ,是 make 执行的动作,通常是把指定的相关文件编译成目标文件的编译命令,每个命令占一行,且每个命令行的起始字符必须为 TAB 字符。
    • 除非特别指定,否则 make 的工作目录就是当前目录。 target 是需要创建的二进制文件或目标文件, dependency 是在创建 target 时需要用到的一个或多个文件的列表,命令序列是创建 target 文件所需要执行的步骤,比如编译命令。 Makefile 规则的一般形式如下: target : dependency dependency (tab)<command> 例如,有以下的 Makefile 文件: # 一个简单的 Makefile 的例子 # 以 # 开头的为注释行 test : prog.o code.o gcc –o test prog.o code.o   prog.o : prog.c prog.h code.h gcc –c prog.c –o prog.o   code.o : code.c code.h gcc –c code.c –o code.o   clean : rm –f *.o
    • 上面的 Makefile 文件中共定义了四个目标: test 、 prog.o 、 code.o 和 clean 。目标从每行的最左边开始写,后面跟一个冒号(:),如果有与这个目标有依赖性的其他目标或文件,把它们列在冒号后面,并以空格隔开。然后另起一行开始写实现这个目标的一组命令。在 Makefile 中,可使用续行号( )将一个单独的命令行延续成几行。但要注意在续行号( )后面不能跟任何字符(包括空格和键)。 一般情况下,调用 make 命令可输入: # make target target 是 Makefile 文件中定义的目标之一,如果省略 target , make 就将生成 Makefile 文件中定义的第一个目标。对于上面 Makefile 的例子,单独的一个“ make” 命令等价于: # make test 因为 test 是 Makefile 文件中定义的第一个目标, make 首先将其读入,然后从第一行开始执行,把第一个目标 test 作为它的最终目标,所有后面的目标的更新都会影响到 test 的更新。第一条规则说明只要文件 test 的时间戳比文件 prog.o 或 code.o 中的任何一个旧,下一行的编译命令将会被执行。
    • 但是,在检查文件 prog.o 和 code.o 的时间戳之前, make 会在下面的行中寻找以 prog.o 和 code.o 为目标的规则,在第三行中找到了关于 prog.o 的规则,该文件的依赖文件是 prog.c 、 prog.h 和 code.h 。同样, make 会在后面的规则行中继续查找这些依赖文件的规则,如果找不到,则开始检查这些依赖文件的时间戳,如果这些文件中任何一个的时间戳比 prog.o 的新, make 将执行“ gcc –c prog.c –o prog.o” 命令,更新 prog.o 文件。 以同样的方法,接下来对文件 code.o 做类似的检查,依赖文件是 code.c 和 code.h 。当 make 执行完所有这些套嵌的规则后, make 将处理最顶层的 test 规则。如果关于 prog.o 和 code.o 的两个规则中的任何一个被执行,至少其中一个 .o 目标文件就会比 test 新,那么就要执行 test 规则中的命令,因此 make 去执行 gcc 命令将 prog.o 和 code.o 连接成目标文件 test 。 在上面 Makefile 的例子中,还定义了一个目标 clean ,它是 Makefile 中常用的一种专用目标,即删除所有的目标模块。 现在来看一下 make 做的工作:首先 make 按顺序读取 makefile 中的规则,然后检查该规则中的依赖文件与目标文件的时间戳哪个更新,如果目标文件的时问戳比依赖文件还早,就按规则中定义的命令更新目标文件。如果该规则中的依赖文件又是其他规则中的目标文件,那么依照规则链不断执行这个过程,直到 Makefile 文件的结束,至少可以找到一个不是规则生成的最终依赖文件,获得此文件的时间戳,然后从下到上依照规则链执行目标文件的时间戳比此文件时间戳旧的规则,直到最顶层的规则。
    • 通过以上的分析过程,可以看到 make 的优点,因为 .o 目标文件依赖 .c 源文件,源码文件里一个简单改变都会造成那个文件被重新编译,并根据规则链依次由下到上执行编译过程,直到最终的可执行文件被重新连接。例如,当改变一个头文件的时候,由于所有的依赖关系都在 Makefile 里,因此不再需要记住依赖此头文件的所有源码文件, make 可以自动的重新编译所有那些因依赖这个头文件而改变了的源码文件,如果需要,再进行重新连接。 3 . Makefile 中的变量
      • Makefile 里的变量就像一个环境变量。事实上,环境变量在 make 中也被解释成 make 的变量。这些变量对大小写敏感,一般使用大写宇母。几乎可以从任何地方引用定义的变量,变量的主要作用如下:
        • 保存文件名列表。在前面的例子里,作为依赖文件的一些目标文件名出现在可执行文件的规则中,而在这个规则的命令行里同样包含这些文件并传递给 gcc 做为命令参数。如果使用一个变量来保存所有的目标文件名,则可以方便地加入新的目标文件而且不易出错。
        • 保存可执行命令名,如编译器。在不同的 Linux 系统中存在着很多相似的编译器 系统,这些系统在某些地方会有细微的差别,如果项目被用在一个非 gcc 的系统 里,则必须将所有出现编译器名的地方改成用新的编译器名。但是如果使用一个变量来代替编译器名,那么只需要改变该变量的值。其他所有地方的命令名就都改变了。
        • 保存编译器的参数。在很多源代码编译时, gcc 需要很长的参数选项,在很多情况下,所有的编译命令使用一组相同的选项,如果把这组选项使用一个变量代表,那么可以把这个变量放在所有引用编译器的地方。当要改变选项的时候,只需改变一次这个变量的内容即可。
      Makefile 中的变量是用一个文本串在 Makefile 中定义的,这个文本串就是变量的值。只要在一行的开始写下这个变量的名字,后面跟一个“=”号,以及要设定这个变量的值即可定义变量,下面是定义变量的语法: VARNAME=string 使用时,把变量用括号括起来,并在前面加上 $ 符号,就可以引用变量的值: ${VARNAME} make 解释规则时, VARNAME 在等式右端展开为定义它的字符串。变量一般都在 Makefile 的头部定义。按照惯例,所有的 Makefile 变量都应该是大写。如果变量的值发生变化,就只需要在一个地方修改,从而简化了 Makefile 的维护。
    • 现在利用变量把前面的 Makefile 重写一遍: OBJS=prog.o code.o CC=gcc   test : ${ OBJS } ${ CC } –o test ${ OBJS }   prog.o : prog.c prog.h code.h ${ CC } –c prog.c –o prog.o   code.o : code.c code.h ${ CC } –c code.c –o code.o   clean : rm –f *.o 除用户自定义的变量外, make 还允许使用环境变量、自动变量和预定义变量。使用环境变量的方法很简单,在 make 启动时, make 读取系统当前已定义的环境变量,并且创建与之同名同值的变量,因此用户可以像在 shell 中一样在 Makefile 中方便的引用环境变量。需要注意的是,如果用户在 Makefile 中定义了同名的变量,用户自定义变量将覆盖同名的环境变量。此外, Makefile 中还有一些预定义变量和自动变量,但是看起来并不像自定义变量那样直观。表 9-3 中给出了常见的自动变量。
    • 除了自动变量外, Makefile 中还有一些预定义的内部变量,用于定义编译命令名、编译参数等,如表 9-4 所示: 4 . Makefile 的隐含规则 在上面的例子中,几个产生目标文件的命令都是从“ .c” 的 C 语言源文件和相关文件通过编译产生“ .o” 目标文件,这也是一般的步骤。实际上, make 可以使工作更加自动化,也就是说, make 知道一些默认的动作,它有一些称作隐含规则的内置的规则,这些规则告诉 make 当用户没有完整地给出某些命令的时候,应该怎样执行。 例如,把生成 prog.o 和 code.o 的命令从规则中删除, make 将会查找隐含规则,然后会找到并执行一个适当的命令。由于这些命令会使用一些变量,因此可以通过改变这些变量来定制 make 。象在前面的例子中所定义的那样, make 使用变量 CC 来定义编译器,并且传递变量 CFLAGS (编译器参数)、 CPPFLAGS ( C 语言预处理器参数)、 TARGET_ARCH (目标机器的结构定义)给编译器,然后加上参数 -c ,后面跟变量 $< (第一个依赖文件名),然后是参数 -o 加变量 $@ (目标文件名)。综上所述,一个 C 编译的具体命令将会是: $ {CC} $ {CFLAGS} $ {CPPFLAGS} $ {TARGET_ARCH} –c $< -o $@
    • 在上面的例子中,利用隐含规则,可以简化为: OBJS=prog.o code.o CC=gcc test : ${ OBJS } ${ CC } –o $@ $^   prog.o : prog.c prog.h code.h code.o : code.c code.h   clean : rm –f *.o 5 、常用的 make 命令行选项 make 命令有丰富的命令行选项。表 9-5 中列出了常用的部分。
    • 9.3.3 使用 automake 和 autoconf 产生 Makefile 在开始使用 Automake 和 autoconf 之前,请先确认系统已经安装以下的软件:           GNU Automake           GNU Autoconf           GNU m4           Perl            GNU Libtool ( 如果你需要产生 shared library) Automake 所产生的 Makefile 除了可以做到程序的编译和连接,也已经把如何产生程序文件的操作,以及把安装程序都考虑进去了,所以源程序所存放的目录架构最好符合 GNU 的标准惯例,下面用 hello.c 来作为例子进行说明。 在工作目录下建立一个新的子目录 devel ,再在 devel 下建立一个 hello 的子目录,这个目录将作为存放 hello 这个程序及其相关文件的地方:
    • 用编辑器写个 hello.c 文件: #include <stdio.h> int main(int argc, char** argv) { printf(&quot;Hello, GNU! &quot;); return 0; } 接下来就要使用 Autoconf 及 Automake 来产生 Makefile 文件,步骤如下: ( 1 ) autoscan 产生一个 configure.in 的模板,执行 autoscan 后会产生一个 configure.scan 的文件,可以用它做为 configure.in 文件的模板: ( 2 )编辑 configure.scan 文件,如下所示,并且把文件名改成 configure.in ( 3 )执行 aclocal 和 autoconf ,分别会产生 aclocal.m4 及 configure 两个文件: ( 4 )编辑 Makefile.am 文件,内容如下: ( 5 )执行 automake --add-missing , Automake 会根据 Makefile.am 产生一些文件,包含最重要的 Makefile.in :
    • ( 6 )最后执行 ./configure : 现在你的目录下已经产生了一个 Makefile 文件,执行 make 命令就可以开始编译 hello.c 成执行文件,最后执行 ./hello : # make gcc -DPACKAGE=&quot;hello&quot; -DVERSION=&quot;1.0&quot; -I. -I. -g -O2 -c hello.c gcc -g -O2 -o hello hello.o # ./hello Hello! GNU! 9.4 调试工具 GDB 9.4.1 GDB 调试器简介
      • Linux 系统中包含了 GNU 调试程序 gdb ,它是一个用来调试 C 和 C++ 程序的调试器。可以使程序开发者在程序运行时观察程序的内部结构和内存的使用情况。 gdb 所提供的一些功能如下所示:
        • 运行程序,设置所有的能影响程序运行的参数和环境;
        • 控制程序在指定的条件下停止运行;
        • 当程序停止时,可以检查程序的状态;
        • 修改程序的错误,并重新运行程序;
        • 动态监视程序中变量的值;
        • 可以单步执行代码,观察程序的运行状态。
      gdb 的功能非常强大,到目前为止, gdb 已能够支持 Moduls-2 、 Chill 、 Pascal 和 FORTRAN 程序的调试,但是调试这些语言的源程序时有一些功能还不能使用。例如调试 FORTRAN 程序时还不支持表达式的输入、输出变量或类 FORTRAN 的词法。 gdb 程序调试的对象是可执行文件,而不是程序的源代码文件。然而,并不是所有的可执行文件都可以用 gdb 调试。如果要让产生的可执行文件可以用来调试,需在执行 gcc 指令编译程序时,加上 -g 参数,指定程序在编译时包含调试信息。调试信息包含程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号。 gdb 利用这些信息使源代码和机器码相关联。 在命令行上输入 gdb 并按回车键就可以运行 gdb 了,如果一切正常的话,将启动 gdb ,可以在屏幕上看到以下的内容:
    • GNU gdb Red Hat Linux (5.3post-0.20021129.18rh) Copyright 2003 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type &quot;show copying&quot; to see the conditions. There is absolutely no warranty for GDB. Type &quot;show warranty&quot; for details. This GDB was configured as &quot;i386-redhat-linux-gnu&quot;. (gdb) 启动 gdb 后,可以在命令行上指定很多的选项。输入: help 可以获得 gdb 的帮助信息。如果想要了解某个具体命令(比如 break )的帮助信息,在 gdb 提示符下输入下面的命令: break 屏幕上会显示关于 break 的帮助信息。从返回的信息可知, break 是用于设置断点的命令。另一个获得 gdb 帮助的方法是浏览 gdb 的手册页。在 Linux Shell 提示符输入: man gdb 可以看到 man 的手册页。
    • 9.4.2 GDB 命令的基本使用和应用 1 . gdb 基本命令 还可以用下面的方式来运行 gdb: gdb filename 其中, filename 是要调试的可执行文件。用这种方式运行 gdb 可以直接指定想要调试的程序。这和启动 gdb 后执行 file filename 命令效果完全一样。也可以用 gdb 去检查一个因程序异常终止而产生的 core 文件,或者与一个正在运行的程序相连。 gdb 支持很多的命令且能实现不同的功能。这些命令从简单的文件装入到允许你检查所调用的堆栈内容的复杂命令 , 下面列出了在使用 gdb 调试时会用到的一些命令。 1 ) file 命令:装入想要调试的可执行文件。 2 ) cd 命令:改变工作目录。 3 ) pwd 命令:返回当前工作日录。 4 ) run 命令:执行当前被调试的程序。 5 ) kill 命令:停止正在调试的应用程序。
    • 6 ) list 命令:列出正在调试的应用程序的源代码。 7 ) break 命令:设置断点。 8 ) Tbreak 命令;设置临时断点。它的语法与 break 相同。区别在于用 tbreak 设置的断点执行一次之后立即消失。 9 ) watch 命令:设置监视点,监视表达式的变化。 10 ) awatch 命令:设置读写监视点。当要监视的表达式被读或写时将应用程序挂起。它的语法与 watch 命令相同。 11 ) rwatch 命令:设置读监视点,当监视表达式被读时将程序挂起,等侍调试。此命令的语法与 watch 相同。 12 ) next 命令:执行下一条源代码,但是不进入函数内部。也就是说,将一条函数调用作为一条语句执行。执行这个命令的前提是已经 run ,开始了代码的执行。 13 ) step 命令:执行下一条源代码,进入函数内部。如果调用了某个函数,会跳到函数所在的代码中等候一步步执行。执行这个命令的前提是已经用 run 开始执行代码。 14 ) display 命令:在应用程序每次停止运行时显示表达式的值。 15 ) info break 命令:显示当前断点列表,包括每个断点到达的次数。
    • 16 ) info files 命令:显示调试文件的信息。 17 ) info func 命令:显示所有的函数名。 18 ) info local 命令:显示当前函数的所有局部变量的信息。 19 ) info prog 命令:显示调试程序的执行状态。 20 ) print 命令;显示表达式的值。 21 ) delete 命令:删除断点。指定一个断点号码,则删除指定断点。不指定参数则删除所有的断点。 22 ) Shell 命令:执行 Linux Shell 命令。 23 ) make 命令:不退出 gdb 而重新编译生成可执行文件。 24 ) Quit 命令:退出 gdb 。 2 . gdb 应用实例 下面使用 gdb 调试程序来调试一个实例。被调试的程序相当的简单 , 但展示了 gdb 的典型应用。下面列出了将被调试的程序代码,这个程序被称为 greeting.c , 功能是显示一个简单的问候 , 再用反序将它列出。
    • 9.5 使用 RCS/CVS 来管理源代码 9.5.1 RCS 的使用 RCS ( Revision Control System )即程序改版控制系统,主要功能是用来管理文件的版本,可以节省空间和时间。这样就不需要在每个程序开发到某一个阶段就将数据拷贝到其他的地方备份起来了。 RCS 提供了如下几个最重要的指令的: Ø         ci 指令:将文件放入 RCS 目录下的控制系统 Ø         co 指令:从 RCS 目录下将文件取出 Ø         rcs 指令:用来对 RCS 文件进行参数的设置 1 .基本操作方式 一般而言, RCS 所产生出来的文件会放在 RCS 目录中。所以第一步必须要在当前的目录下制作一个文件: [root@wyh linux]# mkdir RCS 接下来只要使用 ci 指令。就可以把文件备份到 RCS 改版控制系统中: [root@wyh linux]# ci test.c
    • 若要将文件取出,可以使用下列指令:   [root@wyh linux]# co test.c 取出来的文件是只读文件,若要取出可以写入的工作文件,可以加上 -l 参数来锁定它: [root@wyh linux]# co -l test.c 此外将文件放入 RCS 控制系统时,可以使用 -l 参数锁定文件,那么目录下的文件依然存在:   [root@wyh linux]# ci -l test.c  若要比较当前的文件和 RCS 中最新版本的文件,可以使用下列指令: [root@wyh linux]# rcsdiff test.c 2 .指定版本 若不指定版本编号时, co 会从 RCS 取得最新的版本。如果要以特定的版本号码写入 RCS 或读出,可以使用 -r 参数选项。 [root@wyh linux]# ci -l -r3.25 test.c <-- 以 3.25 作为版本编号
    • [root@wyh linux]# co -l -r1.2 test.c <-- 将 RCS 中 1.2 版的 test.c 读出 此外, rcsdiff 也可以用来指定任何一个版本和当前程序代码进行比较。 [root@wyh linux]# rcsdiff -r3.25 test.c <-- 取出 3.25 版与 test.c 进行比较 3 .关键词的使用 在 RCS 中可以将关键词变量放入程序代码中。这些变量经过 RCS 会变成版本的注解。用户可以将这些关键词说明当作是程序中的批注。 常用的关键词如下: $Author$ :将版本放入 RCS 的用户名称。 $Data$ :记录程序代码放入 RCS 时的日期和时间。 $Header$ :记录文件的标头,包括 RCS 路径名称、版本号码、日期、作者等。
    • $ID$ :和 $Header$ 相同,但不包括 RCS 路径名称。 $Locker$ :记录锁定本版本的用户名称。 $Log$ :记录将 RCS 锁住的时间,所输入的文本语句。 $RCSfiles$ :记录 RCS 文件名称。 $Rivision$ :指定版本号码。 $Source$ : RCS 文件名称,包括其路径。 $State$ :使用 -s 选项所指定的特殊状态。 使用关键词的步骤如下所示: ( 1 )在程序代码中加入任一关键词 [root@wyh linux]#vi test.c ( 2 )将程序代码放入 RCS 版本控制系统 [root@wyh linux]# ci -l test.c ( 3 )将文件再次取出。在取出的过程中, co 会将每个关键词展开成其对应的值 [root@wyh linux]# co -l test.c [root@wyh linux]# cat test.c
    • 9.5.2 CVS 的使用 CVS ( Concurrent Version System )是个版本控制系统,利用该系统可以记录源代码文件的历史。例如,当软件修改时会产生 Bug ,并且可能在做这次修改后很长时间不会发现这些问题。使用 CVS 就可以容易地回顾老的代码版本去发现哪一次的修改导致这些问题。 如果 CVS 保留每一次的代码版本,会浪费很多的空间。因此 CVS 使用一种比较聪明的办法保存多个版本在一个文件中。它仅仅保留版本间的不同内容。如果很多人在同一个项目上工作,则 CVS 使用让不同开发者独立工作的方式解决了这个问题。每一个开发者的工作都在他自己的目录内,并且 CVS 将在每个开发者的工作完成后进行合并工作。 在 Linux 下, CVS 的使用一般是以命令行方式。通常, CVS 有两种使用方式,一是本机方式,一是远程执行方式。 CVS 的命令格式是: cvs [cvs 的选项 ] cvs 的动作 [ 选项 ] 读者可以用 cvs –H command 列出命令 command 的使用方法。 1 .开始项目 用 CVS 管理代码,首先要创建一个“信息仓库”。“信息仓库”简单来说包含一个目录结构。它包括要管理的源代码和用于管理源代码的各种管理文件。
    • 先设置环境变量 CVSROOT ,指向信息仓库的绝对路径,然后调用 CVS 的 init 命令: # CVSROOT=/usr/local/cvsroot;export CVSROOT # cvs init # ls -l $CVSROOT 2 .添加项目的文件、目录到信息仓库 要将需要管理的项目的文件加入到信息仓库,并做上标志。如果从头开始一个新的项目,就需要创建一个单独的目录,并把所有要使用的文件做一个有效的组织。而如果在开始使用源文件之前该目录就已经存在,则只需进入该目录就行了。 然后,就可以输入源文件目录: # cvs import -m &quot;Create Source Dir&quot; cvstest/c wu cvstest 这样会生成 $CVSROOT/cvstest/c 目录。 其中 -m 用来指定注释信息,如果后面在命令行不指定注释信息,则会启动缺省编辑器( vi )要求输入注释信息; cvstest/c 是项目名称(实际上是仓库名,在 CVS 服务器上会存储在以这个名字命名的仓库里); wu, cvstest 分别标识了作者和发行标识。
    • 3 .命令简介 ( 1 )导出源文件 cvs checkout [-r rev][-D date][-d dir][-j merg1] [-j merg2] modules -r 导出指定版本的模块 -D 导出指定日期的模块 -d 导出指定目录而不是模块 -j 合并当前版本和指定版本 使用下面的命令会导出刚才生成的模块,并在当前目录下生成与文件仓库中完全一样的目录结构: # cvs checkout cvstest/c 对于目录结构比较复杂的模块可以在 $CVSROOT/CVSROOT/modules 中加以指定 : ① # cvs checkout CVSROOT/modules ② 在 modules 文件中加入下面一行: SOURCE cvstest/c
    • ③ 然后执行: # cvs commit –m “Add SOURCE” 以后就可以使用下面的命令在当前路径下生成 cvstest/c 目录 # cvs checkout SOURCE 在当前路径下生成的这个目录就被称为工作目录,对源文件的所有修改都应该在这个目录下完成,而绝对不允许去改动在文件仓库中 $CVSROOT 目录下的文件。 ( 2 )删除、增加、重命名文件和目录 cvs add [-k kflags][-m message] files... -k 指定以后该文件的缺省导出目录 -m 对文件的描述 上述命令会加入一个新的文件到文件仓库里,但直到使用了提交命令它才会真正更新文件仓库。 cvs remove [options] files 上述命令会从文件仓库中删除文件,但也要到提交之后才有作用。
    • ( 3 )提交源文件 cvs commit [-Rl][-m mesg] files -R 连子目录一起提交 -l 只提交本地目录(不提交子目录) -m 注释信息 在导出源文件之后,在工作目录中对源文件进行的所有修改都必须在提交之后才能对文件仓库中的源文件起作用,并且新的文件才能够被分配一个新的版本号。 ( 4 )释放工作目录 cvs release –d SOURCE 这个命令会删除工作目录 cvstest/c (建议在提交了修改的模块后执行这一步),比使用 rm –rf cvstest 要好。 4 .多用户开发 在多用户的情况下,如果不同用户修改的是同一个文件的不同部分,则使用下面的命令就能进行版本合并(把检出的文件与当前的最新版本合并): # cvs update
    • ( 1 )冲突解决 在有多个用户对同一个文件进行修改时,如果修改了其中的相同部分,而修改后的内容如果有不同的话,出现冲突是不可避免的。如果在 CVS 文件仓库中有一个文件 test.c ,它的版本是 1.4 ,用户 A 先检出该文件进行修改,而稍后有用户 B 检出该文件进行修改,并提前提交成 1.5 ,而在用户 A 再提交时就会出现冲突(如果文件内容不同的话),这时 CVS 会提示需要手工解决。 ( 2 )文件版本管理 cvs log [-lR][-r rev][-d date][-w login][files…] -l 不处理子目录 -R 对子目录做同样处理 -r 指定版本号 -d 指定时间 -w 指定登录名 使用上面的命令可以参看当前模块或指定文件的所有历史版本信息。 cvs annotate [-lR][-r rev|-D date] files
    • -l 不处理子目录 -R 对子目录做同样处理 -r 指定版本号 使用上面的命令可以参看指定文件(检出之后)的所有修改信息。 使用下面的命令可以生成相对于一个指定主版本的分支版本: cvs rtag –b –r rev_root rev_branch file_name -b 指定生成一个分支版本 -r 指定该分支的主干节点版本号 rev_root 主干版本号 rev_branch 分支版本号 file_name 指定文件,使用 “ .” 表示当前目录下所有文件 使用上面的命令可以生成一个对应版本号的分支版本,由于 CVS 版本号是用数字表示的,而且在同一个模块下不同文件的版本完全可能是不同的,所以使用标识会更方便。
    • 例: # cvs rtag –b –r 1.2 tlb-1 SOURCE 以后要访问该分支版本,可以使用 “ -r” 选项 # cvs checkout –r tlb-1 SOURCE 从当前检出的版本切换到一个分支版本: # cvs update –r tlb-1 SOURCE 使用下面的命令可以看版本信息: cvs status [–vlR] files -v 显示所有信息 -l 不显示子目录信息 -R 显示子目录信息 cvs update –j rev module 把当前所做的修改与指定版本的文件进行合并。 如果在不同版本之间模块的文件有增减,则可以: # cvs update –A # cvs updata –jbranch_name
    • 5 .在远程机器上使用 CVS 通过网络使用 CVS 有很多种方式,但在这里只介绍比较简单的一种:通过 rsh 执行 cvs 命令。 1) 在远程机器的 .rhosts 中加入对本地机的访问许可: tom huang 2) 使用下面的命令检出模块 ESMSTRG # cvs –d :ext:huang@wyhlinux:/work/cvsroot checkout SOURCE 其中, ext 指明了连接方式为 rsh , huang 指明了本地用户, wyhlinux 指明了远地主机, /work/cvsroot 指明了在远地主机上的 $CVSROOT 路径,可以在本地设置 CVS_SERVER 环境变量指明这个目录。 9.6 将软件打包 9.6.1 RPM 简介 RPM 是 Redhat   Package   Manager 的缩写,是由 Red Hat 公司开发的软件包安装和管理程序,同 Windows 平台上的 Uninstaller 和 Cleansweep 比较类似。使用 RPM ,用户可以自行安装和管理 Linux 上的应用程序和系统工具。
      • RPM 可以让用户直接以 binary 方式安装软件包,并且可替用户查询是否已经安装了有关的库文件;在用 RPM 删除程序时,会询问用户是否要删除有关的程序。如果使用 RPM 来升级软件, RPM 会保留原先的配置文件,这样用户就不用重新配置新的软件了。 RPM 保留一个数据库,这个数据库中包含了所有的软件包的资料,通过这个数据库,用户可以进行软件包的查询。 RPM 虽然是为 Linux 而设计的,但是已经移值到 SunOS 、 Solaris 、 AIX 、 Irix 等其它 UNIX 系统上了。 RPM 遵循 GPL 版权协议,用户可以在符合 GPL 协议的条件下自由使用及传播 RPM 。
      • RPM 设计的目的有下面几点:
        • 方便的升级功能: RPM 让用户不用重新安装整个系统就可以对单个软件包进行升级,当一个新的发行版本问世的时侯,用户也不用重新安装, RPM 会替用户全面、自动、智能地升级系统,并且保留用户原先的配置文件,这就大大减少了用户维护系统的工作量。
        • 强大的查询功能:用户可以针对整个软件包的数据,或是某些特定的文件进行查询,也可以轻松地查出其个文件是属于哪个软件包,或是从哪里来的。 RPM 文件本身是经过压缩的,但用户还是可以很容易地快速查询每个软件包的内容,因为在 RPM 软件包里,已经加入一些特殊的 binary header ,记录了全部查询时所需要的数据,这一点大大加快了查询速度。
        • 系统校验:当用户不小心删除了某个重要的文件,但是又不知道是哪些软件包需要这个文件,这时侯就可以用 RPM 来查询已经安装的软体包中缺了哪些文件,是需否要重新安装。并且用户可以校验出安装的软件包是否已经被别人更改过。
        • 允许用户能够使用“纯净”的源代码:让用户取得“未经处理过的源代码”,同时再附上一份“补丁”程序,用户可凭借这些来完成程序编译工作。这样的做法带来不少好处。例如,如果某个程序的新版本问世了,用户可能没有必要再重头开始做全部的编译工作,先观察“补丁”程序的内容,看看有哪些部分是用户需要做的。这样就能让用户更清楚地知道新版本有哪些改进的地方。
        • 下面简单介绍一下 RPM 的使用。
      1 .用 RPM 安装软件包 最简单的安装命令如下: # rpm -ivh xwpe-1.5.29a-1.i386.rpm RPM 会输出该软件包的名称,并且显示一个状态条。安装软件很简单,但是有时会给出一些出错消息: Package Alrealy Installed!
    • 表示该软件包已经安装,也可使用 --replcepkgs 选项强制 RPM 重新安装这个软件。 Conflicting files 表示该软件包包含某些其他软件包安装过的文件,可加— replacepkgs 选项覆盖原先的文件。 Unresolved Dependency 表示正确运行该软件需要其他哪些软件包,因为 RPM 的软件包能够查询该软件的“依赖”关系,所以 RPM 在安装之前会先查询,如果系统没有安装需要的软件包,就会出现错误提示信息。 但是,如要继续安装,就必须先安装相应的软件包,或使用 -nodeps 选项强制安装,但不推荐使用,因为这样安装的结果一般不能运行。 2 .用 RPM 删除安装软件包 要删除已安装的软件包,只需要执行下面的命令: # rpm -e xwpe
    • 3 .用 RPM 升级软件 升级软件类似于安装软件,执行如下命令: # rpm -Uvh xwpe-1.5.31a-1.i386.rpm RPM 会自动删除相应软件包的老版本,如果配置文件同新版本不兼容,则会自动将其保存为另一 oldconfig.rpmsave 文件。这样,用户就可以自已手工去更改相应的配置文件。 4 .查询软件包 用户可以用 RPM –q 来在 RPM 的数据库中查询相应的软件, RPM 会给出软件包的名称、版本和发布版本号,例如: # rpm -q xwpe xwpe-1.5.29a-1 5 .用 RPM 校验软件包 用户可以用 RPM 来校验已经安装的软件包, RPM 可以校验文件大小、 MD5 校验码、文件权限、类型及属主等信息。
    • 6 .实际使用技巧 1 )可以通过 FTP 来安装软件包。如果用户能够连上网络,想安装某个新的软件包时,可以直接用它的 URL 地址来安装,例如: # rpm –I ftp://ftp.whpu.edu.cn/linux/xwpe-X11-1.5.29a-1.i386.rpm 也可以用网络来查询。 2 )假如用户不小心误删了几个文件,但不确定到底是哪些文件,通对整个系统进行校验,以了解哪些部份可能己经损坏,应这样做: # rpm –Va 3 )如果用户碰到一个认不出来的文件,想要知道是属于哪一个软件包的话,可以这样做: # rpm –qf /usr/bin/cdplay 4 )如果用户得到一个新的 RPM 文件,却不清楚它的内容,可以这样做: # rpm -qpi /xwpe-X11-1.5.29a-1.i386.rpm 5 )如果用户想了解某个 RPM 软件包会在系统里安装哪些文件,可以这样做: # rpm -qpl /xwpe-X11-1.5.29a-1.i386.rpm
    • 9.6.2 制作 RPM RPM 目前最新的版本 4.2 同以前的 3.x 系列是不兼容的。一般来说,为 RedHat6.2 、 Mandrake 、 TurboLinux 、 Suse 打包就需要 3.x 系列,而为 RedHat7.0 以上的版本,打包就需要 4.0 以上的 RPM 版本。具体软件可以到 www.rpm.org 下载。 制作 RPM 的基本步骤如下: 1 )取回软件 source code 和相关的 patch 。 2 )测试所需的 patch ,以使得能顺利地 build 整个程序。 3 )为程序软件包撰写一份 spec 文件。 4 )确认每个文件都在正确的目录位置。 5 )使用 RPM 来 build 整个包。 如果一切操作正确, RPM 是能顺利 build 完成 binary 与 source 程序软件包。
    • 1 .目录结构 RPM 打包工作必须在系统的特定目录下面进行,例如 RedHat 就是如下的目录: / usr/src/redhat/BUILD 编译时的临时目录 /usr/src/redhat/RPMS 编译好的 RPM 的存放位置 /usr/src/redhat/RPMS/athlon 各种硬件平台的 RPM /usr/src/redhat/RPMS/i386 /usr/src/redhat/RPMS/i486 /usr/src/redhat/RPMS/i586 /usr/src/redhat/RPMS/i686 /usr/src/redhat/RPMS/noarch 不依赖于硬件的 RPM /usr/src/redhat/SOURCES 打包需要的源代码和补丁 /usr/src/redhat/SPECS 打包需要的控制文件 /usr/src/redhat/SRPMS 编译好的源代码包 首先将所有的源代码文件拷贝到 /usr/src/redhat/SOURCE 下面,再到 /usr/src/redhat/SPECS 下面编辑相应的 .spec 控制文件。
    • 2 .编辑 macros RPM 的配置文件中 /usr/lib/rpm/macros 是一个全局的配置文件,可以在其中设定一些全局变量,如: %distribution 发行版本名 %packager 打包者姓名和 email %vendor 软件包作者 除了上述的 macro 设定外,还有许多其他的设定方式,可以使用下面的命令来查看系统的 tag 与可供使用的 flag 有哪些: # rpm –showrc 3 .编辑 spec 文件 制作一个软件包时,需要使用到 spec 文件,其内容为该程序软件包的说明,还包括一些指令,用以执行整个 build 的过程,还有一份文件列表,用以表示程序软件包中的文件,分别被安装在里面。 spec 文件的命名方式,最好是遵循一个通用的格式,其格式应该为“软件包名版本号 .spec ” 。
    • 4 .编译 RPM 在 SPEC 文件编译完成后,再开始编译工作: # rpm –ba helloworld-1.0-1.spec 编译完成后一定要进行测试工作,最好是在另外一台干净的系统上进行测试安装和卸载过程。如果一切无误那么就可以发布这个 RPM 包了。 本章小结