Linux 简介

实战指南

Machtelt Garrels

Garrels.be


                        
                    

1.27 版本

20080606


目录
介绍
1. 为什么编写本指南?
2. 谁应该阅读本书?
3. 新版本和可用性
4. 修订历史
5. 贡献
6. 反馈
7. 版权信息
8. 您需要什么?
9. 本文档中使用的约定
10. 本文档的组织
1. 什么是 Linux?
1.1. 历史
1.2. 用户界面
1.3. Linux 有未来吗?
1.4. Linux 的特性
1.5. Linux 发行版
1.6. 总结
1.7. 练习
2. 快速入门
2.1. 登录、激活用户界面和注销
2.2. 绝对基础
2.3. 获取帮助
2.4. 总结
2.5. 练习
3. 关于文件和文件系统
3.1. Linux 文件系统概述
3.2. 文件系统中的定位
3.3. 操作文件
3.4. 文件安全
3.5. 总结
3.6. 练习
4. 进程
4.1. 进程深入
4.2. 启动过程、Init 和关闭
4.3. 管理进程
4.4. 调度进程
4.5. 总结
4.6. 练习
5. I/O 重定向
5.1. 简单重定向
5.2. 高级重定向功能
5.3. 过滤器
5.4. 总结
5.5. 练习
6. 文本编辑器
6.1. 文本编辑器
6.2. 使用 Vim 编辑器
6.3. Linux 在办公室中的应用
6.4. 总结
6.5. 练习
7. 家,甜蜜的 /home
7.1. 一般良好的内务管理
7.2. 您的文本环境
7.3. 图形环境
7.4. 区域特定设置
7.5. 安装新软件
7.6. 总结
7.7. 练习
8. 打印机和打印
8.1. 打印文件
8.2. 服务器端
8.3. 打印问题
8.4. 总结
8.5. 练习
9. 基本备份技术
9.1. 介绍
9.2. 将您的数据移动到备份设备
9.3. 使用 rsync
9.4. 加密
9.5. 总结
9.6. 练习
10. 网络
10.1. 网络概述
10.2. 网络配置和信息
10.3. 互联网/内联网应用
10.4. 远程执行应用程序
10.5. 安全
10.6. 总结
10.7. 练习
11. 声音和视频
11.1. 音频基础
11.2. 声音和视频播放
11.3. 视频播放、流媒体和电视观看
11.4. 互联网电话
11.5. 总结
11.6. 练习
A. 下一步去哪里?
A.1. 有用的书籍
A.2. 有用的网站
B. DOS 与 Linux 命令
C. Shell 特性
C.1. 常用特性
C.2. 不同特性
词汇表
索引
表格列表
1. 排版和用法约定
2-1. 快速入门命令
2-2. Bash 中的按键组合
2-3. 第 2 章中的新命令:基础知识
3-1. 长列表中的文件类型
3-2. 根目录的子目录
3-3. 最常见的配置文件
3-4. 常用设备
3-5. Color-ls 默认配色方案
3-6. ls 的默认后缀方案
3-7. 访问模式代码
3-8. 用户组代码
3-9. 使用 chmod 进行文件保护
3-10. 第 3 章中的新命令:文件和文件系统
3-11. 文件权限
4-1. 控制进程
4-2. 常用信号
4-3. 第 4 章中的新命令:进程
5-1. 第 5 章中的新命令:I/O 重定向
7-1. 常用环境变量
7-2. 第 7 章中的新命令:安家
8-1. 第 8 章中的新命令:打印
9-1. 第 9 章中的新命令:备份
10-1. 简化的 OSI 模型
10-2. 第 10 章中的新命令:网络
11-1. 第 11 章中的新命令:音频
B-1. DOS/Linux 命令概述
C-1. 常用 Shell 特性
C-2. 不同的 Shell 特性
图表列表
1. Linux 简介封面
1-1. OpenOffice MS 兼容电子表格
2-1. 终端窗口
2-2. Konqueror 作为帮助浏览器
3-1. Linux 文件系统布局
3-2. 硬链接和软链接机制
4-1. Fork-and-exec 机制
4-2. 你能快点吗?
4-3. Gnome 系统监视器
8-1. 通过 Web 界面查看打印机状态
9-1. 软盘格式化工具
10-1. Evolution 邮件和新闻阅读器
10-2. X-Chat
10-3. SSH X11 转发
11-1. XMMS mp3 播放器

介绍

1. 为什么编写本指南?

许多人仍然认为学习 Linux 很困难,或者只有专家才能理解 Linux 系统的工作方式。虽然有很多免费文档可用,但这些文档广泛分散在 Web 上,并且通常令人困惑,因为它通常面向有经验的 UNIX 或 Linux 用户。今天,由于开发方面的进步,Linux 在家庭和工作中越来越受欢迎。本指南的目标是向所有年龄段的人们展示 Linux 可以简单而有趣,并且可以用于各种目的。


2. 谁应该阅读本书?

本指南旨在概述 Linux 操作系统,面向新用户作为探索之旅和入门指南,每章末尾都有练习。对于更高级的学员,它可以作为桌面参考,以及进行系统和网络管理所需的基础知识的集合。本书包含许多来自作者作为 Linux 系统和网络管理员、培训师和顾问的经验的真实示例。我们希望这些示例将帮助您更好地了解 Linux 系统,并鼓励您自己尝试。

任何想要获得 Linux(以及一般的 UNIX)"线索",即命令行用户体验的人都会发现本书很有用。


3. 新版本和可用性

本文档发布在 Linux Documentation Project 集合的 Guides 部分,网址为 http://www.tldp.org/guides.html;您也可以在此处下载 PDF 和 PostScript 格式的版本。

最新版本可在 http://tille.garrels.be/training/tldp/ 获得。

本指南的第二版可以通过 Fultus.com Books 以平装本按需印刷 (POD) 方式获得。Fultus 通过 Ingram 和 Baker & Taylor 将本文档分发给许多书店,包括 Amazon.comAmazon.co.ukBarnesAndNoble.comGoogle's Froogle 全球购物门户和 Google Book Search

图 1. Linux 简介封面

该指南已被 翻译成印地语,由

  • Alok Kumar

  • Dhananjay Sharma

  • Kapil

  • Puneet Goel

  • Ravikant Yuyutsu

Andrea Montagner 将该指南翻译成意大利语


4. 修订历史

修订历史
修订版 1.2720080606修订者:MG
更新。
修订版 1.2620070919修订者:MG
来自读者的评论,许可证。
修订版 1.2520070511修订者:MG
来自读者的评论,小更新,电子邮件礼仪,更新了关于可用性的信息(感谢 Oleg)。
修订版 1.242006-11-01修订者:MG
添加了索引术语,为第二版印刷做准备,添加了 gpg 和代理信息。
修订版 1.232006-07-25修订者:MG 和 FK
更新和更正,再次删除 app5,修改许可证以允许包含在 Debian 文档中。
修订版 1.222006-04-06修订者:MG
chap8 彻底修改,chap10:澄清示例,添加 ifconfig 和 cygwin 信息,修改网络应用程序。
修订版 1.212006-03-14修订者:MG
在 chap11 中添加练习,更正换行错误,完成第 9 章的命令概述,第 10 章中的小更正。
修订版 1.202006-01-06修订者:MG
拆分 chap7:音频内容现在位于单独的章节 chap11.xml 中。小修改,更新 aptitude 等命令,更多关于 USB 存储、互联网电话的信息,来自读者的更正。
修订版 1.132004-04-27修订者:MG
在将所有内容发送到 Fultus 进行打印之前的最后一次通读。在“新版本”部分添加了 Fultus 参考,更新了“约定”和“组织”部分。在第 4、5、6 和 8 章中进行了小修改,在第 10 章中添加了 rdesktop 信息,更新了词汇表,将对 fileutils 的引用替换为 coreutils,感谢印地语翻译人员。


5. 贡献

非常感谢所有分享经验的人。特别是感谢比利时 Linux 用户每天倾听我的意见,并慷慨地提出他们的评论。

还要特别感谢 Tabatha Marshall 进行了非常彻底的修改、拼写检查和样式设计,以及 Eugene Crosser 发现了我们两人忽略的错误。

感谢所有读者,他们通知我缺少的主题,并通过邮件发送他们的意见,帮助我找出最后的错误、不清晰的定义和拼写错误。他们也帮助我保持本指南的更新,例如 Filipus Klutiero 在 2005 年和 2006 年进行了完整的审查,并帮助我将本指南纳入 Debian 文档集,以及 Alexey Eremenko,他为第 11 章提供了基础。

2006 年,Suresh Rajashekara 创建了本文档的 Debian 软件包。

最后,非常感谢目前正在将本文档翻译成法语、瑞典语、德语、波斯语、印地语等多种语言的志愿者们。这是一项不容小觑的巨大工程;我钦佩你们的勇气。


6. 反馈

缺少信息、缺少链接、缺少字符?请将它们发送给本文档的维护者


                    
                

别忘了先查看最新版本


7. 版权信息

* Copyright (c) 2002-2007, Machtelt Garrels
* All rights reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
*     * Redistributions of source code must retain the above copyright
*       notice, this list of conditions and the following disclaimer.
*     * Redistributions in binary form must reproduce the above copyright
*       notice, this list of conditions and the following disclaimer in the
*       documentation and/or other materials provided with the distribution.
*     * Neither the name of the author, Machtelt Garrels, nor the
*       names of its contributors may be used to endorse or promote products
*       derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR AND CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

本书中使用的徽标、商标和符号均为其各自所有者的财产。


8. 你需要什么?

你需要一台计算机和一个包含 Linux 发行版的介质。本指南的大部分内容适用于所有 Linux 发行版 - 以及一般的 UNIX。除了时间,没有其他具体要求。

Installation HOWTO 包含了有关如何获取 Linux 软件并在您的计算机上安装它的有用信息。 还讨论了硬件要求以及与其他操作系统的共存。

CD 镜像可以从 linux-iso.com 和许多其他位置下载,请参阅 附录 A

对于那些不敢在机器上实际安装 Linux 的人来说,一个有趣的替代方案是可以从 CD 运行的 Linux 发行版,例如 Knoppix 发行版。


9. 本文档中使用的约定

以下排版和使用约定出现在本文中

表 1. 排版和使用约定

文本类型含义
"引用的文本" 来自人们的引言,引用的计算机输出。
terminal view
从终端捕获的文字计算机输入和输出,通常以浅灰色背景呈现。
command 可以在命令行中输入的命令名称。
VARIABLE 变量的名称或指向变量内容的指针,例如$VARNAME.
option 命令的选项,如 "命令 ls-a 选项"
argument 命令的参数,如 "阅读 man ls "
prompt 用户提示符,通常后跟您在终端窗口中键入的命令,例如hilda@home> ls-l

commandoptions arguments

命令概要或一般用法,在单独的一行上。
filename 文件或目录的名称,例如 "更改为 /usr/bin 目录。"
Key 要在键盘上敲击的键,例如 "键入 Q 退出"
Button 要单击的图形按钮,例如 OK 按钮。
菜单->选择从图形菜单中选择的选项,例如:"在您的浏览器中选择 帮助->关于 Mozilla。"
Terminology 重要的术语或概念:"Linux 内核是系统的核心。"
\
终端视图或命令概要中的反斜杠表示未完成的行。 换句话说,如果您看到一个被分成多行的长命令,\ 表示 "不要按 Enter 键!"
请参阅第 1 章链接到本指南中的相关主题。
作者 可点击链接到外部网络资源。

使用以下图像

Note这是一个注释
 

它包含其他信息或备注。

Caution这是一个警告
 

这意味着要小心。

Warning这是一个非常小心。
 

警告

Tip这是一个提示
 

提示和技巧。


10. 本文档的组织结构

本指南是 Linux 文档项目的一部分,旨在成为您可以从该项目获得的所有其他材料的基础。 因此,它为您提供任何想要开始使用 Linux 系统的人所需的基本知识,同时它试图有意识地避免重新发明热水。 因此,您可以期望本书不完整,并且充满了指向系统上、互联网上和系统文档中的其他信息来源的链接。

第一章是对 Linux 主题的介绍;接下来的两章讨论了绝对的基本命令。 第 4 章和第 5 章讨论了一些更高级但仍然基本的主题。 第 6 章是继续阅读其余部分所必需的,因为它讨论了编辑文件,这是您从 Linux 新手到 Linux 用户所需要具备的能力。 以下章节讨论了一些更高级的主题,您将在日常 Linux 使用中处理这些主题。

所有章节都附带练习,这些练习将测试您为下一章所做的准备。

  • 第 1 章:什么是 Linux,它是如何产生的,优点和缺点,Linux 的未来会怎样,谁应该使用它,安装您的计算机。

  • 第 2 章:入门,连接到系统,基本命令,在哪里找到帮助。

  • 第 3 章:文件系统,重要的文件和目录,管理文件和目录,保护您的数据。

  • 第 4 章:理解和管理进程,启动和关闭程序,推迟任务,重复性任务。

  • 第 5 章:什么是标准输入、输出和错误,以及如何从命令行中使用这些功能。

  • 第 6 章:为什么您应该学习使用编辑器,讨论最常见的编辑器。

  • 第 7 章:配置您的图形、文本和音频环境,为非母语为英语的 Linux 用户设置,添加额外软件的技巧。

  • 第 8 章:将文件转换为可打印的格式,将它们从打印机中取出,解决打印问题的提示。

  • 第 9 章:准备要备份的数据,讨论各种工具,远程备份。

  • 第 10 章:Linux 网络工具和用户应用程序的概述,简要讨论底层服务守护程序和安全网络。

  • 第 11 章:本章讨论了声音和视频,包括 IP 语音和录音。

  • 附录 A:完成阅读本书后要阅读哪些书籍以及访问哪些网站。

  • 附录 B:一个比较。

  • 附录 C:如果您遇到困难,这些表格可能会有所帮助。当你的老板坚持要你使用他最喜欢的shell时,这也是一个很好的理由。


第 1 章. 什么是 Linux?

我们将从概述 Linux 如何成为今天的操作系统开始。我们将讨论过去和未来的发展,并仔细研究该系统的优点和缺点。我们将讨论发行版、一般的开源,并尝试解释一些关于 GNU 的内容。

本章回答了以下问题

  • 什么是 Linux?

  • Linux 是在哪里以及如何开始的?

  • Linux 不是那个所有事情都在文本模式下完成的系统吗?

  • Linux 有未来还是只是炒作?

  • 使用 Linux 有什么优点?

  • 有什么缺点?

  • 有哪些类型的 Linux,我如何选择适合我的一个?

  • 什么是开源和 GNU 运动?


1.1. 历史

1.1.1. UNIX

为了理解 Linux 的普及,我们需要回到过去,大约 30 年前...

想象一下像房屋一样大,甚至是体育场的计算机。 虽然这些计算机的尺寸带来了实质性的问题,但有一件事使情况变得更糟:每台计算机都有不同的操作系统。 软件总是被定制以服务于特定目的,并且用于一个给定系统的软件不能在另一个系统上运行。 能够使用一个系统并不意味着您可以自动使用另一个系统。 这对于用户和系统管理员来说都很困难。

当时的计算机非常昂贵,即使在最初购买之后也必须做出牺牲,才能让用户理解它们的工作方式。 每个计算能力的单位总成本是巨大的。

从技术上讲,世界并没有那么先进,因此他们不得不忍受这种尺寸十年。 1969 年,贝尔实验室的开发团队开始致力于解决软件问题,以解决这些兼容性问题。 他们开发了一种新的操作系统,它是

  1. 简单而优雅。

  2. 用 C 编程语言而不是汇编代码编写。

  3. 能够回收代码。

贝尔实验室的开发人员将他们的项目命名为 "UNIX"

代码回收功能非常重要。 在此之前,所有商业上可用的计算机系统都是用专门为一个系统开发的代码编写的。 另一方面,UNIX 只需要一小段特殊代码,现在通常被称为内核。 该内核是唯一需要为每个特定系统调整的代码,并构成 UNIX 系统的基础。 操作系统和所有其他功能都围绕此内核构建,并用更高的编程语言 C 编写。该语言是专门为创建 UNIX 系统而开发的。 使用这种新技术,开发一种可以在许多不同类型的硬件上运行的操作系统要容易得多。

软件供应商很快就适应了,因为他们几乎可以毫不费力地多销售十倍的软件。 出现了奇怪的新情况:例如,想象一下来自不同供应商的计算机在同一个网络中进行通信,或者用户在不同的系统上工作,而无需额外的教育才能使用另一台计算机。 UNIX 在帮助用户与不同系统兼容方面做了很多工作。

在接下来的几十年里,UNIX 的开发一直在继续。 更多的事情变得可以做,更多的硬件和软件供应商增加了对 UNIX 的支持到他们的产品中。

UNIX 最初仅在具有大型机和小型计算机的非常大的环境中找到(请注意,PC 是一台 "微型" 计算机)。 您必须在大学、政府或大型金融公司工作才能获得 UNIX 系统。

但是较小的计算机正在开发中,到 80 年代末,许多人都有家用电脑。 到那时,PC 架构有几个版本的 UNIX 可用,但没有一个是真正免费的,更重要的是:它们都非常慢,因此大多数人在他们的家用 PC 上运行 MS DOS 或 Windows 3.1。


1.1.2. Linus 和 Linux

到 90 年代初,家用 PC 终于强大到可以运行完整的 UNIX。 Linus Torvalds 是赫尔辛基大学的一位学习计算机科学的年轻人,他认为拥有某种免费提供的学术版本的 UNIX 是个好主意,并立即开始编写代码。

他开始提出问题,寻找答案和解决方案,希望能让他的电脑运行 UNIX 系统。下面是他在 1991 年发布于 comp.os.minix 论坛上的第一批帖子之一。

From: torvalds@klaava.Helsinki.FI (Linus Benedict Torvalds)
Newsgroups: comp.os.minix
Subject: Gcc-1.40 and a posix-question
Message-ID: <1991Jul3.100050.9886@klaava.Helsinki.FI>
Date: 3 Jul 91 10:00:50 GMT
Hello netlanders,
Due to a project I'm working on (in minix), I'm interested in the posix
standard definition. Could somebody please point me to a (preferably)
machine-readable format of the latest posix rules? Ftp-sites would be
nice.

从一开始,Linus 的目标就是拥有一个完全符合原始 UNIX 标准的自由系统。这就是他要求符合 POSIX 标准的原因,POSIX 仍然是 UNIX 的标准。

在那个年代,即插即用技术尚未发明,但很多人都渴望拥有自己的 UNIX 系统,这只是一个小小的障碍。各种新型硬件的新驱动程序以不断上升的速度出现。几乎每当有新的硬件出现,就会有人购买并将其提交给 Linux 测试(因为系统逐渐被称为 Linux),从而为更广泛的硬件发布更多的免费代码。这些程序员并不止步于他们的 PC;他们能找到的每件硬件都对 Linux 有用。

那时,这些人被称为“书呆子”“怪人”,但这对他们来说无关紧要,只要支持的硬件列表越来越长。感谢这些人,Linux 现在不仅是在新 PC 上运行的理想选择,而且也是旧的和奇特的硬件的首选系统,如果没有 Linux,这些硬件将毫无用处。

在 Linus 发表帖子两年后,Linux 用户达到 12000 人。这个受业余爱好者欢迎的项目稳步增长,同时始终保持在 POSIX 标准的范围内。UNIX 的所有功能在接下来的几年中都得到了添加,从而形成了今天 Linux 这种成熟的操作系统。Linux 是一个完整的 UNIX 克隆版本,适合在工作站以及中高端服务器上使用。今天,硬件和软件市场上许多重要的参与者都拥有自己的 Linux 开发团队;在您当地的经销商处,您甚至可以购买预安装了 Linux 系统的产品,并获得官方支持——尽管仍然有很多硬件和软件不受支持。


1.1.3. Linux 系统的当前应用

如今,Linux 已经进入了桌面市场。Linux 开发人员最初专注于网络和服务,而办公应用程序一直是最后一道需要攻克的障碍。我们不喜欢承认微软统治着这个市场,因此在过去的几年中,已经启动了许多替代方案,使 Linux 成为工作站的可接受选择,提供易于使用的用户界面和 MS 兼容的办公应用程序,如文字处理器、电子表格、演示文稿等。

在服务器方面,Linux 作为一个稳定可靠的平台而闻名,为像 Amazon(著名的在线书店)、美国邮政总局、德国军队等公司提供数据库和交易服务。特别是互联网提供商和互联网服务提供商已经喜欢将 Linux 作为防火墙、代理和 Web 服务器,您会发现每个欣赏舒适管理站的 UNIX 系统管理员都能够接触到 Linux 服务器。Linux 机器集群被用于制作电影,如“泰坦尼克号”“怪物史莱克”等。在邮局,它们是邮件路由的神经中枢,在大型搜索引擎中,集群被用于执行互联网搜索。这些只是 Linux 在世界各地每天执行的数千项重型工作中的一小部分。

同样值得注意的是,现代 Linux 不仅运行在工作站、中高端服务器上,还运行在“小工具”上,如 PDA、手机、大量的嵌入式应用程序,甚至运行在实验性的手表上。这使得 Linux 成为世界上唯一覆盖如此广泛硬件的操作系统。


1.2. 用户界面

1.2.1. Linux 难学吗?

Linux 是否难学取决于您问的是谁。经验丰富的 UNIX 用户会说不,因为 Linux 是一个适合高级用户和程序员的理想操作系统,因为它一直都是由这些人开发和正在开发的。

一个优秀的程序员所能期望的一切都可用:编译器、库、开发和调试工具。这些软件包随每个标准的 Linux 发行版一起提供。C 编译器是免费提供的——与许多要求为该工具支付许可费的 UNIX 发行版不同。所有的文档和手册都在那里,并且通常包含示例来帮助您立即入门。它感觉像 UNIX,并且在 UNIX 和 Linux 之间切换是一件很自然的事情。

在 Linux 的早期,使用该系统需要一定的专业知识。那些掌握 Linux 的人感觉比其他尚未看到光明的“菜鸟”们更优越。告诉初学者“RTFM”(阅读手册)是一种常见的做法。虽然手册在每个系统上都有,但很难找到文档,即使有人找到了,解释也是用如此专业的技术术语编写的,以至于新用户很容易对学习系统失去信心。

Linux 使用社区开始意识到,如果 Linux 想在操作系统市场上成为一个重要的参与者,就必须对系统的可访问性进行一些重大改变。


1.2.2. Linux 面向非经验丰富的用户

RedHat、SuSE 和 Mandriva 等公司应运而生,提供适合大众消费的打包 Linux 发行版。他们集成了大量由社区开发的图形用户界面 (GUI),以简化程序和服务的管理。作为今天的 Linux 用户,您拥有彻底了解系统内外的所有手段,但不再需要拥有这些知识才能使系统满足您的要求。

如今,您可以图形化登录并启动所有必需的应用程序,甚至无需输入任何字符,同时如果需要,您仍然可以访问系统的核心。由于其结构,Linux 允许用户逐步深入系统:它同样适合新手和有经验的用户。新用户不会被迫做困难的事情,而有经验的用户也不会被迫以他们刚开始学习 Linux 时的方式工作。

在服务领域继续发展的同时,桌面用户也取得了巨大的成就,桌面用户通常被认为是了解系统工作原理可能性最低的群体。桌面应用程序的开发人员正在做出令人难以置信的努力,以制作您见过的最漂亮的桌面,或者使您的 Linux 机器看起来就像您以前的 MS Windows 或 Apple 工作站。最新的发展还包括 3D 加速支持和对 USB 设备的支持、系统和软件包的单次点击更新等等。Linux 拥有这些,并试图以普通人可以理解的逻辑形式呈现所有可用的服务。下面是一个简短的列表,其中包含一些很棒的示例;这些站点有很多屏幕截图,可以让您了解 Linux 在桌面上的样子。


1.3. Linux 有未来吗?

1.3.1. 开源

开源软件背后的理念非常简单:当程序员可以读取、分发和更改代码时,代码将会成熟。人们可以改编它、修复它、调试它,并且他们可以以一种使传统公司的软件开发人员的性能相形见绌的速度来完成。这种软件将比使用传统渠道开发的软件更灵活、质量更好,因为更多的人在更多不同的条件下测试过它,这是封闭软件开发人员永远无法做到的。

开源倡议开始向商业世界阐明这一点,并且商业供应商正非常缓慢地开始看到这一点。虽然许多学者和技术人员 20 年来一直坚信这是未来的发展方向,但商业供应商需要像互联网这样的应用程序才能让他们意识到他们可以从开源中获利。现在,Linux 已经超越了几乎完全是一个学术系统的阶段,仅对少数具有技术背景的人有用。现在,Linux 提供的不仅仅是操作系统:有一个完整的 infrastructure 支持着创建操作系统、为其制作和测试程序、将所有内容提供给用户、提供维护、更新、支持和定制等等的努力链条。今天,Linux 已经准备好迎接快速变化的世界的挑战。


1.3.2. 十年的经验为您服务

虽然 Linux 可能是最著名的开源倡议,但还有一个项目为 Linux 操作系统的普及做出了巨大的贡献。这个项目叫做 SAMBA,它的成就是对服务器消息块 (SMB)/通用 Internet 文件系统 (CIFS) 协议的反向工程,该协议用于在与 PC 相关的机器上进行文件和打印服务,并由 MS Windows NT 和 OS/2 以及 Linux 本地支持。现在几乎每个系统都有软件包可用,并在使用 MS Windows 协议的混合环境中提供互连解决方案:Windows 兼容(包括 WinXP)的文件和打印服务器。

也许比 SAMBA 项目更成功的是 Apache HTTP 服务器项目。该服务器运行在 UNIX、Windows NT 和许多其他操作系统上。最初被称为“A PAtCHy server”,基于现有代码和一系列的“补丁文件”,成熟代码的名称应该与以其卓越的战争策略和无穷的耐力而闻名的美洲原住民部落 Apache 联系起来。已经证明 Apache 比许多其他 Web 服务器更快、更稳定、功能更齐全。Apache 运行在每天有数百万访客的网站上,并且虽然开发人员没有提供官方支持,但 Apache 用户社区提供了您所有问题的答案。现在,许多第三方都提供商业支持。

在办公应用程序类别中,有多种 MS Office 套件克隆可供选择,从部分到完全实现了 MS Windows 工作站上可用的应用程序。这些举措在很大程度上帮助 Linux 为桌面市场所接受,因为用户不需要额外的培训来学习如何使用新系统。随着桌面的到来,普通用户也赞不绝口,不仅如此,他们的具体要求也日益复杂和苛刻。

开源社区主要由已经贡献了五年多的人组成,他们确保了 Linux 在桌面市场以及一般 IT 应用中的重要地位。受薪员工和志愿者都在努力工作,以便 Linux 能够保持在市场中的地位。用户越多,问题就越多。开源社区确保答案源源不断,并以怀疑的眼光关注答案的质量,从而实现越来越稳定和可访问性。

列出所有可用的 Linux 软件超出了本指南的范围,因为有成千上万个软件包。在本课程中,我们将向您介绍最常见的软件包,这些软件包几乎都是免费提供的。为了消除初学者的一些恐惧,这里有一张您最想要的程序之一的屏幕截图。您可以亲眼看到,为了让从 Windows 切换过来的用户感到宾至如归,我们不遗余力。

图 1-1。OpenOffice MS 兼容电子表格


1.4. Linux 的属性

1.4.1. Linux 的优点

Linux 的许多优点都源于 Linux 的起源,深深地植根于 UNIX,当然,第一个优点除外。

  • Linux 是免费的。

    他们说,就像免费啤酒一样。 如果您想完全不花钱,甚至不必支付 CD 的费用。 可以完全免费地从 Internet 下载整个 Linux。 没有注册费,没有每个用户的费用,免费更新,并且如果想要更改系统的行为,可以免费获得源代码。

    最重要的是,Linux 在于言论自由方面是自由的。

    常用的许可证是 GNU 通用公共许可证 (GPL)。 该许可证规定,任何想这样做的人都有权更改 Linux,并最终重新分发更改后的版本,但前提是该代码在重新分发后仍然可用。 实际上,您可以随意获取内核镜像,例如添加对远程传送机器或时间旅行的支持,并出售您的新代码,只要您的客户仍然可以获得该代码的副本即可。

  • Linux 可移植到任何硬件平台。

    想要销售新型计算机但不知道其新机器将运行哪种操作系统的供应商(例如,您汽车或洗衣机中的 CPU),可以获取 Linux 内核并使其在其硬件上工作,因为与此活动相关的文档可免费获得。

  • Linux 的设计目的是持续运行。

    与 UNIX 一样,Linux 系统希望始终在不重新启动的情况下运行。 这就是为什么很多任务都在夜间执行或自动安排在其他平静时段执行的原因,从而提高了繁忙时段的可用性,并更均衡地利用了硬件。 这种特性使得 Linux 也适用于人们没有时间或可能性来日夜控制其系统的环境。

  • Linux 安全且用途广泛。

    Linux 中使用的安全模型基于 UNIX 的安全理念,该理念以其稳健性和久经考验的质量而闻名。 但是,Linux 不仅适用于作为抵御来自 Internet 的敌人攻击的堡垒:它同样可以适应其他情况,并采用相同的高安全标准。 您的开发机器或控制站将与您的防火墙一样安全。

  • Linux 是可伸缩的。

    从具有 2 MB 内存的掌上电脑到具有数百个节点的 PB 级存储集群:添加或删除相应的软件包,Linux 即可满足所有需求。 您不再需要超级计算机,因为您可以使用 Linux 使用系统提供的构建块来完成大事。 如果您想做一些小事情,例如为嵌入式处理器制作操作系统,或者只是回收您的旧 486,Linux 也可以做到。

  • Linux 操作系统和大多数 Linux 应用程序的调试时间都很短。

    由于 Linux 已经由成千上万的人开发和测试,因此通常会很快发现错误和修复它们的人员。 有时,从发现错误到修复错误之间只有几个小时。


1.4.2. Linux 的缺点

  • 发行版太多了。

    “有多少人,有多少想法”,正如罗马人所说:人越多,意见就越多。 乍一看,Linux 发行版的数量可能令人恐惧或荒谬,具体取决于您的观点。 但这也意味着每个人都会找到他或她需要的东西。 您无需成为专家即可找到合适的版本。

    当被问及此事时,通常每个 Linux 用户都会说,最好的发行版是他正在使用的特定版本。 那么您应该选择哪一个? 不要太担心:所有版本都包含或多或少相同的基本软件包。 在基本软件包的基础上,添加了特殊的第三方软件,例如,使 TurboLinux 更适合中小型企业,RedHat 更适合服务器,SuSE 更适合工作站。 但是,差异可能非常表面化。 最好的策略是测试几个发行版; 遗憾的是,并非每个人都有时间这样做。 幸运的是,有很多关于选择 Linux 的建议。 在 Google 上快速搜索,使用关键字 “选择您的发行版”,会找到数十个提供良好建议的链接。 安装 HOWTO 也讨论了选择您的发行版。

  • Linux 对初学者来说不是很友好,而且令人困惑。

    必须说的是,Linux,至少是核心系统,在用户友好性方面不如 MS Windows,而且肯定比 MacOS 更难,但是…… 鉴于其受欢迎程度,人们已经付出了巨大的努力来使 Linux 更易于使用,特别是对于新用户。 每天都会发布更多信息,例如本指南,以帮助填补可供各个级别的用户使用的文档的空白。

  • 开源产品值得信赖吗?

    免费的东西怎么会可靠呢? Linux 用户可以选择是否使用 Linux,与没有这种自由的专有软件用户相比,这给他们带来了巨大的优势。 经过长时间的测试,大多数 Linux 用户得出的结论是,Linux 不仅一样好,而且在许多情况下比传统解决方案更好更快。 如果 Linux 不值得信赖,它早就消失了,永远不会知道它现在拥有的受欢迎程度,拥有数百万用户。 现在,用户可以影响他们的系统并与社区分享他们的评论,因此系统每天都在变得更好。 确实,这是一个永远不会完成的项目,但在一个不断变化的环境中,Linux 也是一个不断努力追求完美的项目。


1.5. Linux 的风格

1.5.1. Linux 和 GNU

尽管 Linux 的实现有很多种,但您会在不同的发行版中发现很多相似之处,如果只是因为每台 Linux 机器都是一个装有构建块的盒子,您可以根据自己的需求和观点将它们组合在一起。 安装系统只是长期关系的开始。 就在您认为自己拥有一个运行良好的系统时,Linux 会激发您的想象力和创造力,并且您越意识到系统可以给您带来的力量,您就越会尝试重新定义其限制。

根据发行版、您的硬件和个人品味,Linux 可能看起来不同,但所有图形和其他接口构建的基础仍然相同。 Linux 系统基于 GNU 工具(Gnu's Not UNIX),它提供了一套处理和使用系统的标准方法。 所有 GNU 工具都是开源的,因此可以安装在任何系统上。 大多数发行版都提供最常见工具的预编译软件包,例如 RedHat 上的 RPM 软件包和 Debian 上的 Debian 软件包(也称为 deb 或 dpkg),因此您无需成为程序员即可在系统上安装软件包。 但是,如果您是并且喜欢自己做事,那么您会更喜欢 Linux,因为大多数发行版都带有一整套开发工具,允许纯粹从源代码安装新软件。 此设置还允许您安装软件,即使它不存在于适合您系统的预打包形式中。

常用 GNU 软件列表

  • Bash:GNU shell

  • GCC:GNU C 编译器

  • GDB:GNU 调试器

  • Coreutils:一组基本的 UNIX 风格的实用程序,例如 lscatchmod

  • Findutils:用于搜索和查找文件

  • Fontutils:将字体从一种格式转换为另一种格式或制作新字体

  • The Gimp:GNU 图像处理程序

  • Gnome:GNU 桌面环境

  • Emacs:一个非常强大的编辑器

  • GhostscriptGhostview:PostScript 文件的解释器和图形前端。

  • GNU Photo:用于与数码相机交互的软件

  • Octave:一种编程语言,主要用于执行数值计算和图像处理。

  • GNU SQL:关系数据库系统

  • Radius:远程身份验证和计费服务器

  • ...

许多商业应用程序可用于 Linux,有关这些软件包的更多信息,请参阅其特定文档。 在本指南中,我们将仅讨论免费提供的软件,这些软件(在大多数情况下)附带 GNU 许可证。

要安装缺失或新的软件包,您将需要某种形式的软件管理。 最常见的实现包括 RPM 和 dpkg。 RPM 是 RedHat 软件包管理器,它用于各种 Linux 系统上,即使名称并未暗示这一点。 Dpkg 是 Debian 软件包管理系统,它使用一个名为 apt-get 的接口,该接口也可以管理 RPM 软件包。 Novell Ximian Red Carpet 是具有图形前端的 RPM 的第三方实现。 其他第三方软件供应商可能有自己的安装程序,有时类似于 MS Windows 和其他平台上已知的 InstallShield 等。 随着您深入 Linux,您可能会接触到这些程序中的一个或多个。


1.5.2. GNU/Linux

Linux 内核(您系统的骨架,请参阅 第 3.2.3.1 节)不是 GNU 项目的一部分,但使用与 GNU 软件相同的许可证。 大多数实用程序和开发工具(您系统的),它们不是 Linux 特有的,而是从 GNU 项目中获取的。 因为任何可用的系统都必须包含内核和至少一组最少的实用程序,所以有些人认为这样的系统应该被称为 GNU/Linux 系统。

为了获得发行版之间尽可能高的独立性,这是我们将在本课程中讨论的那种 Linux。 如果我们不是在谈论 GNU/Linux 系统,则将提及特定的发行版、版本或程序名称。


1.5.3. 我应该安装哪个发行版?

在安装之前,最重要的因素是您的硬件。 由于每个 Linux 发行版都包含基本软件包,并且可以构建以满足几乎任何要求(因为它们都使用 Linux 内核),因此您只需要考虑该发行版是否可以在您的硬件上运行。 例如,LinuxPPC 是为在 Apple 和其他 PowerPC 上运行而制作的,并且不能在普通的基于 x86 的 PC 上运行。 LinuxPPC 确实可以在新的 Mac 上运行,但您不能将其用于某些具有古老总线技术的旧 Mac。 另一个棘手的情况是 Sun 硬件,它可能是旧的 SPARC CPU 或较新的 UltraSparc,两者都需要不同版本的 Linux。

有些 Linux 发行版针对某些处理器进行了优化,例如 Athlon CPU,但同时也能在标准的 486、586 和 686 Intel 处理器上良好运行。有时,用于特殊 CPU 的发行版不太可靠,因为测试的人员较少。

大多数 Linux 发行版都为通用 PC 提供了一组程序,其中包含针对基于 x86 Intel 的 CPU 优化的内核的特殊软件包。这些发行版经过了良好的测试和定期维护,侧重于可靠的服务器实现以及简易的安装和更新程序。例如 Debian、Ubuntu、Fedora、SuSE 和 Mandriva,它们是迄今为止最流行的 Linux 系统,通常被认为易于新手用户上手,同时也不会妨碍专业人士充分利用他们的 Linux 机器。 Linux 在笔记本电脑和中端服务器上也运行良好。只有经过广泛的测试后,才会包含新硬件的驱动程序,这增加了系统的稳定性。

虽然在一个系统上标准桌面可能是 Gnome,但另一个系统默认可能提供 KDE。通常,所有主要的 Linux 发行版都提供 GnomeKDE。 其他窗口和桌面管理器可供更高级的用户使用。

标准安装过程允许用户选择不同的基本设置,例如工作站,在工作站上安装日常使用和开发所需的所有软件包,或者服务器安装,可以选择不同的网络服务。专家用户可以在初始安装过程中安装他们想要的软件包的每种组合。

本指南的目标是适用于所有 Linux 发行版。但是,为了您自己的方便,强烈建议初学者坚持使用主流发行版,这些发行版默认支持所有常见的硬件和应用程序。以下是新手的非常好的选择

可以从 LinuxISO.org 获取可下载的 ISO 镜像。主要发行版可以在任何像样的电脑商店购买。


1.6. 总结

在本章中,我们了解到

  • Linux 是 UNIX 的一种实现。

  • Linux 操作系统是用 C 编程语言编写的。

  • "De gustibus et coloribus non disputandum est":总有一款 Linux 适合您。

  • Linux 使用 GNU 工具,这是一套免费提供的标准工具,用于处理操作系统。


1.7. 练习

适合初学者的实践练习:在您的 PC 上安装 Linux。阅读您的发行版的安装手册和/或安装 HOWTO 并执行安装。

Note阅读文档!
 

大多数错误源于没有阅读安装过程中提供的信息。仔细阅读安装消息是走向成功的第一步。

开始 Linux 安装之前您必须知道的事情

  • 此发行版可以在我的硬件上运行吗?

    如果您对硬件的兼容性有疑问,请查看 http://www.tldp.org/HOWTO/Hardware-HOWTO/index.html

  • 我有什么类型的键盘(按键数量,布局)?我有什么类型的鼠标(串口/并口,按钮数量)?有多少 MB 的 RAM?

  • 我将安装基本工作站还是服务器,或者我是否需要自己选择特定的软件包?

  • 我将从硬盘、CD-ROM 或使用网络安装?我应该为此调整 BIOS 吗?安装方法是否需要启动盘?

  • Linux 将是这台计算机上唯一的系统,还是将是双引导安装?我应该创建一个大分区以便以后安装虚拟机,还是这本身就是一个虚拟安装?

  • 这台电脑是否在网络中?它的主机名、IP 地址是什么?是否有任何网关服务器或其他重要的联网机器我的盒子应该与之通信?

    CautionLinux 希望联网
     

    不使用网络或错误地配置网络可能会导致启动缓慢。

  • 这台电脑是网关/路由器/防火墙吗? (如果您必须考虑这个问题,它可能不是。)

  • 分区:这次让安装程序为您执行分区,我们将在 第 3 章 中详细讨论分区。如果您想了解有关分区的所有信息,可以查阅特定于系统的文档。如果您的 Linux 发行版不提供默认分区,那可能意味着它不适合初学者。

  • 这台机器将在文本模式还是图形模式下启动?

  • 为这台机器的管理员(root)想一个好密码。创建一个非 root 用户帐户(对系统的非特权访问)。

  • 我需要救援盘吗?(推荐)

  • 我需要哪些语言?

完整的清单可以在 http://www.tldp.org/HOWTO/Installation-HOWTO/index.html 找到。

在接下来的章节中,我们将了解安装是否成功。


第 2 章. 快速入门

为了充分利用本指南,我们将立即开始一个关于连接到 Linux 系统并执行一些基本操作的实用章节。

我们将讨论

  • 连接到系统

  • 断开与系统的连接

  • 文本和图形模式

  • 更改您的密码

  • 在文件系统中导航

  • 确定文件类型

  • 查看文本文件

  • 查找帮助


2.1. 登录、激活用户界面和注销

2.1.1. 介绍

为了直接在 Linux 系统上工作,您需要提供用户名和密码。您始终需要向系统进行身份验证。正如我们在 第 1 章 的练习中已经提到的,大多数基于 PC 的 Linux 系统有两种基本模式可以运行:要么在文本控制台模式下快速而清醒地运行,这看起来像带有鼠标、多任务和多用户功能的 DOS,要么在图形模式下运行,这看起来更好,但会消耗更多的系统资源。


2.1.2. 图形模式

这是当今大多数台式计算机上的默认设置。当您首先被要求输入用户名,然后在新窗口中输入密码时,您就知道您将使用图形模式连接到系统。

要登录,请确保鼠标指针位于登录窗口中,向系统提供您的用户名和密码,然后单击 确定 或按 Enter 键。

Warning小心 root 帐户!
 

通常认为使用 root 用户名(系统管理员帐户)以(图形方式)连接是个坏主意,因为图形的使用包括运行大量额外的程序,在 root 的情况下具有大量额外的权限。为了尽可能降低所有风险,请使用普通用户帐户以图形方式连接。但是,作为一般建议,请牢记这一点,以用于 root 帐户的所有用途:只有在需要额外权限时才以 root 身份登录。

输入您的用户名/密码组合后,可能需要一段时间才能启动图形环境,具体取决于您计算机的 CPU 速度、您使用的软件以及您的个人设置。

要继续,您需要打开一个终端窗口或简称为 xterm(X 是支持图形环境的基础软件的名称)。可以在 应用程序->实用工具系统工具互联网 菜单中找到此程序,具体取决于您使用的窗口管理器。可能有一些图标可以用作获取 xterm 窗口的快捷方式,并且在桌面背景上单击鼠标右键通常会为您提供一个包含终端窗口应用程序的菜单。

在浏览菜单时,您会注意到,无需通过键盘输入命令即可完成很多事情。对于大多数用户来说,处理计算机的好旧的点击方法就足够了。但是,本指南适用于未来的网络和系统管理员,他们需要干预系统的核心。他们需要比鼠标更强大的工具来处理他们将面临的所有任务。这个工具是 shell,当处于图形模式时,我们通过打开终端窗口来激活我们的 shell。

终端窗口是您的系统控制面板。几乎所有后续操作都是使用这个简单但功能强大的文本工具完成的。终端窗口在您打开时应始终显示一个命令提示符。此终端显示一个标准提示符,显示用户的登录名和当前工作目录,由波浪号 (~):

图 2-1. 终端窗口

提示符的另一种常见形式是这样的

[user@host dir]

在上面的示例中,user 将是您的登录名,hosts 是您正在使用的机器的名称,dir 指示您在文件系统中的当前位置。

稍后我们将详细讨论提示符及其行为。现在,知道提示符可以显示各种信息就足够了,但它们不是您给系统发出的命令的一部分。

要在图形模式下断开与系统的连接,您需要关闭所有终端窗口和其他应用程序。之后,点击注销图标或在菜单中找到 注销。关闭所有内容实际上没有必要,系统可以为您执行此操作,但是会话管理可能会将所有当前打开的应用程序放回您的屏幕上,以便您再次连接,这需要更长的时间,并且并非总是期望的效果。但是,此行为是可配置的。

当您再次看到登录屏幕,要求输入用户名和密码时,注销就成功了。

NoteGnome 还是 KDE?
 

我们已经多次提到 GnomeKDE 桌面。这是两种最流行的桌面管理方式,当然还有很多其他方式。无论您选择哪个桌面,只要您知道如何打开终端窗口即可。但是,我们将继续以 GnomeKDE 作为实现某些任务的最流行方式进行说明。


2.1.3. 文本模式

当整个屏幕是黑色的,显示(大多数情况下是白色)字符时,您就知道您处于文本模式。文本模式登录屏幕通常会显示有关您正在使用的机器的一些信息,机器的名称以及等待您登录的提示符。

RedHat Linux Release 8.0 (Psyche)

blast login: _




登录与图形登录不同,您必须在提供用户名后按 Enter 键,因为屏幕上没有可供鼠标点击的按钮。然后,您应该键入密码,然后再次按 Enter。您不会看到任何表明您正在输入任何内容的迹象,甚至连星号都没有,也不会看到光标移动。但这是 Linux 上的正常现象,这样做是为了安全起见。

当系统接受您为有效用户时,您可能会收到更多信息,称为每日消息,它可以是任何内容。此外,在 UNIX 系统上流行显示 fortune cookie,其中包含一些一般的智慧或不明智(这取决于您)的想法。之后,您将获得一个 shell,其提示符与在图形模式下获得的提示符相同。

Warning不要以 root 用户身份登录
 

同样在文本模式下:仅以 root 用户身份登录以执行绝对需要管理员权限的设置和配置,例如添加用户、安装软件包以及执行网络和其他系统配置。 完成后,立即离开特殊帐户并以非特权用户身份恢复工作。或者,某些系统(如 Ubuntu)会强制您使用 sudo,因此您不需要直接访问管理帐户。

注销是通过输入 logout 命令,然后按 Enter 来完成的。当您再次看到登录屏幕时,您已成功与系统断开连接。

Caution电源按钮
 

虽然 Linux 并非设计为在没有应用适当的停止系统程序的情况下关闭,但在较新的系统上,按下电源按钮等同于启动这些程序。但是,在不经过停止过程的情况下关闭旧系统可能会导致严重损坏!如果您想确定,请始终在从图形界面注销时使用 关闭 选项,或者在登录屏幕(您必须提供用户名和密码)上查找关闭按钮。

现在我们知道了如何连接和断开与系统的连接,我们准备好学习我们的第一个命令了。


2.2. 基本知识

2.2.1. 命令

这些是快速入门命令,我们需要它们才能开始;我们将在后面更详细地讨论它们。

表 2-1. 快速入门命令

命令含义
ls

显示当前工作目录中的文件列表,类似于 DOS 中的 dir 命令

cd目录

更改目录

passwd更改当前用户的密码
filefilename显示具有名称的文件类型filename
cat文本文件在屏幕上显示文本文件内容
pwd显示当前工作目录
exitlogout离开此会话
mancommand阅读关于 command 的 man 手册页
infocommand阅读关于 command 的 Info 页
apropos字符串在 *whatis* 数据库中搜索字符串

2.2.2. 一般说明

您可以在提示符后,在图形模式或文本模式下的终端窗口中键入这些命令,然后按 Enter

可以单独发出命令,例如 ls。当您指定选项时,命令的行为会有所不同,选项通常以短划线 (-) 开头,如 ls -a 中所示。相同的选项字符可能对另一个命令具有不同的含义。GNU 程序采用长选项,以两个短划线 (--) 开头,如 ls --all。有些命令没有选项。

命令的参数是您希望命令生效的对象规范。一个例子是 ls /etc,其中目录/etcls 命令的参数。 这表明您想要查看该目录的内容,而不是默认内容(即当前目录的内容),只需键入 ls,然后按 Enter 即可获得当前目录的内容。有些命令需要参数,有时参数是可选的。

您可以通过查看该命令的在线帮助来了解命令是否采用选项和参数,以及哪些选项和参数有效,请参见 第 2.3 节

在 Linux 中,与在 UNIX 中一样,目录使用正斜杠分隔,就像在网址 (URL) 中使用的那样。我们将在后面深入讨论目录结构。

符号 . 和 .. 在涉及目录时具有特殊含义。我们将在练习中尝试了解这些符号,并在下一章中了解更多。

尽量避免以系统管理员帐户root 登录或使用该帐户。 除了完成您的日常工作外,大多数任务(包括检查系统、收集信息等)都可以使用没有任何特殊权限的普通用户帐户执行。 如果需要,例如在创建新用户或安装新软件时,获得 root 访问权限的首选方法是切换用户 ID,请参见 第 3.2.1 节 获取示例。

本书中的几乎所有命令都可以在没有系统管理员权限的情况下执行。 在大多数情况下,以非特权用户身份发出命令或启动程序时,当需要 root 访问权限时,系统会警告您或提示您输入 root 密码。 完成后,立即离开授予您 root 权限的应用程序或会话。

阅读文档应该成为您的第二天性。 尤其是在开始时,阅读系统文档、基本命令手册、HOWTO 等非常重要。 由于文档数量非常庞大,因此不可能包含所有相关文档。 本书将尝试引导您查阅每个讨论主题上最合适的文档,以鼓励阅读 man 手册页的习惯。


2.2.3. 使用 Bash 功能

通过几个特殊的按键组合,您可以更轻松、更快速地使用 GNU shell,Bash,它是几乎所有 Linux 系统上的默认 shell,请参见 第 3.2.3.2 节。 以下是最常用的功能列表;强烈建议您养成使用它们的习惯,以便从一开始就充分利用您的 Linux 体验。

表 2-2. Bash 中的按键组合

键或按键组合功能
Ctrl+A将光标移动到命令行的开头。
Ctrl+C结束正在运行的程序并返回提示符,请参见 第 4 章
Ctrl+D注销当前 shell 会话,相当于键入 exitlogout
Ctrl+E将光标移动到命令行的末尾。
Ctrl+H生成退格字符。
Ctrl+L清除此终端。
Ctrl+R搜索命令历史记录,请参见 第 3.3.3.4 节
Ctrl+Z暂停程序,请参见 第 4 章
ArrowLeftArrowRight在命令行上将光标向左或向右移动一个位置,以便您可以在开头和结尾以外的其他位置插入字符。
ArrowUpArrowDown浏览历史记录。转到要重复的行,必要时编辑详细信息,然后按 Enter 以节省时间。
Shift+PageUpShift+PageDown浏览终端缓冲区(查看已“滚动出”屏幕的文本)。
Tab命令或文件名补全;当有多个选择时,系统会发出音频或视觉提示,或者,如果可能的选择太多,则会询问您是否要查看所有选择。
Tab Tab显示文件或命令补全的可能性。

上表中的最后两项可能需要一些额外的解释。 例如,如果您要更改为目录directory_with_a_very_long_name,您不会键入这个很长的名称,不。 您只需在命令行上键入 cd dir,然后按 Tab,如果没有任何其他文件以相同的三个字符开头,则 shell 会为您完成名称。 当然,如果没有其他以 "d" 开头的项目,那么您也可以只键入 cd d,然后按 Tab。 如果多个文件以相同的字符开头,shell 会向您发出信号,然后您可以短时间内按 Tab 两次,shell 会显示您可以进行的选择。

your_prompt> cd st
starthere	 stuff		stuffit

在上面的示例中,如果在前两个字符后键入 "a" 并再次按 Tab,则不再有其他可能性,shell 会完成目录名称,而无需您键入字符串 "rthere"

your_prompt> cd starthere

当然,您仍然需要按 Enter 才能接受此选择。

在同一个例子中,如果您输入 "u",然后按 Tab,shell 会为您添加 "ff",但随后它会再次抗议,因为有多种选择是可能的。 如果您再次键入 Tab Tab,您将看到这些选择;如果您键入一个或多个使系统对选择明确的字符,然后再次 Tab,或者当您到达要选择的文件名结尾时按 Enter,shell 会完成文件名并将您更改为该目录 - 如果它确实是一个目录名。

这适用于作为命令参数的所有文件名。

命令名称补全也是如此。 键入 ls,然后按 Tab 键两次,将列出您的PATH(请参见 第 3.2.1 节)中以这两个字符开头的所有命令。

your_prompt> ls
ls           lsdev        lspci        lsraid       lsw
lsattr       lsmod        lspgpot      lss16toppm
lsb_release  lsof         lspnp        lsusb

2.3. 获取帮助

2.3.1. 警告

GNU/Linux 的宗旨是让用户更加自力更生。与这个系统的惯例一样,有很多方法可以实现这个目标。一个常见的寻求帮助的方式是寻找懂行的人。无论 Linux 用户社区多么有耐心和爱好和平,几乎所有人都会希望你在询问他们之前已经尝试过本节中的一种或多种方法。如果你被证明没有遵循这个基本规则,那么他们表达观点的方式可能会相当严厉。


2.3.2. man pages(手册页)

很多初学者害怕 man (manual) pages(手册页),因为它们是海量的文档来源。然而,它们非常有结构化,你将从下面的例子中看到:man man

阅读 man pages(手册页)通常在图形模式下的终端窗口中完成,或者如果你喜欢,也可以直接在文本模式下完成。在提示符下输入命令,然后按 Enter 键。

yourname@yourcomp ~> man man

按下 Enter 键后,关于 man 的文档将显示在你的屏幕上。

man(1)                                                         man(1)



NAME
 man - format and display the on-line manual pages
 manpath - determine user's search path for man pages

SYNOPSIS
 man [-acdfFhkKtwW] [--path] [-m system] [-p string] [-C config_file]
 [-M pathlist] [-P pager] [-S section_list] [section] name ...


DESCRIPTION
 man formats and displays the on-line manual pages.  If you specify
 section, man only looks in that section of the manual.  
 name is normally the name of the manual page, which is typically the 
 name of a  command, function, or file.  However, if name contains a 
 slash (/) then man interprets it as a file specification, so that you
 can do man ./foo.5 or even man /cd/foo/bar.1.gz.

 See  below  for  a  description  of where man looks for the manual
 page files.

OPTIONS
 -C  config_file
lines 1-27

使用空格键浏览到下一页。你可以使用 b 键返回到上一页。当你到达末尾时,man 通常会退出,你将返回到提示符。如果你想在到达末尾之前离开 man page(手册页),或者如果查看器没有在页面末尾自动退出,则键入 q

Note分页器(Pagers)
 

用于操作 man pages(手册页)的可用组合键取决于你的发行版中使用的分页器(pager)。大多数发行版使用 less 来查看 man pages(手册页)并进行滚动。有关分页器的更多信息,请参见第 3.3.4.2 节

每个 man page(手册页)通常包含几个标准部分,正如我们可以从 man man 示例中看到的那样。

  • 第一行包含你正在阅读的命令的名称,以及此 man page(手册页)所在的章节 ID。这些 man pages(手册页)按章节排序。命令可能具有多个 man pages(手册页),例如用户部分的 man page(手册页)、系统管理部分的 man page(手册页)和程序员部分的 man page(手册页)。

  • 给出命令的名称和简短描述,用于构建 man pages(手册页)的索引。你可以使用 apropos 命令在此索引中查找任何给定的搜索字符串。

  • 命令的概要提供了此命令可以接受的所有选项和/或参数的技术符号。你可以将选项视为执行命令的一种方式。参数是你对其执行操作的对象。一些命令没有选项或没有参数。可选的选项和参数放在 "[""]" 之间,以表明它们可以省略。

  • 给出了命令的更长描述。

  • 列出了带有描述的选项。选项通常可以组合使用。如果不是这样,本节会告诉你。

  • 环境描述了影响此命令行为的 shell 变量(并非所有命令都具有此项)。

  • 有时会提供特定于此命令的部分。

  • "SEE ALSO" 部分中提供了对其他 man pages(手册页)的引用。括号之间是要查找此命令的 man page(手册页)部分的编号。有经验的用户经常使用 / 命令后跟搜索字符串切换到 "SEE ALSO" 部分SEE并按下 Enter

  • 通常还有关于已知错误(异常)的信息以及报告你可能发现的新错误的位置。

  • 可能还会有作者和版权信息。

一些命令具有多个 man pages(手册页)。例如,passwd 命令在第 1 节中有一个 man page(手册页),在第 5 节中还有另一个。默认情况下,显示编号最低的 man page(手册页)。如果要查看默认值之外的其他章节,请在 man 命令后指定它。

man5 passwd

如果你想一个接一个地查看有关某个命令的所有 man pages(手册页),请使用-ato man

man-a passwd

这样,当你到达第一个 man page(手册页)的末尾并再次按下 SPACE 时,将显示下一个部分的 man page(手册页)。


2.3.3. 更多信息

2.3.3.1. Info pages(信息页)

除了 man pages(手册页)之外,你还可以使用 info 命令阅读有关命令的 Info pages(信息页)。这些通常包含更新的信息,并且更易于使用。某些命令的 man pages(手册页)引用 Info pages(信息页)。

在终端窗口中键入 info info 以开始。

File: info.info,  Node: Top,  Next: Getting Started,  Up: (dir)

Info: An Introduction
*********************

   Info is a program, which you are using now, for reading
documentation of computer programs.  The GNU Project distributes most
of its on-line manuals in the Info format, so you need a program called
"Info reader" to read the manuals.  One of such programs you are using
now.

   If you are new to Info and want to learn how to use it, type the
command `h' now.  It brings you to a programmed instruction sequence.

   To learn advanced Info commands, type `n' twice.  This brings you to
`Info for Experts', skipping over the `Getting Started' chapter.

* Menu:

* Getting Started::             Getting started using an Info reader.
* Advanced Info::               Advanced commands within Info.
* Creating an Info File::       How to make your own Info file.
--zz-Info: (info.info.gz)Top, 24 lines --Top-------------------------------
Welcome to Info version 4.2. Type C-h for help, m for menu item.

使用箭头键浏览文本并将光标移动到以星号开头的行上,其中包含你要了解的信息的关键字,然后点击 Enter。使用 PN 键转到上一个或下一个主题。空格键会将你移到下一页,无论这是启动一个新主题还是另一个命令的 Info page(信息页)。使用 Q 退出。info 程序有更多信息。


2.3.3.2. whatis 和 apropos 命令

可以使用 whatis 命令获得命令解释的简短索引,如下例所示

[your_prompt] whatis ls
ls                   (1)  - list directory contents

这会显示有关命令的简短信息,以及 man pages(手册页)集合中包含相应页面的第一个部分。

如果你不知道从哪里开始以及要阅读哪个 man page(手册页),apropos 会提供更多信息。假设你不知道如何启动浏览器,那么你可以输入以下命令

another prompt> apropos browser
Galeon [galeon](1)  - gecko-based GNOME web browser
lynx           (1)  - a general purpose distributed information browser 
	            for the World Wide Web
ncftp          (1)  - Browser program for the File Transfer Protocol
opera          (1)  - a graphical web browser
pilot          (1)  - simple file system browser in the style of the 
		    Pine Composer
pinfo          (1)  - curses based lynx-style info browser
pinfo [pman]   (1)  - curses based lynx-style info browser
viewres        (1x)  - graphical class browser for Xt

按下 Enter 后,你将看到你的机器上有很多与浏览器相关的东西:不仅有 Web 浏览器,还有文件和 FTP 浏览器以及文档浏览器。如果你安装了开发包,你可能还有处理编写与浏览器相关的程序的随附 man pages(手册页)。通常,第 1 节中的 man page(手册页)的命令(即标有 "(1)" 的命令)适合作为用户进行尝试。因此,发出上述 apropos 命令的用户可能会尝试启动命令 galeonlynxopera,因为这些命令显然与浏览万维网有关。


2.3.3.3. --help 选项

大多数 GNU 命令都支持--help,它给出了关于如何使用该命令的简短解释以及可用选项的列表。下面是 cat 命令使用此选项的输出

userprompt@host: cat --help
Usage: cat [OPTION] [FILE]...
Concatenate FILE(s), or standard input, to standard output.

  -A, --show-all           equivalent to -vET
  -b, --number-nonblank    number nonblank output lines
  -e                       equivalent to -vE
  -E, --show-ends          display $ at end of each line
  -n, --number             number all output lines
  -s, --squeeze-blank      never more than one single blank line
  -t                       equivalent to -vT
  -T, --show-tabs          display TAB characters as ^I
  -u                       (ignored)
  -v, --show-nonprinting   use ^ and M- notation, 
			   except for LFD and TAB
      --help     display this help and exit
      --version  output version information and exit

With no FILE, or when FILE is -, read standard input.

Report bugs to <bug-textutils@gnu.org>.

2.3.3.4. 图形帮助

如果你更喜欢图形用户界面,请不要绝望。Konqueror,默认的 KDE 文件管理器,提供了轻松而丰富多彩的 man 和 Info 页面的访问方式。你可能想在位置地址栏中尝试 "info:info",你将获得关于 info 命令的可浏览的 Info page(信息页)。同样,"man:ls" 将向你显示 ls 命令的 man page(手册页)。你甚至可以获得命令名称补全:你将看到以 "ls" 开头的所有命令的 man pages(手册页)在下拉菜单中。在地址位置工具栏中输入 "info:/dir" 会显示所有 Info pages(信息页),并按实用程序类别排列。优秀的 帮助 内容,包括 Konqueror 手册。从菜单启动或在终端窗口中键入命令 konqueror,然后按 Enter;请参见下面的屏幕截图。

图 2-2. Konqueror 作为帮助浏览器

Gnome 帮助浏览器也非常用户友好。你可以通过从 Gnome 菜单中选择 应用程序->帮助,点击桌面上的救生员图标或在终端窗口中输入命令 gnome-help 来启动它。系统文档和 man pages(手册页)可以通过简单的界面轻松浏览。

nautilus 文件管理器提供了 man 和 Info 页面的可搜索索引,它们可以轻松浏览和相互链接。Nautilus 可以从命令行启动,或者点击你的主目录图标,或者从 Gnome 菜单启动。

用于系统文档的 GUI 的最大优点是所有信息都完全相互链接,因此你可以点击 "SEE ALSO" 部分以及其他 man pages(手册页)的链接,从而浏览和获取知识而不会中断数小时。


2.3.3.5. 例外情况

一些命令没有单独的文档,因为它们是另一个命令的一部分。cdexitlogoutpwd 就是这样的例外。它们是你的 shell 程序的一部分,被称为 shell 内置命令。有关这些命令的信息,请参阅你的 shell 的 man 或 info page(手册页)。大多数 Linux 初学者都有 Bash shell。有关 shell 的更多信息,请参见第 3.2.3.2 节

如果你一直在更改原始系统配置,则 man pages(手册页)可能仍然存在,但由于你的 shell 环境已更改而不可见。在这种情况下,你需要检查MANPATH变量。如何在第 7.2.1.2 节中解释了如何执行此操作。

一些程序或软件包仅在目录中有一组指令或引用/usr/share/doc。请参见第 3.3.4 节进行显示。

在最坏的情况下,你可能由于意外而从系统中删除了文档(希望是意外,因为故意这样做是一个非常糟糕的主意)。在这种情况下,首先尝试使用搜索工具确保确实没有任何合适的剩余内容,请继续阅读第 3.3.3 节。如果是这样,你可能需要重新安装包含文档应用到的命令的软件包,请参见第 7.5 节


2.4. 总结

Linux 传统上以文本模式或图形模式运行。由于如今 CPU 能力和 RAM 不再是成本问题,因此每个 Linux 用户都可以负担得起以图形模式工作,并且通常会这样做。这并不意味着你不需要了解文本模式:我们将在本课程中始终在文本环境中使用终端窗口。

Linux 鼓励其用户获取知识并变得独立。不可避免地,你将不得不阅读大量文档来实现这一目标;这就是为什么你会注意到,我们几乎针对本书中列出的每个命令、工具和问题都引用了额外的文档。你阅读的文档越多,它就会变得越容易,你浏览手册的速度也会越快。尽快养成阅读文档的习惯。当你不知道问题的答案时,参考文档应该成为一种第二天性。

我们已经学习了一些命令

表 2-3. 第 2 章中的新命令:基础知识

命令含义
apropos搜索有关命令或主题的信息。
cat显示一个或多个文件的内容。
cd更改为另一个目录。
exit离开 shell 会话。
file获取有关文件内容的信息。
info阅读有关命令的 Info pages(信息页)。
logout离开 shell 会话。
ls列出目录内容。
man阅读命令的手册页。
passwd更改你的密码。
pwd显示当前工作目录。

2.5. 练习

我们所学的大部分内容都是通过犯错误和看到事情如何出错来实现的。这些练习旨在让你阅读一些错误消息。你执行这些练习的顺序很重要。

不要忘记在命令行上使用 Bash 功能:尽量通过输入尽可能少的字符来完成练习!


2.5.1. 连接和断开连接

  • 确定你是在文本模式下还是在图形模式下工作。

    我正在文本/图形模式下工作。(划掉不适用的)

  • 使用你在安装过程中为你自己创建的用户名和密码登录。

  • 注销。

  • 再次登录,使用一个不存在的用户名

    -> 会发生什么?


2.5.2. 密码

使用你的用户名和密码再次登录。

  • 将你的密码更改为P6p3.aa! 并敲击 Enter 键。

    -> 会发生什么?

  • 再次尝试,这次输入一个非常简单的密码,比如123aaa

    -> 会发生什么?

  • 再次尝试,这次不要输入密码,只需敲击 Enter 键。

    -> 会发生什么?

  • 尝试使用命令 psswd 代替 passwd

    -> 会发生什么?

Warning新密码
 

除非你将密码改回本次练习之前的密码,否则它将是 "P6p3.aa!"。请在本次练习后更改你的密码!

请注意,某些系统可能不允许回收密码,即在一定时间内或一定数量的密码更改内恢复原始密码,或两者兼有。


2.5.3. 目录

这些是一些帮助你获得感觉的练习。

  • 输入命令 cd blah

    -> 会发生什么?

  • 输入命令 cd ..

    注意 "cd" 和 ".." 之间的空格!使用 pwd 命令。

    -> 会发生什么?

  • 使用 ls 命令列出目录内容。

    -> 你看到了什么?

    -> 你认为这些是什么?

    -> 使用 pwd 命令检查。

  • 输入 cd 命令。

    -> 会发生什么?

  • 重复步骤 2 两次。

    -> 会发生什么?

  • 显示此目录的内容。

  • 尝试命令 cd root

    -> 会发生什么?

    -> 你有权访问哪些目录?

  • 重复步骤 4。

    你知道还有其他方法可以到达你现在的位置吗?


2.5.4. 文件

  • 将目录更改为/然后到等等。键入 ls;如果输出比你的屏幕长,请放大窗口,或者尝试 Shift+PageUpShift+PageDown

    文件inittab包含此列表中第一个问题的答案。尝试对它使用 file 命令。

    -> 我的文件类型inittab是.....

  • 使用命令 cat inittab 并读取文件。

    -> 你的计算机的默认模式是什么?

  • 使用 cd 命令返回你的主目录。

  • 输入命令 file .

    -> 这是否有助于找到 "." 的含义?

  • 你可以使用 cat 命令查看 "." 吗?

  • 显示 cat 程序的帮助,使用--help选项。使用用于对输出行进行编号的选项来计算文件 /etc/passwd 中列出了多少用户/etc/passwd.


2.5.5. 获取帮助

  • 阅读 man intro

  • 阅读 man ls

  • 阅读 info passwd

  • 输入 apropos pwd 命令。

  • 尝试对 cd 使用 maninfo

    -> 你如何了解更多关于 cd 的信息?

  • 阅读 ls --help 并尝试一下。


第 3 章。关于文件和文件系统

第 2 章 中的初步探索之后,我们准备更详细地讨论 Linux 系统上的文件和目录。许多用户在使用 Linux 时遇到困难,因为他们缺乏关于哪种数据保存在哪些位置的概述。我们将尝试阐明文件在文件系统中的组织方式。

我们还将列出最重要的文件和目录,并使用不同的方法查看这些文件的内容,并学习如何创建、移动和删除文件和目录。

完成本章的练习后,你将能够

  • 描述 Linux 文件系统的布局

  • 显示和设置路径

  • 描述最重要的文件,包括内核和 shell

  • 查找丢失的和隐藏的文件

  • 创建、移动和删除文件和目录

  • 显示文件的内容

  • 理解和使用不同的链接类型

  • 了解文件属性并更改文件权限


3.1. Linux 文件系统的总体概述

3.1.1. 文件

3.1.1.1. 概述

对 UNIX 系统的简单描述,也适用于 Linux,如下所示

"在 UNIX 系统上,一切皆为文件;如果某事物不是文件,它就是一个进程。"

这个说法是正确的,因为存在一些特殊的文件,它们不仅仅是文件(例如,命名管道和套接字),但为了简单起见,说一切皆为文件是一个可以接受的概括。与 UNIX 一样,Linux 系统不区分文件和目录,因为目录只是包含其他文件名称的文件。程序、服务、文本、图像等等,都是文件。输入和输出设备,以及通常所有设备,都被系统认为是文件。

为了有序地管理所有这些文件,人们喜欢将它们想象成硬盘上一个有序的树状结构,正如我们从 MS-DOS (磁盘操作系统) 中了解的那样。大分支包含更多分支,而末端的的分支包含树的叶子或普通文件。现在我们将使用树的图像,但稍后我们将找出为什么这不是一个完全准确的图像。


3.1.1.2. 文件类型

大多数文件只是被称为常规文件的文件;它们包含正常数据,例如文本文件、可执行文件或程序、程序的输入或输出等等。

虽然假设你在 Linux 系统上遇到的所有内容都是文件是相当安全的,但也有一些例外。

  • 目录: 是其他文件的列表的文件。

  • 特殊文件: 用于输入和输出的机制。大多数特殊文件都在/dev中,我们稍后会讨论它们。

  • 链接: 一种使文件或目录在系统文件树的多个部分可见的系统。我们将详细讨论链接。

  • (域) 套接字: 一种特殊的文件类型,类似于 TCP/IP 套接字,提供受文件系统访问控制保护的进程间网络连接。

  • 命名管道: 行为或多或少类似于套接字,并形成进程彼此通信的方式,而无需使用网络套接字语义。

ls-l选项使用每行的第一个字符显示文件类型

jaime:~/Documents> ls -l
total 80
-rw-rw-r--   1 jaime   jaime   31744 Feb 21 17:56 intro Linux.doc
-rw-rw-r--   1 jaime   jaime   41472 Feb 21 17:56 Linux.doc
drwxrwxr-x   2 jaime   jaime    4096 Feb 25 11:50 course

下表概述了确定文件类型的字符

表 3-1. 长列表中文件类型

符号含义
-常规文件
d目录
l链接
c特殊文件
s套接字
p命名管道
b块设备

为了不必总是执行冗长的列表来查看文件类型,许多系统默认情况下不只是发出 ls,而是 ls -F,它使用字符 "/=*|@" 来为文件名添加后缀以指示文件类型。为了让初学者更容易使用,通常将-F--color选项组合在一起,请参见 3.3.1.1 节。我们将在本文档中使用 ls -F 以获得更好的可读性。

作为用户,你只需要直接处理普通文件、可执行文件、目录和链接。特殊文件类型用于使你的系统执行你所要求的功能,并由系统管理员和程序员处理。

现在,在我们查看重要文件和目录之前,我们需要了解更多关于分区的信息。


3.1.2. 关于分区

3.1.2.1. 为什么分区?

大多数人都对分区有一个模糊的认识,因为每个操作系统都有创建或删除它们的能力。Linux 在同一磁盘上使用多个分区,即使使用标准安装程序,也可能看起来很奇怪,因此需要一些解释。

拥有不同分区的一个目标是在发生灾难时实现更高的数据安全性。通过将硬盘分成多个分区,可以对数据进行分组和分离。当发生事故时,只有受到冲击的分区中的数据会被损坏,而其他分区上的数据很可能幸存下来。

这个原则可以追溯到 Linux 没有日志文件系统的时代,停电可能会导致灾难。出于安全和稳健性的原因,分区仍然在使用,因此系统一部分的破坏不会自动意味着整个计算机都处于危险之中。这是目前分区最重要的原因。一个简单的例子:用户创建一个脚本、程序或 Web 应用程序,开始填满磁盘。如果磁盘只包含一个大分区,那么如果磁盘已满,整个系统将停止运行。如果用户将数据存储在单独的分区上,那么只有该(数据)分区会受到影响,而系统分区和可能的其他数据分区会保持运行。

请注意,拥有日志文件系统只能在发生停电和突然断开存储设备的情况下提供数据安全。这不能保护你的数据免受坏块和文件系统中的逻辑错误的影响。在这些情况下,你应该使用 RAID(独立磁盘冗余阵列)解决方案。


3.1.2.2. 分区布局和类型

Linux 系统上有两种主要分区

  • 数据分区:正常的 Linux 系统数据,包括包含启动和运行系统所需的所有数据的根分区;和

  • 交换分区:计算机物理内存的扩展,硬盘上的额外内存。

大多数系统包含一个根分区、一个或多个数据分区和一个或多个交换分区。混合环境中的系统可能包含用于其他系统数据的分区,例如具有用于 MS Windows 数据的 FAT 或 VFAT 文件系统的分区。

大多数 Linux 系统在安装时使用 fdisk 设置分区类型。正如你在第 1 章的练习中可能已经注意到的,这通常会自动发生。但是,在某些情况下,你可能没有那么幸运。在这种情况下,你需要手动选择分区类型,甚至手动进行实际分区。标准 Linux 分区对于交换使用数字 82,对于数据使用 83,数据可以是日志式的 (ext3) 或普通的 (ext2,在旧系统中)。如果你忘记了这些值,fdisk 实用程序具有内置帮助。

除了这两种之外,Linux 还支持各种其他文件系统类型,例如相对较新的 Reiser 文件系统、JFS、NFS、FATxx 和许多其他(专有)操作系统上原生可用的文件系统。

标准根分区(用单个正斜杠表示,/)约为 100-500 MB,包含系统配置文件、大多数基本命令和服务器程序、系统库、一些临时空间和管理用户的主目录。标准安装需要大约 250 MB 的根分区。

交换空间(用swap表示)仅供系统本身访问,在正常操作期间是隐藏的。 就像在普通的 UNIX 系统上一样,交换空间是确保您可以继续工作的系统,无论发生什么情况。 在 Linux 上,由于有这部分额外的内存,您几乎永远不会看到像内存不足,请先关闭一些应用程序再重试这样的烦人消息。 交换或虚拟内存过程现在已被 UNIX 世界之外的操作系统广泛采用。

使用硬盘上的内存自然比使用计算机的实际内存芯片要慢,但是拥有这一点额外的内存会让人感到非常舒适。 我们将在第 4 章讨论进程时了解更多关于交换的信息。

通常,Linux 依赖于在硬盘上以交换空间的形式拥有两倍于物理内存的容量。 安装系统时,您需要知道如何进行此操作。 以下是一个拥有 512 MB RAM 的系统的示例:

  • 第一种可能性:一个 1 GB 的交换分区

  • 第二种可能性:两个 512 MB 的交换分区

  • 第三种可能性:使用两个硬盘:每个磁盘上一个 512 MB 的分区。

当预计有大量 I/O 时,最后一种选择将提供最佳结果。

请阅读软件文档以获取具体指导。 某些应用程序(例如数据库)可能需要更多交换空间。 其他一些应用程序(例如某些手持系统)由于缺少硬盘可能根本没有交换空间。 交换空间也可能取决于您的内核版本。

在许多发行版中,内核也在一个单独的分区上,因为它系统最重要的文件。 如果是这种情况,您会发现还有一个/boot分区,用于保存您的内核和随附的数据文件。

硬盘的其余部分通常划分为数据分区,但也有可能所有非系统关键数据都驻留在一个分区上,例如,当您执行标准工作站安装时。 当非关键数据在不同的分区上分离时,通常遵循一套固定的模式

  • 一个用于用户程序的分区(/usr

  • 一个包含用户个人数据的分区(/home

  • 一个用于存储临时数据的分区,例如打印和邮件队列(/var

  • 一个用于第三方和额外软件的分区(/opt

一旦创建了分区,您只能添加更多分区。 更改现有分区的大小或属性是可能的,但不建议这样做。

硬盘划分为分区是由系统管理员决定的。 在大型系统中,他甚至可以使用适当的软件将一个分区分布在多个硬盘上。 大多数发行版都允许为工作站(普通用户)和通用服务器目的优化的标准设置,但也接受自定义分区。 在安装过程中,您可以使用发行版特定的工具(通常是一个简单的图形界面)或 fdisk(一个用于创建分区和设置其属性的基于文本的工具)来定义您自己的分区布局。

工作站或客户端安装主要供同一个人使用。 选择安装的软件反映了这一点,重点是常见的用户软件包,例如漂亮的桌面主题、开发工具、电子邮件客户端程序、多媒体软件、Web 和其他服务。 所有内容都放在一个大的分区上,添加两倍于 RAM 容量的交换空间,您的通用工作站就完成了,为个人使用提供了尽可能大的磁盘空间,但缺点是在出现问题时可能会丢失数据完整性。

在服务器上,系统数据往往与用户数据分离。 提供服务的程序与此服务处理的数据保存在不同的位置。 在此类系统上将创建不同的分区:

  • 一个包含启动机器所需的所有数据的分区

  • 一个包含配置数据和服务器程序的分区

  • 一个或多个包含服务器数据的分区,例如数据库表、用户邮件、ftp 归档等。

  • 一个包含用户程序和应用程序的分区

  • 一个或多个用于用户特定文件的分区(主目录)

  • 一个或多个交换分区(虚拟内存)

服务器通常具有更多内存,因此也具有更多交换空间。 某些服务器进程(例如数据库)可能需要比平时更多的交换空间; 有关详细信息,请参见具体文档。 为了获得更好的性能,交换空间通常被划分为不同的交换分区。


3.1.2.3. 挂载点

所有分区都通过挂载点连接到系统。 挂载点定义了文件系统中特定数据集的位置。 通常,所有分区都通过 *root* 分区连接。 在此分区上(用斜杠 (/) 表示),创建目录。 这些空目录将是附加到它们的分区的起始点。 一个例子:给定一个包含以下目录的分区

videos/		cd-images/	pictures/

我们想将此分区附加到文件系统中名为/opt/media的目录中。 为了做到这一点,系统管理员必须确保目录/opt/media存在于系统上。 最好,它应该是一个空目录。 如何做到这一点将在本章后面解释。 然后,使用 mount 命令,管理员可以将该分区附加到系统。 当您查看以前的空目录的内容时/opt/media,它将包含已挂载的介质(硬盘或硬盘的分区、CD、DVD、闪存卡、USB 或其他存储设备)上的文件和目录。

因此,在系统启动期间,所有分区都按照文件中的描述进行挂载/etc/fstab。 某些分区默认情况下未挂载,例如,如果它们没有持续连接到系统,例如您的数码相机使用的存储。 如果配置良好,一旦系统注意到设备已连接,它将被挂载,或者它可以是用户可挂载的,即您不需要成为系统管理员才能将设备附加到系统或从系统分离。 第 9.3 节中有一个示例。

在运行的系统上,可以使用 df 命令(代表disk fulldisk free)显示有关分区及其挂载点的信息。 在 Linux 中,df 是 GNU 版本,并支持-hhuman readable 选项,这大大提高了可读性。 请注意,商用 UNIX 机器通常有自己的 df 和许多其他命令的版本。 它们的行为通常相同,但 GNU 版本的常用工具通常具有更多更好的功能。

df 命令仅显示有关活动的非交换分区的信息。 这些可能包括来自其他网络系统的分区,如下面的示例所示,其中主目录是从网络上的文件服务器挂载的,这种情况在公司环境中经常遇到。

freddy:~> df -h
Filesystem          Size  Used Avail Use% Mounted on
/dev/hda8           496M  183M  288M  39% /
/dev/hda1           124M  8.4M  109M   8% /boot
/dev/hda5            19G   15G  2.7G  85% /opt
/dev/hda6           7.0G  5.4G  1.2G  81% /usr
/dev/hda7           3.7G  2.7G  867M  77% /var
fs1:/home           8.9G  3.7G  4.7G  44% /.automount/fs1/root/home

3.1.3. 更多文件系统布局

3.1.3.1. 可视化

为方便起见,Linux 文件系统通常被认为是树状结构。 在标准 Linux 系统上,您会发现布局通常遵循下面显示的方案。

图 3-1. Linux 文件系统布局

这是来自 RedHat 系统的布局。 根据系统管理员、操作系统和 UNIX 机器的任务,结构可能会有所不同,并且可以随意省略或添加目录。 甚至名称都不是必需的; 它们只是一种约定。

文件系统的树从主干或斜杠开始,用正斜杠 (/) 表示。 此目录包含所有底层目录和文件,也称为根目录或文件系统的"根"

根目录下一级的目录通常以斜杠开头,以指示其位置并防止与可能具有相同名称的其他目录混淆。 在开始使用新系统时,最好先查看根目录。 让我们看看您可能会遇到什么

emmy:~> cd /
emmy:/> ls
bin/   dev/  home/    lib/         misc/  opt/     root/  tmp/  var/
boot/  etc/  initrd/  lost+found/  mnt/   proc/    sbin/  usr/

表 3-2. 根目录的子目录

目录内容
/bin由系统、系统管理员和用户共享的常用程序。
/boot启动文件和内核,vmlinuz。 在一些最新的发行版中,还有grub数据。 Grub 是 GRand Unified Boot 加载程序,旨在消除我们今天所知道的许多不同的引导加载程序。
/dev包含对所有 CPU 外围硬件的引用,这些硬件表示为具有特殊属性的文件。
/etc最重要的系统配置文件位于/etc,此目录包含类似于 Windows 中控制面板的数据
/home普通用户的主目录。
/initrd(在某些发行版上)用于引导的信息。 不要删除!
/lib库文件,包括系统和用户所需的所有类型程序的文件。
/lost+found每个分区都有一个lost+found在其顶层目录中。 在故障期间保存的文件都在这里。
/misc用于各种目的。
/mnt外部文件系统的标准挂载点,例如 CD-ROM 或数码相机。
/net整个远程文件系统的标准挂载点
/opt通常包含额外的第三方软件。
/proc包含有关系统资源的虚拟文件系统。 有关proc中文件的含义的更多信息,可以通过在终端窗口中输入命令 man proc 来获得。 文件proc.txt详细讨论了虚拟文件系统。
/root管理用户的家目录。 注意 /(根目录)和 /root(root 用户的家目录)之间的区别。
/sbin供系统和系统管理员使用的程序。
/tmp供系统使用的临时空间,重启后会清除,所以不要用它来保存任何工作!
/usr所有用户相关程序的程序、库、文档等。
/var用于存储所有可变文件和用户创建的临时文件,例如日志文件、邮件队列、打印假脱机程序区域、从 Internet 下载的文件临时存储空间或在刻录 CD 之前保留 CD 的图像。

如何找出目录位于哪个分区上? 使用带有点 (.) 作为选项的 df 命令会显示当前目录所属的分区,并告知有关此分区上使用的空间量

sandra:/lib> df -h .
Filesystem            Size  Used Avail Use% Mounted on
/dev/hda7             980M  163M  767M  18% /

通常,根目录下的每个目录都位于根分区上,除非它在 df (或 df -h,不带其他选项) 的完整列表中有单独的条目。

man hier 中阅读更多信息。


3.1.3.2. 现实中的文件系统

对于大多数用户和大多数常见的系统管理任务,接受文件和目录以树状结构排序就足够了。 然而,计算机不了解树或树状结构的任何信息。

每个分区都有自己的文件系统。 通过想象所有这些文件系统在一起,我们可以形成整个系统的树状结构的印象,但这并非那么简单。 在文件系统中,文件由 inode 表示,它是一种序列号,包含有关构成文件的实际数据的信息:此文件属于谁,以及它位于硬盘上的什么位置。

每个分区都有自己的一组 inode; 在具有多个分区的系统中,可以存在具有相同 inode 编号的文件。

每个 inode 描述了硬盘上的一个数据结构,存储文件的属性,包括文件数据的物理位置。 当硬盘被初始化以接受数据存储时,通常是在初始系统安装过程中或将额外的硬盘添加到现有系统时,每个分区都会创建固定数量的 inode。 这个数字将是所有类型(包括目录、特殊文件、链接等)的文件可以同时存在于该分区上的最大数量。 我们通常期望每 2 到 8 KB 的存储空间有 1 个 inode。

在创建新文件时,它会获得一个空闲的 inode。 该 inode 包含以下信息

  • 文件的所有者和组所有者。

  • 文件类型(常规、目录等)

  • 文件权限 第 3.4.1 节

  • 创建、上次读取和更改的日期和时间。

  • 此信息在 inode 中被更改的日期和时间。

  • 指向此文件的链接数(请参阅本章稍后部分)。

  • 文件大小

  • 定义文件数据实际位置的地址。

inode 中未包含的唯一信息是文件名和目录。 这些存储在特殊的目录文件中。 通过比较文件名和 inode 编号,系统可以形成用户理解的树状结构。 用户可以使用-i选项来显示 ls 的 inode 编号。 inode 在磁盘上有自己的独立空间。


3.2. 文件系统中的定位

3.2.1. 路径

当您希望系统执行命令时,几乎永远不需要给出该命令的完整路径。 例如,我们知道 ls 命令位于/bin目录中(使用 which -a ls 检查),但我们不必输入命令 /bin/ls 计算机即可列出当前目录的内容。

lsPATH环境变量负责处理此问题。 此变量列出了系统中可以找到可执行文件的那些目录,从而节省了用户大量键入和记住命令位置的操作。 因此,路径自然包含许多包含bin名称的目录,如下面的用户所示。 echo 命令用于显示变量 ("$") 的内容PATH:

rogier:> echo $PATH
/opt/local/bin:/usr/X11R6/bin:/usr/bin:/usr/sbin/:/bin

在此示例中,目录/opt/local/bin, /usr/X11R6/bin, /usr/bin, /usr/sbin/bin随后被搜索以查找所需的程序。 只要找到匹配项,搜索就会停止,即使并非路径中的每个目录都已被搜索。 这可能会导致奇怪的情况。 在下面的第一个示例中,用户知道有一个名为 sendsms 的程序可以发送 SMS 消息,并且同一系统上的另一个用户可以使用它,但她不能。 区别在于PATH变量的配置

[jenny@blob jenny]$ sendsms
bash: sendsms: command not found
[jenny@blob jenny]$ echo $PATH
/bin:/usr/bin:/usr/bin/X11:/usr/X11R6/bin:/home/jenny/bin
[jenny@blob jenny]$ su - tony
Password:
tony:~>which sendsms
sendsms is /usr/local/bin/sendsms

tony:~>echo $PATH
/home/tony/bin.Linux:/home/tony/bin:/usr/local/bin:/usr/local/sbin:\
/usr/X11R6/bin:/usr/bin:/usr/sbin:/bin:/sbin

请注意使用 su(切换用户)工具,它允许您在另一个用户的环境中运行 shell,前提是您知道该用户的密码。

反斜杠表示一行在下一行上继续,没有 Enter 将一行与另一行分隔开。

在下一个示例中,用户想要调用 wc(字数统计)命令来检查文件中的行数,但没有任何反应,他必须使用 Ctrl+C 组合键中断操作

jumper:~> wc -l test

(Ctrl-C)
jumper:~> which wc
wc is hashed (/home/jumper/bin/wc)

jumper:~> echo $PATH
/home/jumper/bin:/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin:\
/usr/bin:/usr/sbin:/bin:/sbin

使用 which 命令向我们表明该用户在他的主目录中有一个bin-目录,其中包含一个也称为 wc 的程序。 由于在调用 wc 时搜索路径时首先找到他主目录中的程序,因此会执行这个"自制"程序,它的输入可能无法理解,因此我们必须停止它。 要解决此问题,有多种方法(在 UNIX/Linux 中总是有多种方法可以解决问题):一种答案是重命名用户的 wc 程序,或者用户可以给出他想要的精确命令的完整路径,这可以通过使用-a选项到 which 命令。

如果用户更频繁地使用其他目录中的程序,他可以更改他的路径,以便最后查找他自己的目录

jumper:~> export PATH=/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin:\
/usr/bin:/usr/sbin:/bin:/sbin:/home/jumper/bin

Note更改不是永久性的!
 

请注意,在 shell 中使用 export 命令时,更改是临时的,仅对本次会话有效(直到您注销)。 即使当前会话仍在运行,打开新会话也不会在新会话中产生新路径。 我们将在 第 7.2 节中看到我们如何使这些类型的环境更改永久生效,将这些行添加到 shell 配置文件中。


3.2.2. 绝对路径和相对路径

路径,也就是您需要在树结构中遵循的到达给定文件的方式,可以描述为从树干(/ 或根目录)开始。 在这种情况下,路径以斜杠开头,称为绝对路径,因为不可能出错:系统上只有一个文件可以符合要求。

在另一种情况下,路径不以斜杠开头,并且可能在以下两者之间发生混淆~/bin/wc(在用户的主目录中)和bin/wc/usr中,来自前面的示例。 不以斜杠开头的路径始终是相对路径。

在相对路径中,我们还使用 . 和 .. 指示当前目录和父目录。 几个实际例子

  • 当您想要编译源代码时,安装文档通常会指示您运行命令 ./configure,它会运行位于当前目录(与新代码一起提供)中的 configure 程序,而不是在系统上的其他位置运行另一个 configure 程序。

  • 在 HTML 文件中,相对路径通常用于使一组页面易于移动到另一个位置

    <img alt="Garden with trees" src="../images/garden.jpg">
    
  • 再次注意区别

    theo:~> ls /mp3
    ls: /mp3: No such file or directory
    theo:~>ls mp3/
    oriental/  pop/  sixties/
    

3.2.3. 最重要的文件和目录

3.2.3.1. 内核

内核是系统的核心。 它管理底层硬件和外围设备之间的通信。 内核还确保进程和守护程序(服务器进程)在正确的时间启动和停止。 内核还有很多其他重要的任务,以至于有一个专门的内核开发邮件列表专门讨论这个问题,其中共享了大量信息。 详细讨论内核会让我们走得太远。 目前,只需知道内核是系统上最重要的文件就足够了。


3.2.3.2. Shell

3.2.3.2.1. 什么是 Shell?

当我正在寻找对 shell 概念的适当解释时,它给了我比预期更多的麻烦。 各种定义都可用,从简单的比较"shell 是汽车的方向盘"到 Bash 手册中模糊的定义,该定义说"bash 是一个与 sh 兼容的命令语言解释器",或者更晦涩的表达方式,"shell 管理系统及其用户之间的交互"。 shell 不仅仅是这些。

shell 可以最好地比作一种与计算机交谈的方式,一种语言。 大多数用户都知道另一种语言,即桌面的点击语言。 但在这种语言中,计算机正在领导对话,而用户扮演着从呈现的任务中选择任务的被动角色。 程序员很难在 GUI 格式中包含命令的所有选项和可能用途。 因此,GUI 几乎总是比构成后端的命令或多个命令的能力差。

另一方面,shell 是一种与系统通信的高级方式,因为它允许双向对话并主动发起对话。 通信中的两个伙伴是平等的,因此可以测试新想法。 shell 允许用户以非常灵活的方式处理系统。 另一个优点是 shell 允许任务自动化。


3.2.3.2.2. Shell 类型

就像人们知道不同的语言和方言一样,计算机也知道不同的 shell 类型

  • shBourne Shell:原始 shell 仍然用于 UNIX 系统和与 UNIX 相关的环境中。 这是基本的 shell,一个功能很少的小程序。 当处于 POSIX 兼容模式时,bash 将模拟此 shell。

  • bashBourne Again SHell:标准的 GNU shell,直观且灵活。 对于初学者来说,可能是最明智的选择,同时对于高级和专业用户来说也是一个强大的工具。 在 Linux 上,bash 是普通用户的标准 shell。 此 shell 是 Bourne shell 的所谓超集,一组附加组件和插件。 这意味着 Bourne Again SHellBourne shell 兼容:在 sh 中工作的命令也可以在 bash 中工作。 但是,反过来并不总是如此。 本书中所有的例子和练习都使用 bash

  • cshC Shell:此 shell 的语法类似于 C 编程语言。 有时程序员会要求使用。

  • tcshTurbo C Shell:普通 C Shell 的超集,增强了用户友好性和速度。

  • kshKorn shell:有时受到具有 UNIX 背景的人的欢迎。 Bourne shell 的超集; 对于初学者来说,使用标准配置是一个噩梦。

文件/etc/shells给出了 Linux 系统上已知 shell 的概述

mia:~> cat /etc/shells
/bin/bash
/bin/sh
/bin/tcsh
/bin/csh

Note虚假的 Bourne shell
 

请注意/bin/sh通常是指向 Bash 的链接,当以这种方式调用时,它将在 Bourne shell 兼容模式下执行。

您的默认 shell 设置在/etc/passwd文件中,例如用户 *mia* 的这一行

mia:L2NOfqdlPrHwE:504:504:Mia Maya:/home/mia:/bin/bash

要从一个 shell 切换到另一个 shell,只需在活动终端中输入新 shell 的名称。 系统使用PATH设置找到名称出现的目录,并且由于 shell 是一个可执行文件(程序),因此当前 shell 会激活它并执行它。 通常会显示一个新的提示符,因为每个 shell 都有其典型的外观

mia:~> tcsh
[mia@post21 ~]$

3.2.3.2.3. 我正在使用哪个 shell?

如果您不知道您正在使用哪个 shell,请检查您帐户在/etc/passwd中的行,或者键入命令

echo$SHELL


3.2.3.3. 你的主目录

当你连接到系统时,你的主目录是你的默认目标位置。在大多数情况下,它是以下目录的子目录:/home,但这种情况可能会有所不同。你的主目录可能位于远程文件服务器的硬盘上;在这种情况下,你的主目录可能位于:/nethome/你的用户名在另一种情况下,系统管理员可能选择了不太容易理解的布局,而你的主目录可能位于:/disk6/HU/07/jgillard.

无论你的主目录的路径是什么,你都不必过于担心。你的主目录的正确路径存储在HOME环境变量中,以防某些程序需要它。你可以使用 echo 命令显示此变量的内容。

orlando:~> echo $HOME
/nethome/orlando

你可以在你的主目录中做任何你喜欢的事情。你可以在任意数量的目录中放入任意数量的文件,但由于硬件和分区大小的限制,以及有时因为系统管理员应用了配额系统,数据的总量和文件的数量自然会受到限制。当硬盘空间仍然很昂贵时,限制磁盘使用是一种常见的做法。如今,限制几乎只应用于大型环境中。你可以使用 quota 命令查看是否设置了限制。

pierre@lamaison:/> quota -v
Diskquotas for user pierre (uid 501): none

如果设置了配额,你将获得一个受限分区的列表及其具体的限制。在宽限期内,超过限制可能会被容忍,限制较少或根本没有限制。可以使用 info quotaman quota 命令找到详细信息。

Note没有配额?
 

如果你的系统找不到 quota,则表示未应用文件系统使用限制。

你的主目录用波浪号 (~) 表示,它是以下路径的简写:/path_to_home/user_name。这个相同的路径存储在HOME变量中,因此你无需执行任何操作来激活它。一个简单的应用:使用一个简洁的命令从/var/music/albums/arno/2001切换到你的主目录中的images目录:

rom:/var/music/albums/arno/2001> cd ~/images

rom:~/images> pwd
/home/rom/images

在本章的后面,我们将讨论用于管理文件和目录的命令,以便保持你的主目录整洁。


3.2.4. 最重要的配置文件

正如我们之前提到的,大多数配置文件都存储在/etc目录中。可以使用 cat 命令查看内容,该命令将文本文件发送到标准输出(通常是你的显示器)。语法很简单:

catcat 文件1 ... 文件2

文件N/etc中添加额外的配置文件。阅读配置文件时,你会发现它们通常注释良好且不言自明。某些文件也有包含额外文档的 man 页面,例如 man group

表 3-3. 最常见的配置文件

文件信息/服务
aliases 用于 Sendmail 和 Postfix 邮件服务器的邮件别名文件。在每个系统上运行邮件服务器在 UNIX 世界中早已司空见惯,几乎每个 Linux 发行版仍然附带 Sendmail 软件包。在此文件中,本地用户名与电子邮件地址中出现的真实名称或其他本地地址匹配。
apache Apache Web 服务器的配置文件。
bashrc Bourne Again SHell 的系统级配置文件。为所有用户定义函数和别名。其他 shell 可能有自己的系统级配置文件,例如cshrc.
crontabcron.*目录配置需要定期执行的任务 - 备份、系统数据库更新、系统清理、日志轮换等。
default 某些命令(例如 useradd)的默认选项。
filesystems 已知的文件系统:ext3、vfat、iso9660 等。
fstab 列出分区及其挂载点
ftp* ftp 服务器的配置:谁可以连接、可以访问系统的哪些部分等。
group 用户组的配置文件。使用 shadow 实用程序 groupaddgroupmodgroupdel 编辑此文件。仅在你真正知道自己在做什么时才手动编辑。
hosts 可以使用网络联系的计算机列表,但无需域名服务。这与系统的网络配置无关,网络配置在/etc/sysconfig.
inittab 中完成。
issue 有关发行版的信息(发布版本和/或内核信息)。
ld.so.conf 库文件的位置。
lilo.conf, silo.conf, aboot.conf等等。LInux LOader 的启动信息,该系统现在正逐渐被 GRUB 取代。
logrotate.* 日志轮换,一种防止收集大量日志文件的系统。
mail 包含邮件服务器行为指令的目录。
modules.conf 启用特殊功能(驱动程序)的模块的配置。
motd 每日消息:显示给连接到系统的每个人(以文本模式),系统管理员可以使用它来宣布系统服务/维护等。
mtab 当前挂载的文件系统。建议永远不要编辑此文件。
nsswitch.conf 当进程需要解析主机名时,联系名称解析器的顺序。
pam.d 身份验证模块的配置。
passwd 列出本地用户。使用 shadow 实用程序 useraddusermoduserdel 编辑此文件。仅在你真正知道自己在做什么时才手动编辑。
printcap 过时但仍经常使用的打印机配置文件。除非你真的知道自己在做什么,否则不要手动编辑。
profile shell 环境的系统级配置:变量、新文件的默认属性、资源限制等。
rc* 定义每个运行级别的活动服务的目录。
resolv.conf 联系 DNS 服务器(仅域名服务器)的顺序。
sendmail.cf Sendmail 服务器的主要配置文件。
services 此机器接受的连接(开放端口)。
sndconfig或者sound 声卡和声音事件的配置。
ssh 包含安全 shell 客户端和服务器配置文件的目录。
sysconfig 包含系统配置文件的目录:鼠标、键盘、网络、桌面、系统时钟、电源管理等(RedHat 特有)。
X11 图形服务器 X 的设置。RedHat 使用 XFree,这反映在主配置文件 XFree86Config 的名称中。还包含系统上可用的窗口管理器的通用方向,例如 gdmfvwmtwm 等。
xinetd.*或者inetd.conf 从系统(扩展的)Internet 服务守护程序(不运行独立守护程序的服务器)运行的 Internet 服务的配置文件。

在本指南中,我们将了解有关这些文件的更多信息并详细研究其中一些文件。


3.2.5. 最常见的设备

通常,PC 的每个外围附件(CPU 本身除外)都作为以下目录中的条目呈现给系统:/dev目录。这种 UNIX 处理设备方式的优点之一是用户和系统都不必太担心设备的规格。

通常,Linux 或 UNIX 的新手会被他们必须学习的大量新名称和概念所淹没。这就是为什么在本介绍中包含常见设备列表的原因。

表 3-4. 常用设备

名称设备
cdromCD 驱动器
console当前使用的控制台的特殊条目。
cua*串口
dsp*用于采样和录制的设备
fd*大多数类型的软盘驱动器的条目,默认是/dev/fd0,一个用于 1.44 MB 软盘的软盘驱动器。
hd[a-t][1-16]对 IDE 驱动器的标准支持,每个驱动器最多可包含的分区数量。
ir*红外设备
isdn*ISDN 连接管理
js*操纵杆
lp*打印机
mem内存
midi*midi 播放器
mixer*music混音器的理想化模型(组合或添加信号)
modem调制解调器
mouse(还有 msmouse、logimouse、psmouse、input/mice、psaux)各种鼠标
null无底垃圾桶
par*并行端口支持的条目
pty*伪终端
radio*适用于无线电爱好者 (HAM)。
ram*启动设备
sd*带有分区的 SCSI 磁盘
sequencer适用于使用声卡合成器功能的音频应用程序(MIDI 设备控制器)
tty*模拟 vt100 终端的虚拟控制台。
usb*USB 卡和扫描仪
video*用于支持视频的图形卡。

3.2.6. 最常见的变量文件

/var目录中,我们找到了一组用于存储特定非常量数据的目录(与 ls 程序或系统配置文件相反,这些文件更改的频率相对较低或根本不更改)。所有频繁更改的文件,例如日志文件、邮箱、锁定文件、假脱机程序等,都保存在/var.

的子目录中。作为一种安全措施,这些文件通常与主要系统文件分开保存,因此我们可以密切关注它们并在必要时设置更严格的权限。许多这些文件也需要比平时更多的权限,例如/var/tmp,这需要对每个人都可写。在这里可能会有大量的用户活动,甚至可能是连接到你的系统的匿名 Internet 用户生成的。这就是/var目录(包括其所有子目录)通常位于单独的分区上的原因之一。这样,例如,就没有邮件炸弹填满文件系统的其余部分的风险,文件系统的其余部分包含更重要的数据,例如你的程序和配置文件。

Note/var/tmp 和 /tmp
 

中的文件/tmp可能会被定期系统任务或系统重启删除,恕不另行通知。在某些(定制的)系统上,也/var/tmp可能表现出无法预测的行为。不过,由于默认情况下并非如此,我们建议使用/var/tmp目录来保存临时文件。如有疑问,请咨询您的系统管理员。如果您管理自己的系统,并且没有有意识地更改设置,那么您可以合理地确定这是一个安全的地方。/var/tmp(作为root用户,普通用户无法做到这一点)。

无论您做什么,尽量遵守授予普通用户的权限 - 不要直接在文件系统的根目录 (/) 下保存文件,不要将它们放在/usr或某些子目录中,或放在其他保留位置。 这几乎将您的访问权限限制在安全的文件系统上。

UNIX系统上的主要安全系统之一,自然也在每台Linux机器上实现,是日志记录功能,它记录所有用户操作、进程、系统事件等。所谓的syslogdaemon的配置文件决定了哪些信息会被记录以及记录多长时间。所有日志的默认位置是/var/log,包含访问日志、服务器日志、系统消息等不同的文件。

/var我们通常会找到服务器数据,这些数据保存在这里是为了将它们与关键数据(例如服务器程序本身及其配置文件)分开。Linux系统上的一个典型例子是/var/www,其中包含Web服务器提供的实际HTML页面、脚本和图像。FTP服务器的FTP树(远程客户端可以下载的数据)也最好保存在/var的子目录中。由于这些数据是公开访问的,并且经常可以被匿名用户更改,因此将它保存在这里更安全,远离包含敏感数据的分区或目录。

在大多数工作站安装中,/var/spool至少会包含一个at和一个cron目录,其中包含计划任务。在办公环境中,此目录通常包含lpd以及保存打印队列和进一步的打印机配置文件,以及打印机日志文件。

在服务器系统上,我们通常会发现/var/spool/mail,其中包含本地用户的传入邮件,每个用户一个文件,用户的"收件箱"。相关的目录是mqueue,即未发送邮件消息的假脱机区域。在拥有大量用户的邮件服务器上,系统的这些部分可能非常繁忙。新闻服务器也使用/var/spool区域,因为它们必须处理大量的消息。

ls/var/lib/rpm目录是RPM(RedHat软件包管理器)发行版特有的; 它是存储RPM软件包信息的地方。其他软件包管理器通常也将它们的数据存储在/var.


3.3. 操作文件

3.3.1. 查看文件属性

3.3.1.1. 更多关于 ls

除了文件名之外,ls还可以提供许多其他信息,例如我们已经讨论过的文件类型。 它还可以显示文件权限、文件大小、inode编号、创建日期和时间、所有者以及指向该文件的链接数量。 使用-a选项,ls还可以显示通常隐藏的文件。 这些文件名以点开头的文件。 几个典型的例子包括您主目录中的配置文件。 当您使用某个系统一段时间后,您会注意到已经创建了数十个文件和目录,这些文件和目录不会自动列在目录索引中。 除此之外,每个目录都包含一个名为点 (.) 的文件和一个名为两个点 (..) 的文件,它们与其 inode 编号结合使用,以确定目录在文件系统树结构中的位置。

您应该真正阅读关于lsInfo页面,因为它是一个非常常用的命令,有很多有用的选项。 选项可以组合使用,就像大多数UNIX命令及其选项一样。 一个常见的组合是ls -al; 它显示文件及其属性的长列表,以及任何符号链接指向的目标位置。 ls -latr 显示相同的文件,只是现在按上次更改的相反顺序排列,因此最近更改的文件出现在列表的底部。 这里有一些例子

krissie:~/mp3> ls
Albums/  Radio/  Singles/  gene/  index.html

krissie:~/mp3> ls -a
./   .thumbs  Radio     gene/
../  Albums/  Singles/  index.html

krissie:~/mp3> ls -l Radio/
total 8
drwxr-xr-x    2 krissie krissie  4096 Oct 30  1999 Carolina/
drwxr-xr-x    2 krissie krissie  4096 Sep 24  1999 Slashdot/

krissie:~/mp3> ls -ld Radio/
drwxr-xr-x    4 krissie krissie  4096 Oct 30  1999 Radio/

krissie:~/mp3> ls -ltr
total 20
drwxr-xr-x    4 krissie krissie  4096 Oct 30  1999 Radio/
-rw-r--r--    1 krissie krissie   453 Jan  7  2001 index.html
drwxrwxr-x   30 krissie krissie  4096 Oct 20 17:32 Singles/
drwxr-xr-x    2 krissie krissie  4096 Dec  4 23:22 gene/
drwxrwxr-x   13 krissie krissie  4096 Dec 21 11:40 Albums/

在大多数Linux版本上,ls默认别名为 color-ls。 此功能允许您查看文件类型,而无需使用ls的任何选项。 为实现此目的,每种文件类型都有自己的颜色。 标准方案在/etc/DIR_COLORS:

表3-5。 Color-ls 默认颜色方案

颜色文件类型
蓝色目录
红色压缩的档案文件
白色文本文件
粉色images
青色链接
黄色设备
绿色可执行文件
闪烁的红色损坏的链接

更多信息请参见 man page。 早期,相同的信息通过在每个非标准文件名后添加后缀来显示。 对于单色使用(例如打印目录列表)以及为了提高通用可读性,该方案仍在使用中

表3-6。 ls的默认后缀方案

字符文件类型
普通文件
/目录
*可执行文件
@链接
=套接字
|命名管道

可以使用info coreutils ls阅读关于ls命令的完整功能和特性的描述。


3.3.1.2. 更多工具

要了解更多关于我们正在处理的数据类型的信息,我们使用file命令。 通过应用某些测试来检查文件系统中文件的属性、魔数和语言测试,file尝试对文件的格式进行有根据的猜测。 一些例子

mike:~> file Documents/
Documents/: directory

mike:~> file high-tech-stats.pdf
high-tech-stats.pdf: PDF document, version 1.2

mike:~> file Nari-288.rm
Nari-288.rm: RealMedia file

mike:~> file bijlage10.sdw
bijlage10.sdw: Microsoft Office Document

mike:~> file logo.xcf
logo.xcf: GIMP XCF image data, version 0, 150 x 38, RGB Color

mike:~> file cv.txt
cv.txt: ISO-8859 text

mike:~> file image.png
image.png: PNG image data, 616 x 862, 8-bit grayscale, non-interlaced

mike:~> file figure
figure: ASCII text

mike:~> file me+tux.jpg
me+tux.jpg: JPEG image data, JFIF standard 1.01, resolution (DPI),
            "28 Jun 1999", 144 x 144

mike:~> file 42.zip.gz
42.zip.gz: gzip compressed data, deflated, original filename,
         `42.zip', last modified: Thu Nov  1 23:45:39 2001, os: Unix

mike:~> file vi.gif
vi.gif: GIF image data, version 89a, 88 x 31

mike:~> file slide1
slide1: HTML document text

mike:~> file template.xls
template.xls: Microsoft Office Document

mike:~> file abook.ps
abook.ps: PostScript document text conforming at level 2.0

mike:~> file /dev/log
/dev/log: socket

mike:~> file /dev/hda
/dev/hda: block special (3/0)

file命令有一系列选项,其中包括-z选项用于查看压缩文件。 有关详细描述,请参阅info file。 请记住,file的结果不是绝对的,它只是一种猜测。 换句话说,file可能会被欺骗。

Note为什么要大惊小怪文件类型和格式?
 

简而言之,我们将讨论一些用于查看纯文本文件的命令行工具。 这些工具在错误类型的文件上使用时将无法工作。 在最坏的情况下,它们会使您的终端崩溃和/或发出很多蜂鸣声。 如果发生这种情况,只需关闭终端会话并启动一个新的会话。 但尽量避免这种情况,因为它通常会严重干扰其他人。


3.3.2. 创建和删除文件和目录

3.3.2.1. 制造混乱...

... 这不是一件难事。 今天几乎每个系统都联网了,所以自然地文件会从一台机器复制到另一台机器。 特别是在图形环境中工作时,创建新文件非常容易,而且通常是在未经用户批准的情况下完成的。 为了说明这个问题,这是在新用户目录中创建的完整内容,该目录是在标准的RedHat系统上创建的

[newuser@blob user]$ ls -al
total 32
drwx------   3 user 	user        4096 Jan 16 13:32 .
drwxr-xr-x   6 root     root        4096 Jan 16 13:32 ..
-rw-r--r--   1 user 	user      24 Jan 16 13:32 .bash_logout
-rw-r--r--   1 user 	user     191 Jan 16 13:32 .bash_profile
-rw-r--r--   1 user 	user     124 Jan 16 13:32 .bashrc
drwxr-xr-x   3 user 	user    4096 Jan 16 13:32 .kde
-rw-r--r--   1 user 	user    3511 Jan 16 13:32 .screenrc
-rw-------   1 user 	user      61 Jan 16 13:32 .xauthDqztLr

乍一看,"已使用"主目录的内容看起来也不算太糟

olduser:~> ls
app-defaults/ crossover/   Fvwm@     mp3/      OpenOffice.org638/
articles/     Desktop/     GNUstep/  Nautilus/ staroffice6.0/
bin/          Desktop1/    images/   nqc/      training/
brol/         desktoptest/ Machines@ ns_imap/  webstart/
C/            Documents/   mail/     nsmail/   xml/
closed/       Emacs@       Mail/     office52/ Xrootenv.0

但是,当包含所有以点开头的文件和目录时,此目录中有185个项目。 这是因为大多数应用程序都有自己的目录和/或文件,其中包含该用户的用户特定设置,位于该用户的主目录中。 通常,这些文件是在您第一次启动应用程序时创建的。 在某些情况下,当需要创建不存在的目录时,您会收到通知,但大多数情况下,一切都会自动完成。

此外,由于用户想要保存文件、保留其工作的不同版本、使用Internet应用程序以及将文件和附件下载到本地计算机,因此会不断创建新文件。 它不会停止。 显然,人们绝对需要一种方案来保持对事物的概览。

在下一节中,我们将讨论我们保持秩序的方式。 我们只讨论shell可用的文本工具,因为图形工具非常直观,并且具有与众所周知的点击式MS Windows风格文件管理器相同的外观和风格,包括图形帮助功能和您期望的此类应用程序的其他功能。 以下列表是GNU/Linux最流行的文件管理器的概述。 大多数文件管理器可以从桌面管理器的菜单启动,或通过单击您的主目录图标启动,或从命令行启动,发出以下命令

这些应用程序当然值得一试,并且通常会给Linux新手留下深刻印象,即使只是因为种类繁多:这些只是用于管理目录和文件的最流行的工具,并且还在开发许多其他项目。 现在让我们了解一下内部结构,看看这些图形工具如何使用常见的UNIX命令。


3.3.2.2. 工具

3.3.2.2.1. 创建目录

保持事物井井有条的一种方法是通过创建目录和子目录(或者如果您愿意,也可以称为文件夹和子文件夹)来为某些文件提供特定的默认位置。 这是通过mkdir命令完成的

richard:~> mkdir archive

richard:~> ls -ld archive
drwxrwxrwx  2 richard richard           4096 Jan 13 14:09 archive/

使用-poption

richard:~> cd archive

richard:~/archive> mkdir 1999 2000 2001

richard:~/archive> ls
1999/  2000/  2001/

richard:~/archive> mkdir 2001/reports/Restaurants-Michelin/
mkdir: cannot create directory `2001/reports/Restaurants-Michelin/':
No such file or directory

richard:~/archive> mkdir -p 2001/reports/Restaurants-Michelin/

richard:~/archive> ls 2001/reports/
Restaurants-Michelin/

一步创建目录和子目录。如果新文件需要的文件创建权限与默认权限不同,则可以使用mkdir命令一步设置新的访问权限,请参阅Info页面以获取更多信息。我们将在下一节关于文件安全性的章节中讨论访问模式。

目录的命名必须遵守与常规文件名相同的规则。最重要的限制之一是,一个目录中不能有两个同名文件(但请记住,像 UNIX 一样,Linux 是区分大小写的操作系统)。文件名长度实际上没有限制,但通常保持在 80 个字符以内,以便可以容纳在终端的一行中。您可以在文件名中使用任何字符,但建议排除对 shell 具有特殊含义的字符。如有疑问,请查阅附录 C


3.3.2.2.2. 移动文件

现在我们已经正确地组织了主目录,是时候使用 mv 命令清理未分类的文件了

richard:~/archive> mv ../report[1-4].doc reports/Restaurants-Michelin/

此命令也适用于重命名文件

richard:~> ls To_Do
-rw-rw-r--    1 richard richard      2534 Jan 15 12:39 To_Do

richard:~> mv To_Do done

richard:~> ls -l done
-rw-rw-r--    1 richard richard      2534 Jan 15 12:39 done

很明显,只有文件名发生了变化。所有其他属性保持不变。

有关 mv 命令的语法和功能的详细信息,请参阅 man 或 Info 页面。遇到问题时,首先应该查阅这些文档。您问题的答案很可能就在系统文档中。即使是经验丰富的用户也会每天阅读 man 页面,因此初学者应该始终阅读它们。一段时间后,您将了解常用命令的最常见选项,但您仍然需要将文档作为主要信息来源。请注意,HOWTO、FAQ、man 页面和其他来源中包含的信息正慢慢合并到 Info 页面中,Info 页面是当今最新的在线(即系统上随时可用)文档来源。


3.3.2.2.3. 复制文件

复制文件和目录使用 cp 命令。一个有用的选项是递归复制(复制所有底层文件和子目录),使用-Rcp 的选项。一般语法是

cp [-R]fromfile tofile

以用户 *newguy* 为例,他想要与用户 *oldguy* 相同的 Gnome 桌面设置。解决问题的一种方法是将 *oldguy* 的设置复制到 *newguy* 的主目录

victor:~> cp -R ../oldguy/.gnome/ .

这会产生一些涉及文件权限的错误,但所有错误都与 *newguy* 不需要的私有文件有关。我们将在下一部分讨论如何更改这些权限,以防它们确实成为问题。


3.3.2.2.4. 删除文件

使用 rm 命令删除单个文件,使用 rmdir 命令删除空目录。(使用 ls -a 检查目录是否为空)。 rm 命令还具有删除包含所有子目录的非空目录的选项,请阅读 Info 页面以了解这些相当危险的选项。

Note一个目录可以有多空?
 

目录 .(点)和 ..(点-点)通常无法删除,因为它们在空目录中也是必需的,以确定文件系统层次结构中的目录排名。

在 Linux 上,就像在 UNIX 上一样,没有垃圾箱 - 至少对于 shell 而言没有,尽管对于图形化使用有很多解决方案。因此,一旦删除,文件就真的消失了,通常没有办法恢复它,除非您有备份,或者您真的很快并且有一个真正好的系统管理员。为了保护初学者免受这种恶意行为的影响,可以使用-i选项激活 rmcpmv 命令的交互行为。在这种情况下,系统不会立即响应请求。相反,它会要求确认,因此需要额外点击 Enter 键来造成损害

mary:~> rm -ri archive/
rm: descend into directory `archive'? y
rm: descend into directory `archive/reports'? y
rm: remove directory `archive/reports'? y
rm: descend into directory `archive/backup'? y
rm: remove `archive/backup/sysbup200112.tar'? y
rm: remove directory `archive/backup'? y
rm: remove directory `archive'? y

我们将在第 7 章中讨论如何使此选项成为默认选项,该章节讨论了自定义您的 shell 环境。


3.3.3. 查找文件

3.3.3.1. 使用 shell 功能

在移动文件的示例中,我们已经看到了 shell 如何一次处理多个文件。在该示例中,shell 会自动找出用户在方括号 "[""]" 之间的要求所代表的含义。 shell 可以替换数字范围以及大写或小写字符。它还可以用星号替换您想要的任意数量的字符,用问号只替换一个字符。

可以同时使用各种替换; shell 在这方面非常合乎逻辑。Bash shell 例如可以轻松处理诸如 ls dirname/*/*/*[2-3] 之类的表达式。

在其他 shell 中,星号通常用于最大限度地减少键入的工作量:人们会输入 cd dir* 而不是 cd directory。但是,在 Bash 中,这没有必要,因为 GNU shell 具有一个名为文件名完成的功能。这意味着您可以键入命令(任何位置)或文件(在当前目录中)的前几个字符,如果不存在混淆的可能性,shell 将会找出您的意思。例如,在包含许多文件的目录中,您只需键入 ls A 并按两次 Tab 键,而不是按 Enter 键,就可以检查是否存在任何以字母 A 开头的文件。如果只有一个以 "A" 开头的文件,则该文件将立即显示为 ls(或任何 shell 命令)的参数。


3.3.3.2. Which

查找文件的一种非常简单的方法是使用 which 命令,以在用户搜索路径中列出的目录中查找所需文件。当然,由于搜索路径仅包含包含可执行程序的目录的路径,因此 which 不适用于普通文件。 which 命令在解决 "Command not Found" 问题时非常有用。在下面的示例中,用户 *tina* 无法使用 acroread 程序,而她的同事在同一系统上没有任何问题。该问题类似于PATH上一部分中的问题:Tina 的同事告诉她,他可以在/opt/acroread/bin中看到所需的程序,但该目录不在她的路径中

tina:~> which acroread
/usr/bin/which: no acroread in (/bin:/usr/bin:/usr/bin/X11)

可以通过给出要运行的命令的完整路径或重新导出PATH变量的配置

tina:~> export PATH=$PATH:/opt/acroread/bin

tina:~> echo $PATH
/bin:/usr/bin:/usr/bin/X11:/opt/acroread/bin

的内容来解决该问题。使用 which 命令还可以检查命令是否为另一个命令的别名

gerrit:~> which -a ls
ls is aliased to `ls -F --color=auto'
ls is /bin/ls

如果这在您的系统上不起作用,请使用 alias 命令

tille@www:~/mail$ alias ls
alias ls='ls --color'

3.3.3.3. Find 和 locate

这些是真正的工具,用于搜索搜索路径中未列出的其他路径。find 工具源于 UNIX,功能非常强大,这可能是其语法略微复杂的原因。但是,GNU find 可以处理语法问题。此命令不仅允许您搜索文件名,还可以接受文件大小、上次更改日期和其他文件属性作为搜索条件。最常见的用途是查找文件名

find<路径> -name <搜索字符串>

这可以解释为"在给定路径中包含的所有文件和子目录中查找,并打印名称中包含搜索字符串的文件名"(而不是其内容)。

find 的另一个应用是搜索特定大小的文件,如下面的示例所示,用户 *peter* 想要查找当前目录或其子目录中所有大于 5 MB 的文件

peter:~> find . -size +5000k
psychotic_chaos.mp3

如果您深入研究 man 页面,您将看到 find 还可以对找到的文件执行操作。一个常见的例子是删除文件。最好先在没有-exec选项的情况下进行测试,以确保选择了正确的文件,之后可以重新运行该命令以删除选定的文件。下面,我们搜索以.tmp:

peter:~>  find . -name "*.tmp" -exec rm {} \;

peter:~>

Tip结尾的文件。
 

优化!

该命令将调用 rm 的次数与找到满足要求的文件一样多。在最坏的情况下,这可能是成千上万甚至数百万次。这对您的系统来说是一个很大的负担。

一种更实际的工作方式是使用管道 (|) 和带有 rm 作为参数的 xargs 工具。这样,只有当命令行已满时才会调用 rm 命令,而不是为每个文件都调用。有关使用 I/O 重定向简化日常任务的更多信息,请参见第 5 章

之后(根据 man 页面,在 1999 年,经过 20 年的 find 之后),开发了 locate。此程序更易于使用,但比 find 受到更多限制,因为它的输出基于每天只更新一次的文件索引数据库。另一方面,在 locate 数据库中搜索比 find 使用更少的资源,因此几乎可以立即显示结果。如今,大多数 Linux 发行版都使用 slocate,这是一种安全增强型 locate,是 locate 的现代版本,可防止用户获取他们无权读取的输出。 *root* 的主目录中的文件就是一个例子,这些文件通常无法公开访问。想要找到了解 C shell 的人可以使用命令 locate .cshrc 显示所有为 C shell 拥有自定义配置文件的用户。假设用户 *root* 和 *jenny* 正在运行 C shell,那么只会显示文件/home/jenny/.cshrc

billy:~> ls -l /usr/bin/locate
lrwxrwxrwx 1 root slocate  7 Oct 28 14:18 /usr/bin/locate -> slocate*

,而不会显示 *root* 主目录中的文件。在大多数系统中, locate 是指向 slocate 程序的符号链接

tina:~> locate acroread
/usr/share/icons/hicolor/16x16/apps/acroread.png
/usr/share/icons/hicolor/32x32/apps/acroread.png
/usr/share/icons/locolor/16x16/apps/acroread.png
/usr/share/icons/locolor/32x32/apps/acroread.png
/usr/local/bin/acroread
/usr/local/Acrobat4/Reader/intellinux/bin/acroread
/usr/local/Acrobat4/bin/acroread

用户 *tina* 可以使用 locate 找到她想要的应用程序bin不包含名称的目录不能包含该程序 - 它们不包含可执行文件。剩下三种可能性。在/usr/local/bin

tina:~> file /usr/local/bin/acroread
/usr/local/bin/acroread: symbolic link to ../Acrobat4/bin/acroread

tina:~> file /usr/local/Acrobat4/bin/acroread
/usr/local/Acrobat4/bin/acroread: Bourne shell script text executable

tina:~> file /usr/local/Acrobat4/Reader/intellinux/bin/acroread
/usr/local/Acrobat4/Reader/intellinux/bin/acroread: ELF 32-bit LSB 
executable, Intel 80386, version 1, dynamically linked (uses 
shared libs), not stripped

中的文件是 *tina* 想要的:它是指向启动实际程序的 shell 脚本的链接不能包含该程序 - 它们不包含可执行文件。剩下三种可能性。在为了使路径尽可能短,这样系统不必每次用户想要执行命令时都搜索太久,我们添加不能包含该程序 - 它们不包含可执行文件。剩下三种可能性。在到路径,而不是其他目录,这些目录只包含一个特定程序的二进制文件,而

还包含其他有用的程序。


同样,有关 findlocate 的完整功能的描述可以在 Info 页面中找到。

3.3.3.4.1. 通用行过滤

一个简单而强大的程序,grep 用于过滤输入行并将特定模式返回到输出。 grep 程序有成千上万个应用程序。在下面的示例中,jerry 使用 grep 来查看他是如何用 find 做事的

jerry:~> grep -a find .bash_history
find . -name userinfo
man find
find ../ -name common.cfg

Tip搜索历史
 

在这些情况下,bash 中的搜索功能也很有用,可以通过同时按下 Ctrl+R 激活,例如在我们想要检查上次是如何再次执行 find 的示例中

thomas ~> ^R 
(reverse-i-search)`find': find `/home/thomas` -name *.xml

在搜索提示符下键入搜索字符串。 键入的字符越多,搜索范围就越窄。这将读取此 shell 会话的命令历史记录(该历史记录写入到.bash_history在您退出该会话时位于您的主目录中)。 将显示搜索字符串的最近一次出现。如果要查看包含相同字符串的先前命令,请再次键入 Ctrl+R

有关更多信息,请参见 Info 页面上的 bash

稍微体面一点的所有 UNIX 系统都有一个在线词典。Linux 也有。 该词典是文件中已知单词的列表,该文件名为words,位于/usr/share/dict。要快速检查单词的正确拼写,不需要图形应用程序

william:~> grep pinguin /usr/share/dict/words

william:~> grep penguin /usr/share/dict/words
penguin
penguins

Tip词典与单词列表
 

某些发行版提供 dict 命令,该命令提供的功能不仅仅是在列表中搜索单词。

我的隔壁那个主目录的所有者是谁? 嘿,这是他的电话号码!

lisa:~> grep gdbruyne /etc/passwd
gdbruyne:x:981:981:Guy Debruyne, tel 203234:/home/gdbruyne:/bin/bash

Arno 的电子邮件地址又是什么?

serge:~/mail> grep -i arno *
sent-mail: To: <Arno.Hintjens@celeb.com>
sent-mail: On Mon, 24 Dec 2001, Arno.Hintjens@celeb.com wrote:

findlocate 通常与 grep 结合使用以定义一些重要的查询。有关更多信息,请参见关于 I/O 重定向的 第 5 章


3.3.3.4.2. 特殊字符

对 shell 具有特殊含义的字符必须进行转义Bash 中的转义字符是反斜杠,就像大多数 shell 中一样;这会消除以下字符的特殊含义。 shell 知道很多特殊字符,其中最常见的是 /、.、? 和 *。完整的列表可以在 shell 的 Info 页面和文档中找到。

例如,假设您想要显示文件 "*" 而不是目录中的所有文件,则必须使用

less\*

对于包含空格的文件名也是如此

catThis\ File


3.3.4. 更多查看文件内容的方法

3.3.4.1. 一般说明

除了 cat 之外,它实际上所做的只是将文件发送到标准输出,还有其他工具可以查看文件内容。

当然,最简单的方法是使用图形工具而不是命令行工具。 在介绍中,我们已经看到了办公应用程序 OpenOffice.org 的一瞥。 其他示例包括 GIMP(从命令行使用 gimp 启动),GNU 图像处理程序;xpdf 用于查看便携式文档格式文件 (PDF);GhostView (gv) 用于查看 PostScript 文件;Mozilla/FireFoxlinks(文本模式浏览器)、KonquerorOpera 和许多其他浏览器用于 Web 内容;XMMS、CDplay 和其他用于多媒体文件内容;AbiWordGnumericKOffice 等等用于各种办公应用程序。 Linux 应用程序成千上万;列出所有这些将需要数天的时间。

相反,我们将继续专注于 shell 或文本模式应用程序,这些应用程序构成了所有其他应用程序的基础。 这些命令在包含文本的文件上的文本环境中效果最佳。 如有疑问,请先使用 file 命令进行检查。

那么,让我们看看我们有哪些有用的文本工具可以查看文件内部。

Note字体问题
 

诸如我们现在将要讨论的纯文本工具,由于这些文件中使用的字体编码,通常在处理 “纯” 文本文件时会出现问题。 特殊字符,例如带重音符号的字母字符、中文字符以及使用与默认 en_US 编码不同字符集的语言的其他字符等等,将以错误的方式显示或被不可读的垃圾替换。 这些问题在第 7.4 节中讨论。


3.3.4.2. "lessmore 更好"

毫无疑问,在 UNIX 环境中工作时,迟早会听到有人说这句话。 一点 UNIX 历史解释了这一点

  • 首先是 cat。 输出以无法控制的方式进行流式传输。

  • 然后是 pg,它可能仍然可以在旧的 UNIX 系统上找到。 此命令一次将文本输出到一页。

  • more 程序是 pg 的修订版本。 该命令在每个 Linux 系统上仍然可用。

  • less 是 more 的 GNU 版本,具有额外的功能,允许突出显示搜索字符串、向后滚动等。语法非常简单

    lessname_of_file

    更多信息位于 Info 页面中。

您现在已经了解了分页器,因为它们用于查看 man 页面。


3.3.4.3. head 和 tail 命令

这两个命令分别显示文件的前 n 行/最后 n 行。要查看最后输入的十个命令

tony:~> tail -10 .bash_history 
locate configure | grep bin
man bash
cd
xawtv &
grep usable /usr/share/dict/words 
grep advisable /usr/share/dict/words 
info quota
man quota
echo $PATH
frm

head 的工作方式类似。tail 命令有一个方便的功能,可以持续显示一直变化的文件最后 n 行。这-f选项通常被系统管理员用来检查日志文件。更多信息位于系统文档文件中。


3.3.5. 链接文件

3.3.5.1. 链接类型

既然我们对文件及其在文件系统中的表示形式了解更多,那么理解链接(或快捷方式)就变得轻而易举。 链接只不过是将两个或多个文件名匹配到同一组文件数据的一种方式。 有两种方法可以实现这一点

  • 硬链接:将两个或多个文件名与相同的 inode 关联。 硬链接在硬盘上共享相同的数据块,同时它们继续表现为独立文件。

    存在一个直接的缺点:硬链接不能跨越分区,因为 inode 编号在给定的分区中才是唯一的。

  • 软链接或符号链接(或简称:symlink):一个指向另一个文件的小文件。 符号链接包含目标文件的路径,而不是硬盘上的物理位置。 由于 inode 未在此系统中使用,因此软链接可以跨越分区。

这两种链接类型的行为相似,但并不相同,如下面的方案所示

图 3-2。 硬链接和软链接机制

请注意,删除符号链接的目标文件会使该链接无用。

原则上,每个常规文件都是一个硬链接。 硬链接不能跨越分区,因为它们引用 inode,并且 inode 编号在给定的分区中才是唯一的。

可能会争辩说存在第三种链接,即用户空间链接,它类似于 MS Windows 中的快捷方式。 这些是包含只能由图形文件管理器解释的元数据的文件。 对于内核和 shell 来说,这些只是普通文件。 它们可能以 .desktop.lnk 后缀结尾;可以在~/.gnome-desktop:

[dupont@boulot .gnome-desktop]$ cat La\ Maison\ Dupont
[Desktop Entry]
Encoding=Legacy-Mixed
Name=La Maison Dupont
Type=X-nautilus-home
X-Nautilus-Icon=temp-home
URL=file:///home/dupont

中找到一个示例。此示例来自 KDE 桌面

[lena@venus Desktop]$ cat camera
[Desktop Entry]
Dev=/dev/sda1
FSType=auto
Icon=memory
MountPoint=/mnt/camera
Type=FSDevice
X-KDE-Dynamic-Device=true

使用图形环境的功能创建这种链接非常容易。 如果您需要帮助,您的系统文档应该是您的首选资源。

在下一节中,我们将研究使用命令行创建 UNIX 样式的符号链接。


3.3.5.2. 创建符号链接

符号链接对于初学者来说特别有趣:它们很容易看到,您无需担心分区问题。

创建链接的命令是 ln。 为了创建符号链接,您需要使用-soption

ln-s 目标文件 链接名

在下面的示例中,用户 freddy 在其主目录的子目录中创建一个指向系统另一部分目录的链接

freddy:~/music> ln -s /opt/mp3/Queen/ Queen

freddy:~/music> ls -l
lrwxrwxrwx  1 freddy  freddy  17 Jan 22 11:07 Queen -> /opt/mp3/Queen

符号链接始终是非常小的文件,而硬链接的大小与原始文件的大小相同。

符号链接的应用非常广泛。 它们通常用于节省磁盘空间,制作文件的副本以满足期望文件位于另一个位置的新程序的安装要求,它们用于修复突然必须在新环境中运行的脚本,并且通常可以节省大量工作。 系统管理员可能会决定将用户的主目录移动到新位置,disk2例如,但如果他想让一切像以前一样工作,比如/etc/passwd文件,以最小的努力,他将从/home创建一个符号链接到新位置/disk2/home.


3.4. 文件安全性

3.4.1. 访问权限:Linux 的第一道防线

Linux 安全模型基于 UNIX 系统上使用的模型,并且与 UNIX 安全模型一样严格(有时甚至更严格),后者已经非常强大。 在 Linux 系统上,每个文件都归用户和组用户所有。 还有第三类用户,即不是用户所有者且不属于拥有该文件的组的用户。 对于每个用户类别,都可以授予或拒绝读取、写入和执行权限。

我们已经使用了 long 选项来使用 ls -l 命令列出文件,尽管是出于其他原因。 该命令还显示了这三个用户类别的文件权限;它们由第一个字符后面的九个字符指示,第一个字符是文件属性行开头的“文件类型指示符”。 正如下面的示例中看到的那样,这九个系列中的前三个字符显示了拥有该文件的实际用户的访问权限。 接下来的三个字符是文件的组所有者的,最后三个字符是其他用户的。 权限始终按相同顺序排列:用户、组和其他用户的读取、写入、执行权限。 一些例子

marise:~> ls -l To_Do
-rw-rw-r--    1 marise  users      5 Jan 15 12:39 To_Do
marise:~> ls -l /bin/ls
-rwxr-xr-x    1 root    root   45948 Aug  9 15:01 /bin/ls*

第一个文件是一个普通文件(第一个破折号)。 用户名为 marise 的用户或属于 users 组的用户可以读取和写入(更改/移动/删除)该文件,但他们无法执行它(第二个和第三个破折号)。 所有其他用户只能读取此文件,但他们无法写入或执行它(第四个和第五个破折号)。

第二个例子是一个可执行文件,区别在于:每个人都可以运行这个程序,但你需要成为 root 用户才能修改它。

Info 页面详细解释了 ls 命令如何处理访问权限的显示,请参阅列出了哪些信息章节。

为了方便命令使用,访问权限或模式以及用户组都有一个代码。请参阅下表。

表 3-7. 访问模式代码

代码含义
0 或 -该位置本应存在的访问权限未被授予。
4 或 r已授予该位置定义的用户类别读取权限
2 或 w已授予该位置定义的用户类别写入权限
1 或 x已授予该位置定义的用户类别执行权限

表 3-8. 用户组代码

代码含义
u用户权限
g组权限
o其他用户权限

这种直接的方案被严格执行,即使没有网络安全也能实现高安全级别。除了其他功能外,安全方案还负责用户对程序的访问,可以按需提供文件,并保护敏感数据,例如主目录和系统配置文件。

你应该知道你的用户名是什么。 如果你不知道,可以使用 id 命令显示,该命令还会显示你所属的默认组以及你最终成为成员的其他组

tilly:~> id
uid=504(tilly) gid=504(tilly) groups=504(tilly),100(users),2051(org)

你的用户名也存储在环境变量中USER:

tilly:~> echo $USER
tilly

3.4.2. 工具

3.4.2.1. chmod 命令

应用严格文件权限的一个常见结果,有时也是一种麻烦,就是访问权限需要因各种原因而更改。我们使用 chmod 命令来执行此操作,最终 *to chmod* 几乎已成为一个可接受的英语动词,意思是更改文件的访问模式。chmod 命令可以与字母数字或数字选项一起使用,无论你喜欢哪种。

下面的例子使用字母数字选项来解决新用户常遇到的问题

asim:~> ./hello
bash: ./hello: bad interpreter: Permission denied

asim:~> cat hello
#!/bin/bash
echo "Hello, World"

asim:~> ls -l hello
-rw-rw-r--    1 asim    asim    32 Jan 15 16:29 hello

asim:~> chmod u+x hello

asim:~> ./hello
Hello, World

asim:~> ls -l hello
-rwxrw-r--   1 asim    asim    32 Jan 15 16:29 hello*

+- 运算符用于授予或拒绝给定组的给定权限。 允许使用逗号分隔的组合。 Info 和 man 页面包含有用的示例。 这是另一个示例,它使先前示例中的文件成为用户 asim 的私有文件

asim:~> chmod u+rwx,go-rwx hello

asim:~> ls -l hello
-rwx------    1 asim    asim    32 Jan 15 16:29 hello*

导致错误消息的权限问题,通常是访问权限问题。此外,诸如"昨天还能用""我以 root 身份运行它就可以工作"之类的评论很可能是由于文件权限错误引起的。

当使用带有数字参数的 chmod 时,每个授予的访问权限的值必须按组累加。 因此,我们得到一个 3 位数,它是 chmod 必须进行的设置的符号值。 下表列出了最常见的组合

表 3-9. 使用 chmod 进行文件保护

命令含义
chmod400 file为了保护文件免遭意外覆盖。
chmod500 目录为了保护自己免于意外删除、重命名或移动此目录中的文件。
chmod600 file一个只能由输入此命令的用户更改的私有文件。
chmod644 file一个公开可读的文件,只能由发出用户更改。
chmod660 file属于你的组的用户可以更改此文件,其他人则无权访问。
chmod700 file保护文件免受其他用户的任何访问,而发出用户仍然具有完全访问权限。
chmod755 目录对于应该可供其他人读取和执行,但只能由发出用户更改的文件。
chmod775 file组的标准文件共享模式。
chmod777 file每个人都可以对此文件执行任何操作。

如果你输入一个小于三位数的数字作为 chmod 的参数,则省略的字符将从左侧开始替换为零。 实际上,Linux 系统上有一个第四位数字,它位于前三位之前,用于设置特殊的访问模式。有关这些以及更多内容的所有信息都位于 Info 页面中。


3.4.2.2. 登录到另一个组

当你在命令行输入 id 时,你将获得一个你可以属于的所有组的列表,前面是你的用户名和 ID,以及你当前连接的组名称和 ID。 但是,在许多 Linux 系统上,你一次只能主动登录到一个组。默认情况下,此活动或主组是你从/etc/passwd文件中分配到的组。 此文件的第四个字段包含用户的主组 ID,该 ID 在/etc/group文件中查找。 一个例子

asim:~> id
uid=501(asim) gid=501(asim) groups=100(users),501(asim),3400(web)

asim:~> grep asim /etc/passwd
asim:x:501:501:Asim El Baraka:/home/asim:/bin/bash

asim:~> grep 501 /etc/group
asim:x:501:

来自该行的第四个字段/etc/passwd包含值"501",在上例中代表组asim。 从/etc/group我们可以获得与此组 ID 匹配的名称。 首次连接到系统时,这是 asim 将属于的组。

Note用户私有组方案
 

为了允许更大的灵活性,大多数 Linux 系统都遵循所谓的用户私有组方案,该方案主要将每个用户分配到他或她自己的组。 这个组是一个仅包含此特定用户的组,因此得名"私有组"。 通常,此组的名称与用户登录名相同,这可能会让人感到困惑。

除了他自己的私有组之外,用户 asim 也可以在组 usersweb 中。 因为这些是该用户的辅助组,所以他需要使用 newgrp 登录到任何这些组(首先使用 gpasswd 设置组密码)。 在示例中,asim 需要创建由组 web 拥有的文件。

asim:/var/www/html> newgrp web

asim:/var/www/html> id
uid=501(asim) gid=3400(web) groups=100(users),501(asim),3400(web)

asim 现在创建新文件时,它们将由组 web 拥有,而不是由组 asim 拥有

asim:/var/www/html> touch test

asim:/var/www/html> ls -l test
-rw-rw-r--  1 asim web   0 Jun 10 15:38 test

登录到新组可防止你必须使用 chown(请参阅第 3.4.2.4 节)或调用你的系统管理员来更改所有权。

有关更多信息,请参阅 newgrp 的 manpage。


3.4.2.3. 文件掩码

当新文件保存在某个位置时,它首先会经过标准安全程序。 没有权限的文件在 Linux 上不存在。 标准文件权限由新文件创建的掩码确定。 可以使用 umask 命令显示此掩码的值

bert:~> umask
0002

chmod 一样,不是将符号值相互添加,而是为了计算新文件的权限,需要从总的可能访问权限中减去它们。 但是,在上面的示例中,我们看到显示了 4 个值,但只有 3 个权限类别:用户其他。 第一个零是特殊文件属性设置的一部分,我们将在第 3.4.2.4 节第 4.1.6 节中讨论这些设置。 当输入 umask 命令时,你的系统可能根本不会显示第一个零,而你只会看到 3 个数字,代表默认文件创建掩码。

每个类 UNIX 系统都有一个用于创建新文件的系统函数,每次用户使用创建新文件的程序时都会调用该函数,例如,从 Internet 下载文件、保存新文本文档等等。 此函数会创建新文件和新目录。 创建新目录时,将向所有人授予完全的读取、写入和执行权限。 创建新文件时,此函数将为所有人授予读取和写入权限,但将所有用户类别的执行权限设置为无。 因此,在应用掩码之前,目录的权限为 *777* 或 *rwxrwxrwx*,纯文件的权限为 *666* 或 *rw-rw-rw-*。

在函数创建新文件或目录后,会从这些默认权限中减去 umask 值。 因此,如果掩码值为 (0)002,则目录的默认权限为 775,文件的默认权限为 664。 下面的示例演示了这一点

bert:~> mkdir newdir

bert:~> ls -ld newdir
drwxrwxr-x    2 bert    bert		4096 Feb 28 13:45 newdir/

bert:~> touch newfile

bert:~> ls -l newfile
-rw-rw-r--    1 bert    bert		   0 Feb 28 13:52 newfile

Note文件与目录
 

默认情况下,目录具有更多权限:它始终具有执行权限。 如果它没有该权限,则将无法访问。 通过 chmodding 一个目录 644 来尝试一下!

如果使用 newgrp 命令登录到另一个组,则掩码保持不变。 因此,如果将其设置为 002,则你在新组中创建的文件和目录也可以被该组的其他成员访问; 你不必使用 chmod

root 用户通常具有更严格的默认文件创建权限

[root@estoban root]# umask
022

这些默认值在 shell 资源配置文件中进行系统范围的设置,例如/etc/bashrc或者/etc/profile。 你可以在自己的 shell 配置文件中更改它们,请参阅关于自定义 shell 环境的第 7 章


3.4.2.4. 更改用户和组所有权

当文件由错误的用户或组拥有时,可以使用 chown(更改所有者)和 chgrp(更改组)命令修复该错误。 在需要在组中共享文件的环境中,更改文件所有权是一项常见的系统管理任务。 这两个命令都非常灵活,你可以通过使用--help选项来了解。

可以应用 chown 命令来更改文件的用户和组所有权,而 chgrp 仅更改组所有权。 当然,系统会检查发出这些命令之一的用户是否对她想要更改的文件具有足够的权限。

为了仅更改文件的用户所有权,请使用以下语法

chown新用户 file

如果在使用用户名后使用冒号(请参见Info页面),组所有权也会随之更改,更改为发出命令的用户的首要组。在Linux系统中,每个用户都有自己的组,因此可以使用这种形式来使文件私有化。

jacky:~> id
uid=1304(jacky) gid=(1304) groups=1304(jacky),2034(pproject)

jacky:~> ls -l my_report
-rw-rw-r--  1 jacky   project       29387 Jan 15 09:34 my_report

jacky:~> chown jacky: my_report

jacky:~> chmod o-r my_report

jacky:~> ls -l my_report
-rw-rw----  1 jacky   jacky         29387 Jan 15 09:34 my_report

如果jacky想要共享此文件,而不必授予每个人写入权限,则可以使用 chgrp 命令。

jacky:~> ls -l report-20020115.xls
-rw-rw---- 1 jacky   jacky   45635 Jan 15 09:35 report-20020115.xls

jacky:~> chgrp project report-20020115.xls

jacky:~> chmod o= report-20020115.xls

jacky:~> ls -l report-20020115.xls
-rw-rw---- 1 jacky   project 45635 Jan 15 09:35 report-20020115.xls

这样,组project中的用户将能够处理此文件。不在此组中的用户根本无权访问该文件。

chownchgrp 都可以递归地更改所有权,使用-R-R选项。在这种情况下,给定目录的所有底层文件和子目录都将属于给定的用户和/或组。

Note限制
 

在大多数系统中,非特权用户使用 chownchgrp 命令受到限制。如果不是系统管理员,出于安全原因,你不能更改用户或组的所有权。如果对这些命令的使用没有限制,恶意用户可以将文件的所有权分配给其他用户和/或组,并更改这些用户的环境行为,甚至可能损坏其他用户的文件。


3.4.2.5. 特殊模式

为了避免系统管理员总是要解决权限问题,可以为整个目录或单独的程序赋予特殊的访问权限。有三种特殊模式:

  • 粘滞位模式:作业执行后,该命令会保留在系统内存中。最初,这是一种经常使用的功能,用于节省内存:大型作业仅加载到内存一次。但是现在内存很便宜,并且有更好的技术来管理它,因此它不再用于优化单个文件的功能。但是,当应用于整个目录时,粘滞位具有不同的含义。在这种情况下,用户只能更改该目录中的文件,前提是她是该文件的所有者,或者该文件具有适当的权限。此功能用于诸如/var/tmp/tmp的目录,这些目录必须对所有人都可以访问,但不适合用户更改或删除彼此的数据。粘滞位在文件权限字段的末尾用t表示。

    mark:~> ls -ld /var/tmp
    drwxrwxrwt   19 root     root         8192 Jan 16 10:37 /var/tmp/
    

    使用命令 chmod o+t directory 设置粘滞位。 "t" 的历史起源于UNIX的保存文本访问功能。

  • SUID(设置用户ID)和SGID(设置组ID):在用户或组权限字段中用字符s表示。当在可执行文件上设置此模式时,它将以文件上的用户和组权限运行,而不是以发出命令的用户的权限运行,从而可以访问系统资源。我们将在第4章中对此进行进一步讨论。

  • 目录上的SGID(设置组ID):在这种特殊情况下,目录中创建的每个文件都将具有与目录本身相同的组所有者(而正常的行为是,新文件由创建它们的用户拥有)。这样,用户在共享目录时无需担心文件所有权。

    mimi:~> ls -ld /opt/docs
    drwxrws---  4 root    users          4096 Jul 25 2001 docs/
    
    mimi:~> ls -l /opt/docs
    -rw-rw----  1 mimi    users        345672 Aug 30 2001-Council.doc
    

    这是在UNIX中共享文件的标准方法。

    Note现有文件保持不变!
     

    正在移动到SGID目录但在其他位置创建的文件将保留其原始用户和组所有者。这可能会令人困惑。


3.5. 总结

在UNIX(如Linux)上,所有实体都以某种方式或另一种方式作为具有适当文件属性的文件呈现给系统。使用(预定义的)路径允许用户和系统管理员查找、读取和操作文件。

我们已经朝着成为专家的方向迈出了第一步:我们讨论了文件系统的真实和伪造结构,并且我们了解了Linux文件安全模型,以及默认情况下在每个系统上采取的几种其他安全预防措施。

shell是与系统交互的最重要工具。我们在本章中学习了几个shell命令,这些命令在下表中列出。

表3-10。第3章中的新命令:文件和文件系统

命令含义
bashGNU shell程序。
catfile(s)将文件内容发送到标准输出。
cd目录输入目录cdbash内置命令。
chgrpnewgroup file(s)更改组所有权file(s)newgroup
chmodmode file(s)更改访问权限file(s)
chownnewowner[:[newgroup]]file(s) 更改文件所有者和组所有权。
cpsourcefile 目标文件复制sourcefile切换到你的主目录中的目标文件.
dffile报告包含file.
echo字符串显示一行文本
exportbash的一部分,用于向系统宣告变量及其值。
filefilename确定文件类型filename.
findpath expression在文件系统层次结构中查找文件
grepPATTERN file打印file中包含搜索模式的行。
headfile发送file的第一部分到标准输出
id打印真实和有效的用户名和组。
infocommand阅读有关command的文档。
lessfile查看file使用强大的查看器。
ln目标文件 链接名创建名为链接名切换到你的主目录中的目标文件.
locatesearchstring打印所有与搜索模式匹配的可访问文件。
lsfile(s)打印目录内容。
mancommand格式化并显示command的在线(系统)手册页。
mkdirnewdir创建一个新的空目录。
mvoldfile newfile重命名或移动oldfile.
newgrpgroupname登录到新组。
pwd打印当前或当前工作目录。
quota显示磁盘使用情况和限制。
rmfile删除文件和目录。
rmdirfile删除目录。
tailfile打印file.
umask [value]显示或更改新文件创建模式。
wcfile计算file.
whichcommand显示command的完整路径。

我们还强调了您应该阅读MAN页面。该文档是您的急救箱,其中包含许多问题的答案。上面的列表包含您每天都会使用的基本命令,但是它们可以执行比我们在此处讨论的任务更多的任务。阅读文档将为您提供所需的控制权。

最后但并非最不重要的一点,文件权限的方便概述

表3-11。文件权限

谁\什么r(ead)w(rite)(e)x(ecute)
u(ser)421
g(roup)421
o(ther)421

3.6. 练习

只需使用你的常用用户ID登录。


3.6.1. 分区

  • 你的主目录位于哪个分区上?

  • 你的系统上有多少个分区?

  • 你的Linux安装的总大小是多少?


3.6.2. 路径

  • 显示你的搜索路径。

  • 通过输入例如export PATH=blah来导出无意义的路径,并尝试列出目录内容。

  • 你的主目录的路径是什么?如果另一个用户从他自己的主目录开始,使用相对路径,他将如何到达你的主目录?

  • 转到/tmp目录。/var.

  • 现在仅使用一个命令转到/usr/share/usr。更改为doc。你现在的工作目录是什么?


3.6.3. 系统导览

  • 更改为/proc目录。

  • 系统正在运行什么CPU?

  • 它当前使用多少RAM?

  • 你有多少交换空间?

  • 加载了哪些驱动程序?

  • 系统已经运行了多少小时?

  • 你的系统知道哪些文件系统?

  • 更改为/etc/rc.d | /etc/init.d | /etc/runlevels并选择适合你运行级别的目录。

  • 此级别应运行哪些服务?

  • 哪些服务在图形模式下运行,但在文本模式下不运行?

  • 更改为/etc

  • 系统将监控用户登录的日志文件保留多长时间?

  • 你正在运行哪个版本?

  • 是否有任何问题或每日消息?

  • 你的系统上定义了多少个用户?不要数它们,让计算机为你做!

  • 有多少组?

  • 时区信息保存在哪里?

  • HOWTO是否安装在你的系统上?

  • 更改为/usr/share/doc.

  • 命名GNU coreutils软件包附带的三个程序。

  • 此系统上安装了哪个版本的bash


3.6.4. 操作文件

  • 在你的主目录中创建一个新目录。

  • 你能将此目录移动到与你的主目录相同的级别吗?

  • /usr/share/pixmaps将所有XPM文件复制到新目录。 XPM是什么意思?

  • 按反字母顺序排列文件。

  • 更改为你的主目录。创建一个新目录并复制所有文件/etc的子目录中的文件和目录。/etc/etc!(递归复制)

  • 更改到新目录,并为以大写字符开头的文件创建一个目录,为以小写字符开头的文件创建一个目录。将所有文件移动到适当的目录。使用尽可能少的命令。

  • 删除剩余文件。

  • 使用单个命令删除该目录及其全部内容。

  • 使用grep找出哪个脚本在图形运行级别中启动字体服务器。

  • sendmail服务器程序在哪里?

  • 在你的主目录中创建一个符号链接到/var/tmp。检查它是否真的有效。

  • 在你的家目录中创建指向该链接的另一个符号链接。检查它是否工作。删除第一个链接并列出目录内容。第二个链接发生了什么?


3.6.5. 文件权限

  • 你能否更改文件的权限?/home?

  • 你的标准文件创建模式是什么?

  • 更改以下文件的所有权:/etc为你的用户和用户组。

  • 更改以下文件的文件权限:~/.bashrc使其只有你和你的主用户组才能读取它。

  • 执行命令 locate root。你注意到什么特别之处了吗?

  • 创建一个指向以下文件的符号链接:/root. 它可以使用吗?


第四章. 进程

除了文件之外,进程是 UNIX/Linux 系统上最重要的东西。在本章中,我们将更仔细地研究这些进程。我们将更多地了解:

  • 多用户处理和多任务处理

  • 进程类型

  • 用不同的信号控制进程

  • 进程属性

  • 进程的生命周期

  • 系统启动和关闭

  • SUID 和 SGID

  • 系统速度和响应

  • 调度进程

  • Vixie cron 系统

  • 如何充分利用你的系统


4.1. 进程内幕

4.1.1. 多用户和多任务处理

既然我们更加习惯我们的环境并且能够与我们的系统进行少量通信,那么现在是时候更详细地研究我们可以启动的进程了。并非每个命令都启动单个进程。有些命令启动一系列进程,例如 mozilla;另一些命令(如 ls)则作为单个命令执行。

此外,Linux 基于 UNIX,在 UNIX 中,常见的策略是让多个用户同时在同一系统上运行多个命令。很明显,必须采取措施让 CPU 管理所有这些进程,并且必须提供功能以便用户可以在进程之间切换。在某些情况下,即使启动进程的用户注销,进程也必须继续运行。用户需要一种重新激活中断进程的方法。

我们将在下一节中解释 Linux 进程的结构。


4.1.2. 进程类型

4.1.2.1. 交互式进程

交互式进程通过终端会话初始化和控制。换句话说,必须有人连接到系统才能启动这些进程;它们不会作为系统功能的一部分自动启动。这些进程可以在前台运行,占用启动该程序的终端,并且只要该进程在前台运行,你就无法启动其他应用程序。或者,它们可以在后台运行,以便启动该程序的终端可以在程序运行时接受新命令。到目前为止,我们主要关注在前台运行的程序 - 运行它们所需的时间太短而无法注意到 - 但是使用 less 命令查看文件是一个很好的例子,说明一个命令占用了终端会话。在这种情况下,激活的程序正在等待你执行某些操作。该程序仍然连接到启动它的终端,并且该终端仅可用于输入此程序可以理解的命令。其他命令只会导致错误或系统无响应。

但是,当进程在后台运行时,用户不会被阻止在启动该程序的终端中执行其他操作,同时该程序正在运行。

shell 提供了一个名为作业控制的功能,可以轻松处理多个进程。这种机制在前台和后台之间切换进程。使用此系统,程序也可以立即在后台启动。

仅对于不需要用户输入(通过 shell)的程序,在后台运行进程才有用。通常,当预计作业的执行需要很长时间时,才会将作业置于后台。为了在输入命令后释放发出终端,添加了一个尾随的与号。在此示例中,使用图形模式,我们从现有终端打开一个额外的终端窗口

billy:~> xterm &
[1] 26558

billy:~> jobs
[1]+  Running                 xterm &

完整的作业控制功能在 bash Info 页面中详细解释,因此这里仅列出常用的作业控制应用程序

表 4-1. 控制进程

(部分)命令含义
regular_command在前台运行此命令。
command &在后台运行此命令(释放终端)
jobs显示在后台运行的命令。
Ctrl+Z暂停(停止,但不退出)在前台运行的进程(暂停)。
Ctrl+C中断(终止并退出)在前台运行的进程。
%n在后台运行的每个进程都会被分配一个数字。通过使用 % 表达式,可以使用其编号来引用作业,例如 fg %2
bg在后台重新激活暂停的程序。
fg将作业放回前台。
kill结束进程(另请参阅 bash 的 Info 页面中的 Shell 内置命令)

更多实际示例可以在练习中找到。

大多数 UNIX 系统都可能能够运行 screen,当你真正想要另一个 shell 来执行命令时,它非常有用。调用 screen 后,将创建一个新会话,并附带一个 shell 和/或指定的命令,然后你可以将其放在一边。在这个新会话中,你可以做任何你想做的事情。所有程序和操作都将独立于发出 shell 运行。然后你可以分离此会话,同时你在其中启动的程序继续运行,即使你从原始 shell 注销,也可以随时再次拾取你的屏幕

该程序起源于尚未发明虚拟控制台的时代,并且需要使用一个文本终端完成所有事情。对于上瘾者来说,即使我们已经拥有虚拟控制台将近十年,它在 Linux 中仍然具有意义。


4.1.2.2. 自动进程

自动或批处理进程未连接到终端。相反,这些是可以排队到假脱机区域的任务,它们在那里等待以 FIFO(先进先出)的方式执行。可以使用以下两个标准之一来执行此类任务:

  • 在特定的日期和时间:使用 at 命令完成,我们将在本章的第二部分中讨论它。

  • 在系统总负载足够低以接受额外作业时:使用 batch 命令完成。默认情况下,任务被放入队列中,在那里它们等待执行,直到系统负载低于 0.8。在大型环境中,当必须处理大量数据或必须在已经加载的系统上执行需要大量系统资源的任务时,系统管理员可能更喜欢批处理。批处理也用于优化系统性能。


4.1.2.3. 守护进程

守护进程是持续运行的服务器进程。大多数情况下,它们在系统启动时初始化,然后在后台等待,直到需要它们的服务。一个典型的例子是网络守护进程 xinetd,它几乎在每个启动过程中启动。系统启动后,网络守护进程只是坐在那里等待,直到客户端程序(例如 FTP 客户端)需要连接。


4.1.3. 进程属性

进程具有一系列特征,可以使用 ps 命令查看

  • 进程 ID 或 PID:用于引用进程的唯一标识号。

  • 父进程 ID 或 PPID:启动此进程的进程的编号 (PID)。

  • Nice 值:此进程对其他进程的友好程度(不要与进程优先级混淆,进程优先级是根据此 Nice 值和进程最近的 CPU 使用情况计算得出的)。

  • 终端或 TTY:进程连接到的终端。

  • 真实和有效用户的用户名(RUID 和 EUID):进程的所有者。真实所有者是发出命令的用户,有效用户是确定对系统资源的访问权限的用户。RUID 和 EUID 通常相同,并且进程具有与发出用户相同的访问权限。一个例子来阐明这一点:浏览器 mozilla/usr/bin由用户 root 拥有

    theo:~> ls -l /usr/bin/mozilla
    -rwxr-xr-x  1 root   root      4996 Nov 20 18:28 /usr/bin/mozilla*
    
    theo:~> mozilla &
    [1] 26595
    
    theo:~> ps -af
    UID     PID  PPID C STIME TTY       TIME CMD
    theo  26601 26599 0 15:04 pts/5 00:00:00 /usr/lib/mozilla/mozilla-bin
    theo  26613 26569 0 15:04 pts/5 00:00:00 ps -af
    

    当用户 theo 启动此程序时,进程本身以及初始进程启动的所有进程都将由用户 theo 拥有,而不是由系统管理员拥有。当 mozilla 需要访问某些文件时,该访问将由 theo 的权限决定,而不是由 root 的权限决定。

  • 真实和有效组所有者(RGID 和 EGID):进程的真实组所有者是启动进程的用户的主组。有效组所有者通常相同,除非 SGID 访问模式已应用于文件。


4.1.4. 显示进程信息

ps 命令是用于可视化进程的工具之一。此命令有多个选项,可以组合使用以显示不同的进程属性。

未指定任何选项时,ps 仅提供有关当前 shell 和最终进程的信息

theo:~> ps
  PID TTY          TIME CMD
 4245 pts/7    00:00:00 bash
 5314 pts/7    00:00:00 ps

由于这没有提供足够的信息 - 通常,您的系统上至少运行着一百个进程 - 我们通常会使用 管道 中的 grep 命令从所有进程的列表中选择特定进程,请参阅 5.1.2.1 节,如这一行所示,它将选择并显示特定用户拥有的所有进程

ps-ef| grepusername

此示例显示了所有进程名称为 bash 的进程,它是 Linux 系统上最常见的登录 shell

theo:> ps auxw | grep bash
brenda   31970  0.0  0.3  6080 1556 tty2   S  Feb23   0:00 -bash
root     32043  0.0  0.3  6112 1600 tty4   S  Feb23   0:00 -bash
theo     32581  0.0  0.3  6384 1864 pts/1  S  Feb23   0:00 bash
theo     32616  0.0  0.3  6396 1896 pts/2  S  Feb23   0:00 bash
theo     32629  0.0  0.3  6380 1856 pts/3  S  Feb23   0:00 bash
theo      2214  0.0  0.3  6412 1944 pts/5  S  16:18   0:02 bash
theo      4245  0.0  0.3  6392 1888 pts/7  S  17:26   0:00 bash
theo      5427  0.0  0.1  3720  548 pts/7  S  19:22   0:00 grep bash

在这些情况下,找到包含字符串 bash 的行的 grep 命令通常也显示在具有大量空闲时间的系统上。如果你不想发生这种情况,请使用 pgrep 命令。

Bash shell 是一种特殊情况:此进程列表还会显示哪些是登录 shell(您必须提供用户名和密码才能登录的 shell,例如在文本模式下登录或进行远程登录时,与非登录 shell 不同,非登录 shell 例如通过单击终端窗口图标启动)。 这种登录 shell 前面会有一个破折号 (-)。

Note|?
 

我们将在下一章中解释 | 运算符,请参阅第 5 章

可以在通常的方式找到更多信息:ps --helpman ps。 GNU ps 支持不同风格的选项格式; 上面的例子没有包含错误。

请注意,ps 仅提供活动进程的瞬时状态,它是一次性记录。 top 程序通过每五秒钟更新一次 ps(带有一堆选项)给出的结果来显示更精确的视图,定期生成导致最重负载的进程的新列表,同时整合有关正在使用的交换空间和 CPU 状态的更多信息,来自proc文件系统

 12:40pm up 9 days, 6:00, 4 users, load average: 0.21, 0.11, 0.03
89 processes: 86 sleeping, 3 running, 0 zombie, 0 stopped
CPU states:  2.5% user,  1.7% system,  0.0% nice, 95.6% idle
Mem:   255120K av, 239412K used, 15708K free, 756K shrd, 22620K buff
Swap: 1050176K av, 76428K used, 973748K free, 82756K cached

  PID USER  PRI NI SIZE  RSS SHARE STAT %CPU %MEM TIME COMMAND
 5005 root  14  0 91572  15M 11580 R    1.9  6.0  7:53 X
19599 jeff  14  0  1024 1024   796 R    1.1  0.4  0:01 top
19100 jeff   9  0  5288 4948  3888 R    0.5  1.9  0:24 gnome-terminal
19328 jeff   9  0 37884  36M 14724 S    0.5 14.8  1:30 mozilla-bin
    1 root   8  0   516  472   464 S    0.0  0.1  0:06 init
    2 root   9  0     0    0     0 SW   0.0  0.0  0:02 keventd
    3 root   9  0     0    0     0 SW   0.0  0.0  0:00 kapm-idled
    4 root  19 19     0    0     0 SWN  0.0  0.0  0:00 ksoftirqd_CPU0
    5 root   9  0     0    0     0 SW   0.0  0.0  0:33 kswapd
    6 root   9  0     0    0     0 SW   0.0  0.0  0:00 kreclaimd
    7 root   9  0     0    0     0 SW   0.0  0.0  0:00 bdflush
    8 root   9  0     0    0     0 SW   0.0  0.0  0:05 kupdated
    9 root  -1-20     0    0     0 SW<  0.0  0.0  0:00 mdrecoveryd
   13 root   9  0     0    0     0 SW   0.0  0.0  0:01 kjournald
   89 root   9  0     0    0     0 SW   0.0  0.0  0:00 khubd
  219 root   9  0     0    0     0 SW   0.0  0.0  0:00 kjournald
  220 root   9  0     0    0     0 SW   0.0  0.0  0:00 kjournald

top 的第一行包含与 uptime 命令显示的相同信息

jeff:~> uptime
  3:30pm, up 12 days, 23:29, 6 users, load average: 0.01, 0.02, 0.00

这些程序的数据存储在/var/run/utmp(有关当前连接用户的信息)和虚拟文件系统中,例如/proc,例如/proc/loadavg(平均负载信息)。 有各种图形应用程序可以查看这些数据,例如Gnome 系统监视器lavaps。 在 FreshMeatSourceForge 上,您会发现数十个应用程序,它们将此信息与其他服务器数据和来自多个服务器的日志集中在一个(Web)服务器上,从而可以从一个工作站监视整个 IT 基础架构。

可以使用 pstree 命令可视化进程之间的关系

sophie:~> pstree
init-+-amd
     |-apmd
     |-2*[artsd]
     |-atd
     |-crond
     |-deskguide_apple
     |-eth0
     |-gdm---gdm-+-X
     |           `-gnome-session-+-Gnome
     |                           |-ssh-agent
     |                           `-true
     |-geyes_applet
     |-gkb_applet
     |-gnome-name-serv
     |-gnome-smproxy
     |-gnome-terminal-+-bash---vim
     |                |-bash
     |                |-bash---pstree
     |                |-bash---ssh
     |                |-bash---mozilla-bin---mozilla-bin---3*[mozilla-bin]
     |                `-gnome-pty-helper
     |-gpm
     |-gweather
     |-kapm-idled
     |-3*[kdeinit]
     |-keventd
     |-khubd
     |-5*[kjournald]
     |-klogd
     |-lockd---rpciod
     |-lpd
     |-mdrecoveryd
     |-6*[mingetty]
     |-8*[nfsd]
     |-nscd---nscd---5*[nscd]
     |-ntpd
     |-3*[oafd]
     |-panel
     |-portmap
     |-rhnsd
     |-rpc.mountd
     |-rpc.rquotad
     |-rpc.statd
     |-sawfish
     |-screenshooter_a
     |-sendmail
     |-sshd---sshd---bash---su---bash
     |-syslogd
     |-tasklist_applet
     |-vmnet-bridge
     |-xfs
     `-xinetd-ipv6

ls-u-a选项提供其他信息。 有关更多选项及其功能,请参阅 Info 页面。

在下一节中,我们将看到一个进程如何创建另一个进程。


4.1.5. 进程的生与死

4.1.5.1. 进程创建

创建一个新进程是因为现有进程创建了自身的精确副本。 这个子进程与其父进程具有相同的环境,只是进程 ID 号不同。 此过程称为分叉

在分叉过程之后,子进程的地址空间将被新进程数据覆盖。 这是通过对系统的 exec 调用来完成的。

因此,fork-and-exec 机制将旧命令切换为新命令,而新程序执行的环境保持不变,包括输入和输出设备、环境变量和优先级的配置。 此机制用于创建所有 UNIX 进程,因此也适用于 Linux 操作系统。 即使是第一个进程 init(进程 ID 为 1),也是在启动过程中的所谓引导过程中分叉的。

此方案说明了 fork-and-exec 机制。 进程 ID 在 fork 过程后更改

图 4-1. Fork-and-exec 机制

在某些情况下,即使进程不是由 init 启动的,init 也会成为进程的父进程,正如我们在 pstree 示例中已经看到的那样。 许多程序,例如,守护进程化它们的子进程,以便它们可以在父进程停止或被停止时继续运行。 窗口管理器就是一个典型的例子; 它启动一个 xterm 进程,该进程生成一个接受命令的 shell。 然后,窗口管理器拒绝承担任何进一步的责任,并将子进程传递给 init。 使用此机制,可以在不中断正在运行的应用程序的情况下更改窗口管理器。

偶尔事情会出错,即使在良好的家庭中也是如此。 在特殊情况下,进程可能会在父进程不等待该进程完成的情况下结束。 这种未埋葬的进程称为僵尸进程。


4.1.5.2. 结束进程

当进程正常结束时(它没有被终止或以其他方式意外中断),程序会将其退出状态返回给父进程。 此退出状态是程序返回的数字,提供程序执行的结果。 执行作业时返回信息的系统起源于编写 UNIX 的 C 编程语言。

然后,返回值可以由父进程或脚本解释。 返回值的含义取决于具体的程序。 此信息通常可以在指定程序的手册页中找到,例如 grep 命令返回-1如果没有找到匹配项,则会打印类似 "No files found" 的消息。 另一个例子是 Bash 内置命令 true,它除了返回退出状态 0(表示成功)之外什么也不做。


4.1.5.3. 信号

进程因收到信号而结束。 您可以向进程发送多个信号。 使用 kill 命令向进程发送信号。 命令 kill -l 显示信号列表。 大多数信号供系统内部使用,或供程序员编写代码时使用。 作为用户,您将需要以下信号

表 4-2. 常用信号

信号名称信号编号含义
SIGTERM15以有序的方式终止进程。
SIGINT2中断进程。 进程可以忽略此信号。
SIGKILL9中断进程。 进程无法忽略此信号。
SIGHUP1对于守护进程:重新读取配置文件。

您可以在 man 7 signal 中阅读更多关于向进程发送信号时采取的默认操作。


4.1.6. SUID 和 SGID

正如我们在上一章中承诺的那样,我们现在将更详细地讨论特殊模式 SUID 和 SGID。 这些模式的存在是为了向普通用户提供执行他们通常无法执行的任务的能力,因为基于 UNIX 的系统上使用了严格的文件权限方案。 在理想情况下,特殊模式应尽可能少地使用,因为它们包含安全风险。 Linux 开发人员通常尽可能避免它们。 例如,Linux ps 版本使用存储在/proc文件系统中的信息,每个人都可以访问该文件系统,从而避免向公众公开敏感的系统数据和资源。 在此之前,并且仍然在较旧的 UNIX 系统上,ps 程序需要访问诸如/dev/mem/dev/kmem之类的文件,由于这些文件上的权限和所有权,这存在缺点

rita:~> ls -l /dev/*mem
crw-r-----    1 root     kmem       1,   2 Aug 30 22:30 /dev/kmem
crw-r-----    1 root     kmem       1,   1 Aug 30 22:30 /dev/mem

对于旧版本的 ps,除非对其应用特殊模式,否则无法以普通用户身份启动该程序。

虽然我们通常尽量避免应用任何特殊模式,但有时必须使用 SUID。 一个例子是更改密码的机制。 当然,用户希望自己执行此操作,而不是让系统管理员设置他们的密码。 众所周知,用户名和密码列在/etc/passwd文件中,该文件具有以下访问权限和所有者

bea:~> ls -l /etc/passwd
-rw-r--r--    1 root     root     1267 Jan 16 14:43 /etc/passwd

不过,用户需要能够更改此文件中的自己的信息。 这是通过授予 passwd 程序特殊权限来实现的

mia:~> which passwd
passwd is /usr/bin/passwd

mia:~> ls -l /usr/bin/passwd
-r-s--x--x    1 root     root    13476 Aug  7 06:03 /usr/bin/passwd*

调用时,passwd 命令将使用 root 的访问权限运行,从而使普通用户能够编辑系统管理员拥有的密码文件。

文件上的 SGID 模式不像 SUID 那样频繁出现,因为 SGID 通常涉及创建额外的组。 但是,在某些情况下,我们必须经历这种麻烦才能构建一个优雅的解决方案(不要太担心这一点 - 必要的小组通常在安装时创建)。 writewall 程序就是这种情况,它们用于将消息发送到其他用户的终端 (ttys)。 write 命令将消息写入单个用户,而 wall 写入所有连接的用户。

通常不允许将文本发送到另一个用户的终端或图形显示器。 为了绕过这个问题,创建了一个组,该组拥有所有终端设备。 当授予 writewall 命令 SGID 权限时,这些命令将使用适用于该组的访问权限运行,在本例中为 tty。 由于该组具有对目标终端的写入权限,因此即使是没有以任何方式使用该终端的权限的用户也可以向其发送消息。

在下面的示例中,用户 joe 首先使用 who 命令找出他的通信员连接到哪个终端。 然后,他使用 write 命令向她发送消息。 此外,还说明了 write 程序和接收用户占用的终端上的访问权限:很明显,除了组所有者之外,其他用户对设备没有任何权限,组所有者可以写入该设备。

joe:~> which write
write is /usr/bin/write

joe:~> ls -l /usr/bin/write
-rwxr-sr-x    1 root     tty      8744 Dec  5 00:55 /usr/bin/write*

joe:~> who
jenny     tty1     Jan 23 11:41
jenny     pts/1    Jan 23 12:21 (:0)
jenny     pts/2    Jan 23 12:22 (:0)
jenny     pts/3    Jan 23 12:22 (:0)
joe       pts/0    Jan 20 10:13 (lo.callhost.org)

joe:~> ls -l /dev/tty1
crw--w----    1 jenny   tty  4,     1 Jan 23 11:41 /dev/tty1

joe:~> write jenny tty1
hey Jenny, shall we have lunch together?
^C

用户 jenny 在她的屏幕上得到这个

Message from joe@lo.callhost.org on ptys/1 at 12:36 ...
hey Jenny, shall we have lunch together?
EOF

收到消息后,可以使用 Ctrl+L 组合键清除终端。 为了不接收任何消息(除了来自系统管理员的消息),请使用 mesg 命令。 要查看哪些连接的用户接受来自其他用户的消息,请使用 who -w。 所有功能都在每个命令的 Info 页面中进行了完整说明。

Note组名可能会有所不同
 

组方案特定于发行版。 其他发行版可能会使用其他名称或其他解决方案。


4.2. 启动过程、Init 和关机

4.2.1. 简介

Linux 最强大的方面之一在于它启动和停止操作系统的开放方法,它使用其特定配置加载指定的程序,允许您更改这些配置以控制启动过程,并以优雅且有组织的方式关闭。

除了控制启动或关闭过程的问题之外,Linux 的开放性使其更容易确定与启动或关闭系统相关的大多数问题的确切来源。 对此过程的基本了解对所有 Linux 系统用户都非常有益。

许多 Linux 系统使用 lilo,即用于启动操作系统的 LInux LOader。 但是,我们将只讨论 GRUB,它更易于使用且更灵活。 如果您需要有关 lilo 的信息,请参阅其手册页和 HOWTO。 这两个系统都支持双启动安装,关于这方面,我们建议参考 HOWTO 中的实际示例和背景信息。


4.2.2. 启动过程

当 x86 计算机启动时,处理器会在系统内存的末尾查找 BIOS(基本输入/输出系统)并运行它。 BIOS 程序被写入永久只读存储器中,并且始终可用。 BIOS 提供与外围设备的最低级别接口,并控制启动过程的第一步。

BIOS 测试系统,查找并检查外围设备,然后查找用于启动系统的驱动器。 通常,它会检查软盘驱动器(或许多较新系统上的 CD-ROM 驱动器)是否存在可启动介质,如果存在则进行检查,然后查找硬盘驱动器。 用于启动的驱动器的顺序通常由系统上的特定 BIOS 设置控制。 一旦 Linux 安装在系统的硬盘驱动器上,BIOS 就会查找位于第一个硬盘驱动器的第一个扇区上的主引导记录 (MBR),将其内容加载到内存中,然后将控制权传递给它。

此 MBR 包含有关如何使用预选的操作系统加载 GRUB(或 LILO)引导加载程序的说明。 然后,MBR 加载引导加载程序,该加载程序接管该过程(如果引导加载程序安装在 MBR 中)。 在默认的 Red Hat Linux 配置中,GRUB 使用 MBR 中的设置在菜单中显示启动选项。 一旦 GRUB 从其命令行或配置文件中收到有关启动操作系统的正确说明,它就会找到必要的启动文件并将机器的控制权交给该操作系统。


4.2.3. GRUB 功能

此启动方法称为直接加载,因为使用指令直接加载操作系统,在引导加载程序和操作系统的主要文件(例如内核)之间没有中间代码。 但是,其他操作系统使用的启动过程可能与上述略有不同。 例如,微软的 DOS 和 Windows 操作系统在安装时会完全覆盖 MBR 上的任何内容,而不会合并当前 MBR 的任何配置。 这会破坏其他操作系统(如 Linux)存储在 MBR 中的任何其他信息。 微软操作系统以及各种其他专有操作系统使用链式加载启动方法加载。 使用此方法,MBR 指向包含操作系统的分区的第一扇区,在该扇区中可以找到实际启动该操作系统所需的特殊文件。

GRUB 支持这两种启动方法,允许您将其与几乎任何操作系统、大多数流行的文件系统以及 BIOS 可以识别的几乎任何硬盘一起使用。

GRUB 包含许多其他功能;最重要的包括

  • GRUB 在 x86 机器上提供了一个真正的基于命令的、预操作系统环境,以在加载具有某些选项的操作系统或收集有关系统的信息时实现最大的灵活性。

  • GRUB 支持逻辑块寻址 (LBA) 模式,这是访问许多 IDE 和所有 SCSI 硬盘所必需的。 在 LBA 之前,硬盘驱动器可能会遇到 1024 柱面限制,其中 BIOS 无法在该点之后找到文件。

  • GRUB 的配置文件在每次系统启动时都会从磁盘读取,从而避免了每次更改启动选项时都必须覆盖 MBR 的麻烦。

可以通过执行 info grub 命令或访问 GRUB 站点来找到 GRUB 的完整描述。 Linux 文档项目有一个 使用 GRUB 多重启动 Mini-HOWTO


4.2.4. Init

内核一旦加载,就会在以下位置找到 initsbin并执行它。

init 启动时,它将成为 Linux 系统上自动启动的所有进程的父进程或祖父进程。 init 做的第一件事是读取其初始化文件,/etc/inittab。 这指示 init 读取环境的初始配置脚本,该脚本设置路径、启动交换、检查文件系统等等。 基本上,此步骤负责系统需要在系统初始化时完成的所有操作:设置时钟、初始化串行端口等等。

然后 init 继续读取/etc/inittab文件,该文件描述了应如何在每个运行级别中设置系统,并设置默认的运行级别。 运行级别是进程的配置。 所有类 UNIX 系统都可以在不同的进程配置中运行,例如单用户模式,该模式被称为运行级别 1 或运行级别 S(或 s)。 在此模式下,只有系统管理员可以连接到系统。 它用于执行维护任务,而不会损坏系统或用户数据的风险。 当然,在此配置中,我们不需要提供用户服务,因此它们都将被禁用。 另一个运行级别是重启运行级别,即运行级别 6,它会根据适当的程序关闭所有正在运行的服务,然后重启系统。

使用 who 来检查您当前的运行级别是什么

willy@ubuntu:~$ who -r
	run-level 2 2006-10-17 23:22		last=S

有关运行级别的更多信息,请参见下一节 第 4.2.5 节

在确定系统的默认运行级别后,init 通过在相应的rc目录中查找来启动系统运行所需的所有后台进程。 init 使用 stop 参数运行每个 kill 脚本(其文件名以 K 开头)。 然后,它在相应的运行级别目录中运行所有启动脚本(其文件名以 S 开头),以便正确启动所有服务和应用程序。 实际上,在系统启动完成后,您可以以 root 身份登录后手动执行这些相同的脚本,例如 /etc/init.d/httpd stopservice httpd stop 命令,在这种情况下会停止 Web 服务器。

Note特殊情况
 

请注意,在系统启动时,通常会执行rc2.drc3.d中的脚本。 在这种情况下,没有服务会停止(至少不是永久性的)。 只有启动的服务。

实际上启动和停止服务的脚本都不位于/etc/rc<x>.d中。 而是,/etc/rc<x>.d中的所有文件都是指向位于/etc/init.d中的实际脚本的符号链接。 符号链接只不过是指向另一个文件的文件,在这种情况下使用它是由于可以创建和删除它,而不会影响实际终止或启动服务的脚本。 指向各种脚本的符号链接以特定顺序编号,以便它们以该顺序启动。 您可以通过更改引用实际控制服务的脚本的符号链接的名称来更改服务启动或终止的顺序。 如果您希望在另一个服务之前或之后立即启动或停止特定服务,则可以多次使用相同的编号,如以下示例所示,列出了/etc/rc5.d的内容,其中 crondxfs 都是从以 "S90" 开头的链接名启动的。 在这种情况下,脚本按字母顺序启动。

[jean@blub /etc/rc5.d] ls
K15httpd@     K45named@    S08ipchains@  S25netfs@      S85gpm@
K16rarpd@     K46radvd@    S08iptables@  S26apmd@       S90crond@
K20nfs@       K61ldap@     S09isdn@      S28autofs@     S90xfs@
K20rstatd@    K65identd@   S10network@   S30nscd@       S95anacron@
K20rusersd@   K74ntpd@     S12syslog@    S55sshd@       S95atd@
K20rwalld@    K74ypserv@   S13portmap@   S56rawdevices@ S97rhnsd@
K20rwhod@     K74ypxfrd@   S14nfslock@   S56xinetd@     S99local@
K25squid@     K89bcm5820@  S17keytable@  S60lpd@
K34yppasswdd@  S05kudzu@    S20random@    S80sendmail@

init 通过运行级别进入默认运行级别后,/etc/inittab脚本会为每个虚拟控制台(文本模式下的登录提示符)派生一个 getty 进程。 getty 打开 tty 行,设置其模式,打印登录提示符,获取用户的姓名,然后启动该用户的登录过程。 这允许用户对系统进行身份验证并使用它。 默认情况下,大多数系统提供 6 个虚拟控制台,但您可以从inittab文件中看到,这是可配置的。

/etc/inittab还可以告诉 init 它应如何处理用户在控制台上按 Ctrl+Alt+Delete 键的情况。 由于系统应正确关闭并重启,而不是立即断电重启,因此会告知 init 在用户按下这些键时执行命令 /sbin/shutdown -t3 -r now,例如。 此外,/etc/inittab说明了如果您的系统连接了 UPS 设备,init 在发生电源故障时应执行的操作。

在大多数基于 RPM 的系统上,图形登录屏幕在运行级别 5 中启动,其中/etc/inittab运行一个名为/etc/X11/prefdm的脚本。prefdm脚本基于/etc/sysconfig/desktop目录的内容运行首选的 X 显示管理器。 如果您运行 GNOME,则通常是 gdm,如果您运行 KDE,则通常是 kdm,但它们可以混合使用,并且还有一个带有标准 X 安装的 xdm

但还有其他可能性。 例如,在 Debian 上,每个显示管理器都有一个 initscript,并且使用/etc/X11/default-display-manager的内容来确定要启动哪一个。 有关图形界面的更多信息,请参见 第 7.3 节。 最终,您的系统文档将解释有关 init 的更高级别方面的详细信息。

ls/etc/default和/或/etc/sysconfig目录包含一系列函数和服务的条目,所有这些都在启动时读取。 包含系统默认值的目录的位置可能会因您的 Linux 发行版而略有不同。

除了图形用户环境,许多其他的服务也可能会启动。但是如果一切顺利,启动过程完成后,你应该会看到登录提示符或登录界面。

Note其他程序
 

我们解释了基于 x86 的机器上 SysV init 的工作方式。在其他架构和发行版上,启动程序可能会有所不同。其他系统可能使用 BSD 风格的 init,其中启动文件没有分割成多个/etc/rc<LEVEL>.d目录。您的系统也可能使用/etc/rc.d/init.d而不是/etc/init.d.


4.2.5. Init 运行级别

在不同的运行级别运行不同服务的想法本质上围绕着这样一个事实:不同的系统可以以不同的方式使用。一些服务在系统处于特定状态或模式之前无法使用,例如准备好供多个用户使用或网络可用。

有时您可能希望以较低的模式运行系统。例如,在运行级别 1 中修复磁盘损坏问题,以便没有其他用户可能在系统上,或者将服务器留在运行级别 3 中,而不运行 X 会话。在这些情况下,运行依赖于更高系统模式才能运行的服务没有意义,因为它们无论如何都无法正常工作。通过将每个服务分配为在其达到特定运行级别时启动,您可以确保有序的启动过程,并且您可以快速更改机器的模式,而不必担心手动启动或停止哪些服务。

可用运行级别通常在/etc/inittab中描述,如下所示(部分显示)

#
# inittab   This file describes how the INIT process should set up
#           the system in a certain run-level.

# Default run level. The run levels are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS 
#	(The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
# 
id:5:initdefault:
<--cut-->

您可以随意配置未使用的运行级别(通常为运行级别 4)。许多用户以对他们最有意义的方式配置这些运行级别,同时保持标准运行级别默认不变。这允许他们快速进出他们的自定义配置,而不会干扰标准运行级别上的正常功能集。

如果您的机器由于错误的/etc/inittab而无法启动,或者由于您的/etc/passwd文件已损坏(或者您只是忘记了密码)而无法登录,请启动到单用户模式。

Tip没有图形界面?
 

当您在文本模式下工作时,因为您没有在机器的控制台上看到图形登录界面,通常您可以切换到控制台 7 或更高版本以获得图形登录。如果不是这种情况,请使用命令 who -r 检查当前运行级别。如果它被设置为与/etc/inittab中的原始默认值不同的值,则系统很可能不会默认以图形模式启动。在这种情况下,请联系您的系统管理员或阅读 man init。请注意,切换运行级别最好使用 telinit 命令;从文本控制台切换到图形控制台或反之亦然不涉及运行级别切换。

本指南中关于运行级别、脚本和配置的讨论力求尽可能通用。存在许多变体。例如,Gentoo Linux 将脚本存储在/etc/run levels中。其他系统可能会首先运行(一个或多个)较低的运行级别,并在到达最终运行级别并执行这些脚本之前执行其中的所有脚本。有关更多信息,请参阅您的系统文档。您还可以阅读/etc/inittab中引用的脚本,以更好地了解您的系统上发生了什么。


4.2.5.1. 工具

当系统上安装了 chkconfigupdate-rc.d 实用程序时,它们提供了一个简单的命令行工具来维护/etc/init.d目录层次结构。这使系统管理员不必直接操作目录下的无数符号链接/etc/rc[x].d.

此外,一些系统提供 ntsysv 工具,它提供了一个基于文本的界面;您可能会发现它比 chkconfig 的命令行界面更容易使用。在 SuSE Linux 上,您会找到 yastinsserv 工具。对于 Mandrake 的简单配置,您可能想尝试 DrakConf,它允许在运行级别 3 和 5 之间切换等功能。在 Mandriva 中,这变成了 Mandriva Linux Control Center

大多数发行版都提供用于配置进程的图形用户界面,请查看您的系统文档。

所有这些实用程序都必须以 root 身份运行。系统管理员也可以在每个运行级别目录中手动创建适当的链接,以便在特定运行级别中启动或停止服务。


4.2.6. 关机

UNIX 最初不是为了关机而设计的,但如果您确实必须关机,请使用 shutdown 命令。完成关机程序后,-h选项将停止系统,而-r将重新启动它。

如果系统处于运行级别 1-5,reboothalt 命令现在可以调用 shutdown,从而确保系统正确关机,但这养成一个坏习惯,因为并非所有 UNIX/Linux 版本都具有此功能。

如果您的计算机没有自行关机,则在看到指示系统已停止或完成关机的消息之前,请勿关闭计算机,以便使系统有时间卸载所有分区。不耐烦可能会导致数据丢失。


4.3. 进程管理

4.3.1. 系统管理员的工作

虽然管理系统资源(包括进程)是本地系统管理员的任务,但普通用户了解一些相关知识也无妨,特别是关于他或她自己的进程及其最佳执行方面。

我们将从理论层面解释一些关于系统性能的知识,但不会涉及硬件优化和其他高级程序。相反,我们将研究普通用户每天遇到的问题,以及此类用户可以采取的行动,以最佳方式利用可用资源。正如我们在下一节中了解到的,这主要是行动前思考的问题。

图 4-2。你不能更快吗?


4.3.2. 需要多长时间?

Bash 提供了一个内置的 time 命令,用于显示命令的执行时间。计时非常准确,可以用于任何命令。在下面的示例中,制作这本书大约需要一分半钟

tilly:~/xml/src> time make
Output written on abook.pdf (222 pages, 1619861 bytes).
Transcript written on abook.log.

real	1m41.056s
user	1m31.190s
sys	0m1.880s

GNU time 命令位于/usr/bin中(与 shell 内置版本相反),显示更多信息,可以以不同的方式格式化。它还显示命令的退出状态和总经过时间。使用独立的 time 命令执行与上述相同的命令会产生以下输出

tilly:~/xml/src> /usr/bin/time make
Output written on abook.pdf (222 pages, 1595027 bytes).
Transcript written on abook.log.

Command exited with non-zero status 2
88.87user 1.74system 1:36.21elapsed 94%CPU 
				(0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (2192major+30002minor)pagefaults 0swaps

再次参考 Info 页面获取所有信息。


4.3.3. 性能

对用户而言,性能意味着命令的快速执行。另一方面,对于系统管理员而言,这意味着更多:系统管理员必须优化整个系统的系统性能,包括用户、所有程序和守护程序。系统性能可能取决于数千个小事,这些小事无法通过 time 命令来衡量

  • 执行的程序编写不当或未使用计算机的适当资源

  • 访问磁盘、控制器、显示器、各种接口等

  • 远程系统的可达性(网络性能)

  • 系统上的用户数量,实际同时工作的用户数量

  • 一天中的时间

  • ...


4.3.4. 负载

简而言之:负载取决于您的系统的正常情况。我运行防火墙、SSH 服务器、文件服务器、路由守护程序、sendmail 服务器、代理服务器和其他一些服务的旧 P133 连接了 7 个用户时不会抱怨;平均负载仍然为 0。我见过一些(多 CPU)系统在负载为 67 时也很高兴。只有一种方法可以找出 - 如果你想知道什么是正常的,定期检查负载。如果您不这样做,您只能从命令行的响应时间来衡量系统负载,这是一个非常粗略的衡量标准,因为此速度受到其他数百个因素的影响。

请记住,不同的系统在相同的平均负载下表现会不同。例如,支持硬件加速的显卡系统在渲染 3D 图像时没有问题,而具有廉价 VGA 卡的相同系统在渲染时会大大减慢速度。当启动 X 服务器时,我的旧 P133 会变得非常不舒服,但在现代系统上,您几乎不会注意到系统负载的差异。


4.3.5. 作为用户我可以做些什么?

一个庞大的环境会降低你的速度。如果您设置了大量的环境变量(而不是 shell 变量)、未优化的长搜索路径(在设置路径环境变量时出错)以及更多通常"即时"进行的设置,系统将需要更多时间来搜索和读取数据。

在 X 中,窗口管理器和桌面环境可能真正消耗 CPU。一个非常精美的桌面是有代价的,即使您可以免费下载它,因为大多数桌面都无限期地提供附加组件。如果您不每年购买一台新计算机,适度是一种美德。


4.3.5.1. 优先级

作业的优先级或重要性由其nice值定义。一个具有高 nice 值的程序对其他程序、其他用户和系统是友好的;它不是一项重要的工作。nice 值越低,作业越重要,它将占用更多资源而不共享它们。

通过增加其 nice 值使作业更友好的方法仅对使用大量 CPU 时间的进程(编译器、数学应用程序等)有用。始终使用大量 I/O 时间的进程会自动获得系统的奖励,并获得更高的优先级(更低的 nice 值),例如键盘输入始终在系统上获得最高优先级。

程序的优先级由 nice 命令定义。

大多数系统还提供 BSD renice 命令,该命令允许您更改正在运行的命令的niceness。同样,请阅读手册页以获取特定于您系统的信息。

Caution交互式程序
 

对交互式程序或在前台运行的作业使用 nicerenice 不是一个好主意。

使用这些命令通常是系统管理员的任务。阅读手册页以获取有关系统管理员可用的额外功能的更多信息。


4.3.5.2. CPU 资源

在每个 Linux 系统上,许多程序都希望同时使用 CPU,即使您是系统上唯一的用户。每个程序都需要一定数量的 CPU 周期才能运行。有时可能没有足够的周期,因为 CPU 太忙了。uptime 命令非常不准确(它只显示平均值,你必须知道什么是正常的),但远非毫无用处。如果您认为您的 CPU 是系统无响应的原因,您可以采取一些措施

  • 在负载较低时运行繁重的程序。这可能是您的系统在夜间的情况。有关计划安排,请参阅下一节。

  • 防止系统执行不必要的工作:停止您不使用的守护程序和程序,使用 locate 而不是繁重的 find,...

  • 以低优先级运行大型作业

如果在您的特定情况下这些解决方案都不可行,您可能需要升级您的 CPU。在 UNIX 机器上,这是系统管理员的工作。


4.3.5.3. 内存资源

当当前运行的进程需要的内存超过系统实际可用的物理内存时,Linux系统不会崩溃;它会开始进行页面调度,或者称为交换,这意味着进程会使用磁盘或交换空间上的内存,将物理内存的内容(运行程序的一部分或整个程序,如果是交换)移动到磁盘,从而回收物理内存来处理更多进程。由于访问磁盘比访问内存慢得多,这会极大地降低系统速度。top 命令可用于显示内存和交换空间的使用情况。使用glibc的系统提供 memusagememusagestat 命令来可视化内存使用情况。

如果您发现使用了大量的内存和交换空间,您可以尝试

  • 终止、停止或降低那些使用大量内存的程序的优先级

  • 向系统添加更多内存(在某些情况下添加更多交换空间)。

  • 调整系统性能,这超出了本文档的范围。更多信息请参阅附录A中的阅读清单。


4.3.5.4. I/O 资源

虽然 I/O 限制是系统管理员压力的主要来源,但 Linux 系统提供的用于衡量 I/O 性能的实用工具相当匮乏。psvmstattop 工具可以指示有多少程序正在等待 I/O;netstat 显示网络接口统计信息,但几乎没有工具可以用来衡量 I/O 对系统负载的响应,而且 iostat 命令只提供了一般的 I/O 使用情况的简要概述。存在各种图形前端,可以将这些命令的输出以人类可理解的形式呈现出来。

每个设备都有自己的问题,但网络接口的可用带宽和磁盘的可用带宽是 I/O 性能瓶颈的两个主要原因。

网络 I/O 问题

  • 网络过载

    通过网络传输的数据量大于网络的容量,导致所有用户的所有网络相关任务执行缓慢。可以通过清理网络(主要包括禁用您不需要的协议和服务)或重新配置网络(例如,使用子网、用交换机替换集线器、升级接口和设备)来解决这些问题。

  • 网络完整性问题

    当数据传输不正确时发生。解决此类问题只能通过隔离故障元件并更换它来完成。

磁盘 I/O 问题

  • 单进程传输速率过低

    单个进程的读取或写入速度不足。

  • 总传输速率过低

    系统可以提供给所有运行程序的总最大带宽不足。

这类问题更难检测,通常需要额外的硬件才能将数据流重新分配到总线、控制器和磁盘上,如果硬件过载是问题的原因。解决此问题的一种方法是针对输入和输出操作优化的 RAID 阵列配置。这样,您就可以保留相同的硬件。升级到更快的总线、控制器和磁盘通常是另一种选择。

如果过载不是原因,那么可能是您的硬件逐渐出现故障,或者与系统的连接不好。首先检查触点、连接器和插头。


4.3.5.5. 用户

用户可以根据其资源使用行为分为几类

  • 运行大量小型作业的用户:例如,您,Linux 初学者。

  • 运行相对较少但大型作业的用户:运行模拟、计算、仿真器或其他占用大量内存的程序的用户,通常这些用户还有附带的大型数据文件。

  • 运行少量作业但使用大量 CPU 时间的用户(开发人员等)。

您可以看到,系统需求可能因每类用户而异,并且很难满足所有人。如果您在一个多用户系统上,了解其他用户和系统的习惯会很有用(也很有趣),以便最大限度地利用它来满足您的特定目的。


4.3.5.6. 图形工具

对于图形环境,有很多可用的监控工具。下面是 Gnome 系统监视器的屏幕截图,它具有显示和搜索进程信息以及监控系统资源的功能

图 4-3. Gnome 系统监视器

您还可以在任务栏中安装一些方便的图标,例如磁盘、内存和负载监视器。xload 是另一个用于监控系统负载的小型 X 应用程序。找到你最喜欢的!


4.3.5.7. 中断您的进程

作为非特权用户,您只能影响您自己的进程。我们已经了解了如何显示进程并过滤掉属于特定用户的进程,以及可能发生的限制。当您看到您的某个进程占用了系统过多的资源时,您可以做两件事

  1. 在不中断进程的情况下,使其使用更少的资源;

  2. 完全停止该进程。

如果您希望进程继续运行,但又希望让系统上的其他进程有机会运行,您可以 renice 该进程。除了使用 nicerenice 命令外,top 也是一种简单的方法,可以找出有问题的进程并降低优先级。

"NI" 列中识别该进程,它很可能具有负优先级。键入 r 并输入您要 renice 的进程的进程 ID。然后输入 nice 值,例如 "20"。这意味着从现在开始,该进程最多将占用 1/5 的 CPU 周期。

您想要保持运行的进程示例包括仿真器、虚拟机、编译器等等。

如果您想停止一个进程,因为它挂起或者在 I/O 消耗、文件创建或使用其他系统资源方面完全失控,请使用 kill 命令。如果可以,首先尝试轻轻地杀死该进程,向其发送 SIGTERM 信号。这是根据程序代码中描述的程序终止其正在执行的操作的指令

joe:~> ps -ef | grep mozilla
joe    25822	1  0 Mar11 ?	00:34:04 /usr/lib/mozilla-1.4.1/mozilla-

joe:~> kill -15 25822

在上面的示例中,用户 joe 停止了他的 Mozilla 浏览器,因为它挂起了。

有些进程有点难以摆脱。如果您有时间,您可能想向它们发送 SIGINT 信号来中断它们。如果这也不奏效,请使用最强的信号 SIGKILL。在下面的示例中,joe 停止了一个冻结的 Mozilla

joe:~> ps -ef | grep mozilla
joe    25915	1  0 Mar11 ?	00:15:06 /usr/lib/mozilla-1.4.1/mozilla-

joe:~> kill -9 25915

joe:~> ps -ef | grep 25915
joe	2634 32273 0 18:09 pts/4   00:00:00 grep 25915

在这种情况下,您可能想检查该进程是否真的已死,再次使用 grep 过滤器查找 PID。如果这只返回 grep 进程,您可以确定您已成功停止该进程。

难以杀死的进程之一是你的 shell。这是一件好事:如果它们很容易被杀死,那么每次您在命令行上意外键入 Ctrl-C 时,您都会丢失您的 shell,因为这相当于发送一个 SIGINT。

Note没有管道的 UNIX 几乎是不可想象的
 

在下一章第5章中,将解释使用管道 (|) 将一个命令的输出用作另一个命令的输入。

在图形环境中,xkill 程序非常易于使用。只需键入命令的名称,然后按 Enter 并选择要停止的应用程序的窗口。它相当危险,因为它默认发送 SIGKILL,所以只在应用程序挂起时使用它。


4.4. 调度进程

4.4.1. 利用空闲时间!

Linux 系统可能会遇到很多问题,但通常只在办公时间遇到问题。无论是在办公环境中、服务器机房还是在家里,大多数 Linux 系统在早上、晚上、夜晚和周末都只是闲置着。利用这些空闲时间可能比购买那些您绝对需要的机器便宜得多,如果你想同时完成所有事情。

有三种类型的延迟执行

  • 等待一段时间,然后使用 sleep 命令恢复作业执行。执行时间取决于提交时的系统时间。

  • 在指定时间运行命令,使用 at 命令。作业的执行取决于系统时间,而不是提交时间。

  • 使用 cron 工具,定期按月、周、日或小时运行命令。

以下各节讨论每种可能性。


4.4.2. sleep 命令

关于 sleep 的 Info 页面可能是最短的页面之一。sleep 所做的只是等待。默认情况下,等待时间以秒为单位表示。

那么它为什么存在? 一些实际例子

有人打电话给你,你说“半小时后我会和你联系”,但你现在被工作淹没了,肯定会忘记你的午餐

(sleep1800; echo"午餐时间..") &

当您因某种原因无法使用 at 命令时,现在是五点钟,你想回家,但还有工作要做,而且现在有人正在消耗系统资源

(sleep10000; myprogram) &

确保您的系统上有自动注销功能,并且在提交此类作业时注销或锁定您的桌面/办公室,或者在 screen 会话中运行它。

当你运行一系列大型文件的打印输出时,但你希望其他用户能够在两者之间进行打印

lplotoftext; sleep900; lphugefile; sleep900; lpanotherlargefile

第8章中讨论打印文件。

程序员经常使用 sleep 命令来暂停脚本或程序的执行一段时间。


4.4.3. at 命令

at 命令在给定的时间执行命令,使用您的默认 shell,除非您另行告知该命令(请参阅 man 页面)。

at 的选项非常用户友好,这在下面的示例中得到了证明

steven@home:~> at tomorrow + 2 days
warning: commands will be executed using (in order) a) $SHELL
        b) login shell c) /bin/sh
at>  cat reports | mail myboss@mycompany
at> <EOT>
job 1 at 2001-06-16 12:36

键入 Ctrl+D 退出 at 实用程序并生成 "EOT" 消息。

用户 steven 在这里做了一件奇怪的事情,组合了两个命令;我们将在 第5章重定向输入和输出中研究这种做法。

steven@home:~> at 0237
warning: commands will be executed using (in order) a) $SHELL
        b) login shell c) /bin/sh
at>  cd new-programs
at>  ./configure; make
at> <EOT>
job 2 at 2001-06-14 02:00

ls-m选项会在任务完成后向用户发送邮件,或者解释任务无法完成的原因。命令 atq 列出任务;在提交任务之前执行此命令,以防止它们与其他任务同时启动。如果改变主意,可以使用 atrm 命令删除已调度的任务。

选择奇怪的执行时间是个好主意,因为系统任务通常在“整点”运行,正如你在 第 4.4.4 节(下一节)中看到的那样。例如,任务通常在凌晨 1 点整运行(例如,系统索引以更新标准 locate 数据库),因此输入 0100 可能会轻易地减慢你的系统速度,而不是启动它。为了防止任务在同一时间全部运行,你也可以使用 batch 命令,该命令将进程排队,并将队列中的工作以均匀平衡的方式提供给系统,从而防止过度使用系统资源。有关更多信息,请参阅 Info 页面。


4.4.4. Cron 和 crontab

cron 系统由 cron 守护进程管理。它从系统和用户的 crontab 条目中获取有关哪些程序应该运行以及何时运行的信息。只有 root 用户可以访问系统 crontab,而每个用户只能访问自己的 crontab。在某些系统上,(某些)用户可能无法访问 cron 工具。

在系统启动时,cron 守护进程搜索/var/spool/cron/以查找以账号命名的 crontab 条目,这些账号在/etc/passwd中,它还搜索/etc/cron.d/并且它搜索/etc/crontab然后每分钟使用此信息来检查是否有任何事情要做。它以 crontab 文件所有者的身份执行命令,并将命令的任何输出以邮件形式发送给所有者。

在使用 Vixie cron 的系统上,每小时、每天、每周和每月发生的任务都保存在单独的目录中,位置是/etc以保持概览,这与标准的 UNIX cron 功能相反,后者将所有任务输入到一个大文件中。

一个 Vixie crontab 文件的示例

[root@blob /etc]# more crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
# commands to execute every hour
01 * * * * root run-parts /etc/cron.hourly
# commands to execute every day
02 4 * * * root run-parts /etc/cron.daily
# commands to execute every week
22 4 * * 0 root run-parts /etc/cron.weekly
commands to execute every month
42 4 1 * * root run-parts /etc/cron.monthly

Note替代方案
 

你也可以使用 crontab -l 命令来显示 crontab。

设置了一些变量,之后是实际的调度,每个任务一行,以 5 个时间和日期字段开头。第一个字段包含分钟(从 0 到 59),第二个字段定义执行的小时(0-23),第三个是月份中的日期(1-31),然后是月份的数字(1-12),最后一个是星期几(0-7,0 和 7 都是星期日)。这些字段中的星号代表该字段的全部可接受范围。允许使用列表;要从周一到周五执行任务,请在最后一个字段中输入 1-5,要在周一、周三和周五执行任务,请输入 1,3,5。

然后是应该运行最后一列中列出的进程的用户。上面的示例来自 Vixie cron 配置,其中 root 用户以固定的间隔运行程序 run-parts,并将适当的目录作为选项。在这些目录中,要在计划的时间执行的实际任务存储为 shell 脚本,就像这个每天运行以更新 locate 命令使用的数据库的小脚本一样

billy@ahost cron.daily]$ cat slocate.cron
#!/bin/sh
renice +19 -p $$ >/dev/null 2>&1
/usr/bin/updatedb -f "nfs,smbfs,ncpfs,proc,devpts" -e \
"/tmp,/var/tmp, /usr/tmp,/afs,/net"

用户应该使用 crontab -e 命令以安全的方式编辑他们的 crontab。这将防止用户意外打开其 crontab 文件的多个副本。默认编辑器是 vi(参见 第 6 章),但你可以使用任何文本编辑器,例如 gvimgedit,如果你对 GUI 编辑器感到更舒适的话。

退出时,系统会告诉你已安装新的 crontab。

此 crontab 条目提醒 billy 每周四晚上去他的体育俱乐部

billy:~> crontab -l
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.20264 installed on Sun Jul 20 22:35:14 2003)
# (Cron version -- $Id: chap4.xml,v 1.28 2007/09/19 12:22:26 tille Exp $)
38 16 * * 3 mail -s "sports evening" billy

添加新的计划任务后,系统会告诉你已安装新的 crontab。你无需重新启动 cron 守护进程即可使更改生效。在该示例中,billy 添加了一行指向备份脚本的新行

billy:~> crontab -e
45 15 * * 3 mail -s "sports evening" billy
4 4 * * 4,7 /home/billy/bin/backup.sh

<--write and quit-->

crontab: installing new crontab

billy:~>

lsbackup.sh该脚本在每周四和周日执行。有关 shell 脚本的介绍,请参阅 第 7.2.5 节。请记住,命令的输出(如果有)会以邮件形式发送给 crontab 文件的所有者。如果未配置邮件服务,你可能会在你的本地邮箱中找到命令的输出,/var/spool/mail/<你的用户名>,一个纯文本文件。

Note谁运行我的命令?
 

你不必指定应该运行命令的用户。默认情况下,它们以用户自己的权限执行。


4.5. 总结

Linux 是一个多用户、多任务操作系统,它具有类似 UNIX 的处理进程的方式。命令的执行速度可能取决于数千个微小的事情。除此之外,我们还学习了许多新命令来可视化和处理进程。这是一个列表

表 4-3. 第 4 章中的新命令:进程

命令含义
at将作业排队以供以后执行。
atq列出用户待处理的作业。
atrm删除作业,由它们的作业编号确定。
batch当系统负载水平允许时执行命令。
crontab维护单个用户的 crontab 文件。
halt停止系统。
init运行级别进程控制初始化。
jobs列出当前正在执行的作业。
kill终止进程。
mesg控制对你的终端的写入访问。
netstat显示网络连接、路由表、接口统计信息、伪装连接和多播成员资格。
nice以修改后的调度优先级运行程序。
pgrep显示进程。
ps报告进程状态。
pstree显示进程树。
reboot停止系统。
renice更改正在运行的进程的优先级。
shutdown关闭系统。
sleep延迟指定的时间。
time计时命令或报告资源使用情况。
top显示 CPU 占用率最高的进程。
uptime显示系统已运行多长时间。
vmstat报告虚拟内存统计信息。
w显示谁已登录以及他们在做什么。
wall向每个人的终端发送消息。
who显示谁已登录。
write向另一个用户发送消息。

4.6. 练习

这些练习将帮助你了解系统上运行的进程。


4.6.1. 一般

  • 在一个终端中运行 top,同时在另一个终端中进行练习。

  • 运行 ps 命令。

  • 阅读 man 页面以了解如何显示所有进程。

  • 运行命令 find /。它对系统负载有什么影响?停止此命令。

  • 在图形模式下,在前台启动 xclock 程序。然后让它在后台运行。使用 kill 命令停止该程序。

  • 直接在后台运行 xcalc,以便释放发出终端的提示符。

  • kill -9 -1 做什么?

  • 再次打开两个终端或终端窗口,并使用 write 将消息从一个终端发送到另一个终端。

  • 发出 dmesg 命令。它告诉你什么?

  • 在当前目录中执行 ls 需要多长时间?

  • 基于/proc中你 UID 拥有的进程条目,你将如何查找这些进程实际代表什么?

  • 你的系统已经运行多长时间了?

  • 你当前的 TTY 是什么?

  • 说出 3 个不可能以 init 作为初始父进程的进程。

  • 说出 3 个使用 SUID 模式的命令。解释为什么会这样。

  • 说出通常导致系统上最高负载的命令。


4.6.2. 启动、init 等

  • 你可以作为普通用户重新启动系统吗?为什么会这样?

  • 根据你当前的运行级别,说出在关机期间采取的步骤。

  • 你如何更改系统运行级别?从你的默认运行级别切换到运行级别 1,反之亦然。

  • 列出系统启动时启动的所有服务和守护进程。

  • 当前在启动时加载哪个内核?

  • 假设你必须在启动时启动一些奇特的服务器。到目前为止,你在启动系统后登录,并使用名为deliver_pizza的脚本在你的主目录中手动启动此服务器。你必须做什么才能使服务在运行级别 4 中自动启动,而你仅为此目的定义了运行级别 4?


4.6.3. 调度

  • 使用 sleep 创建一个提醒,提醒你十分钟后意大利面就做好了。

  • 创建一个 at 作业,将你的主目录中的所有文件复制到/var/tmp在半小时内。你可能想在/var/tmp.

  • 中创建一个子目录。创建一个 cronjob,在每周一至周五的午餐时间执行此任务。

  • 检查它是否有效。

  • 在 crontab 条目中犯一个错误,比如发出不存在的命令 coppy 而不是 cp。执行任务时会发生什么?


第 5 章. I/O 重定向

本章更详细地描述了重定向输入、输出和错误的强大 UNIX 机制。主题包括

  • 标准输入、输出和错误

  • 重定向运算符

  • 如何使用一个命令的输出作为另一个命令的输入

  • 如何将命令的输出放入文件中以供以后参考

  • 如何将多个命令的输出附加到文件中

  • 输入重定向

  • 处理标准错误消息

  • 组合输入、输出和错误流的重定向

  • 输出过滤器


5.1. 简单重定向

5.1.1. 什么是标准输入和标准输出?

大多数 Linux 命令读取输入,例如文件或命令的另一个属性,并写入输出。默认情况下,输入通过键盘给出,输出显示在屏幕上。你的键盘是你的标准输入 (stdin) 设备,屏幕或特定终端窗口是标准输出 (stdout) 设备。

但是,由于 Linux 是一个灵活的系统,因此不一定必须应用这些默认设置。例如,在大型环境中受到严格监控的服务器上的标准输出可能是打印机。


5.1.2. 重定向运算符

5.1.2.1. 使用 > 和 | 进行输出重定向

有时你希望将命令的输出放入文件中,或者你可能希望对一个命令的输出发出另一个命令。这称为重定向输出。重定向使用“>”(大于号)或使用“|”(管道)运算符来完成,该运算符将一个命令的标准输出发送到另一个命令作为标准输入。

正如我们之前看到的,cat 命令连接文件并将它们全部放在标准输出中。通过将此输出重定向到一个文件,将创建此文件名 - 如果它已经存在,则会被覆盖,因此请注意。

nancy:~> cat test1
some words

nancy:~> cat test2
some other words

nancy:~> cat test1 test2 > test3

nancy:~> cat test3
some words
some other words

Warning不要覆盖!
 

重定向输出时,请小心不要覆盖现有的(重要)文件。许多 shell,包括 Bash,都具有内置功能来保护你免受这种风险:noclobber。有关更多信息,请参阅 Info 页面。在 Bash 中,你可能希望将 set -o noclobber 命令添加到你的.bashrc配置文件中,以防止意外覆盖文件。

"nothing" 重定向到一个已存在的文件等同于清空该文件

nancy:~> ls -l list
-rw-rw-r--    1 nancy   nancy     117 Apr  2 18:09 list

nancy:~> > list

nancy:~> ls -l list
-rw-rw-r--    1 nancy   nancy       0 Apr  4 12:01 list

这个过程被称为截断

将相同的重定向到一个不存在的文件将会创建一个具有给定名称的新的空文件

nancy:~> ls -l newlist
ls: newlist: No such file or directory

nancy:~> > newlist

nancy:~> ls -l newlist
-rw-rw-r--  1 nancy   nancy	    0 Apr  4 12:05 newlist

第 7 章 给出了更多关于使用这种重定向的例子。

一些使用命令管道的例子

要在一些文本中查找一个单词,显示所有匹配 "pattern1" 的行,并排除同样匹配 "pattern2" 的行不被显示

greppattern1 file| grep-v pattern2

要一页一页地显示目录列表的输出

ls-la| less

要在目录中查找一个文件

ls-l| greppart_of_file_name


5.1.2.2. 输入重定向

在另一种情况下,您可能希望一个文件成为命令的输入,而该命令通常不接受文件作为选项。这种输入重定向使用 "<" (小于号) 操作符。

下面是一个使用输入重定向发送文件的例子。

andy:~> mail mike@somewhere.org < to_do

如果用户 *mike* 存在于系统上,您不需要键入完整的地址。 如果你想联系互联网上的某个人,请输入完整的地址作为 mail 的参数。

这看起来比初学者的 cat file | mail someone 更加复杂,但它当然是使用可用工具的一种更优雅的方式。


5.1.2.3. 组合重定向

以下示例组合了输入和输出重定向。 文件text.txt首先检查拼写错误,并将输出重定向到错误日志文件

spell <text.txt > error.log

以下命令列出了在使用 less 时可以用来检查另一个文件的所有命令

mike:~> less --help | grep -i examine
  :e [file]      Examine a new file.
  :n          *  Examine the (N-th) next file from the command line.
  :p          *  Examine the (N-th) previous file from the command line.
  :x          *  Examine the first (or N-th) file from the command line.

ls-ioption 用于不区分大小写的搜索 - 请记住,UNIX 系统对大小写非常敏感。

如果您想保存此命令的输出以供将来参考,请将输出重定向到一个文件

mike:~> less --help | grep -i examine > examine-files-in-less

mike:~> cat examine-files-in-less
  :e [file]      Examine a new file.
  :n          *  Examine the (N-th) next file from the command line.
  :p          *  Examine the (N-th) previous file from the command line.
  :x          *  Examine the first (or N-th) file from the command line.

一个命令的输出可以被管道传递到另一个命令,次数几乎不受限制,只要这些命令通常从标准输入读取输入,并将输出写入标准输出。 有时它们不这样做,但可能存在特殊的选项,指示这些命令按照标准定义来执行;因此,如果您遇到错误,请阅读您使用的命令的文档(man 和 Info 页面)。

再次,确保您不使用您仍然需要的现有文件的名称。 将输出重定向到现有文件将替换这些文件的内容。


5.1.2.4. >> 操作符

除了覆盖文件数据外,您还可以使用两个连续的大于号将文本附加到现有文件

例子

mike:~> cat wishlist
more money
less work

mike:~> date >> wishlist

mike:~> cat wishlist
more money
less work
Thu Feb 28 20:23:07 CET 2002

date 命令通常会将最后一行显示在屏幕上;现在它被附加到文件wishlist.


5.2. 高级重定向功能

5.2.1. 文件描述符的使用

有三种类型的 I/O,每种类型都有自己的标识符,称为文件描述符

  • 标准输入: 0

  • 标准输出: 1

  • 标准错误: 2

在以下描述中,如果省略了文件描述符编号,并且重定向操作符的第一个字符是 <,则重定向指的是标准输入(文件描述符 0)。 如果重定向操作符的第一个字符是 >,则重定向指的是标准输出(文件描述符 1)。

一些实际的例子会使这一点更清楚

ls >dirlist 2>&1

会将标准输出和标准错误都定向到文件dirlist, 而命令

ls 2>&1 >dirlist

只会将标准输出定向到dirlist。 这对于程序员来说可能是一个有用的选项。

这里的事情变得相当复杂,不要将此处 & 符号的使用与 第 4.1.2.1 节 中 & 符号的使用混淆,后者用于在后台运行进程。 在这里,它仅仅表明后面的数字不是文件名,而是数据流指向的位置。 另请注意,大于号不应与文件描述符的数字之间用空格分隔。 如果它被空格分隔,我们将再次将输出指向一个文件。 下面的例子演示了这一点

[nancy@asus /var/tmp]$ ls 2> tmp

[nancy@asus /var/tmp]$ ls -l tmp
-rw-rw-r--  1 nancy nancy 0 Sept  7 12:58 tmp

[nancy@asus /var/tmp]$ ls 2 > tmp
ls: 2: No such file or directory

*nancy* 执行的第一个命令是正确的(即使没有生成错误,因此标准错误被重定向到的文件是空的)。 第二个命令期望2是一个文件名,在这种情况下它不存在,因此会显示一个错误。

所有这些特性都在 Bash Info 页面中详细解释。


5.2.2. 例子

5.2.2.1. 分析错误

如果您的进程产生大量错误,这是一种彻底检查它们的方法

command 2>&1 | less

这通常在使用 make 命令创建新软件时使用,例如

andy:~/newsoft> make all 2>&1 | less
--output ommitted--

5.2.2.2. 将标准输出与标准错误分开

程序员经常使用这样的结构,以便输出显示在一个终端窗口中,而错误显示在另一个终端窗口中。 首先发出 tty 命令,找出您正在使用的伪终端

andy:~/newsoft> make all 2> /dev/pts/7

5.2.2.3. 同时写入输出和文件

您可以使用 tee 命令将输入复制到标准输出和一个或多个输出文件中。 使用 tee-aoption 会导致将输入附加到文件中。 如果您想同时查看和保存输出,此命令很有用。 >>> 操作符不允许同时执行这两个操作。

此工具通常通过管道 (|) 调用,如下例所示

mireille ~/test> date | tee file1 file2
Thu Jun 10 11:10:34 CEST 2004

mireille ~/test> cat file1
Thu Jun 10 11:10:34 CEST 2004

mireille ~/test> cat file2
Thu Jun 10 11:10:34 CEST 2004

mireille ~/test> uptime | tee -a file2
 11:10:51 up 21 days, 21:21, 57 users,  load average: 0.04, 0.16, 0.26

mireille ~/test> cat file2
Thu Jun 10 11:10:34 CEST 2004
 11:10:51 up 21 days, 21:21, 57 users,  load average: 0.04, 0.16, 0.26

5.3. 过滤器

当一个程序对输入执行操作并将结果写入标准输出时,它被称为过滤器。 过滤器最常见的用途之一是重构输出。 我们将在下面讨论几个最重要的过滤器。


5.3.1. 更多关于 grep

正如我们在 第 3.3.3.4 节 中看到的,grep 逐行扫描输出,搜索匹配的模式。 所有包含该模式的行都将被打印到标准输出。 这种行为可以使用-v选项来了解。

一些例子:假设我们想知道某个目录中的哪些文件在 2 月份被修改过

jenny:~> ls -la | grep Feb

与大多数命令一样,grep 命令区分大小写。 使用-ioption 使大小写之间没有区别。 还有很多 GNU 扩展可用,例如--colour,它有助于突出显示长行中的搜索词,以及--after-context,它打印最后匹配行之后的行数。 您可以使用-r选项发出递归 grep,搜索遇到的目录的所有子目录。 像往常一样,选项可以组合使用。

可以使用正则表达式来进一步详细说明您想要从所有输入行中选择的确切字符匹配项。 开始使用正则表达式的最佳方法确实是阅读 grep 文档。 grep Info 页面中包含一个很棒的章节。 由于讨论正则表达式的来龙去脉会让我们走得太远,因此如果您想了解更多关于它们的信息,强烈建议您从这里开始。

玩一玩 grep,花一些时间在这个最基本但非常强大的过滤命令上是值得的。 本章末尾的练习将帮助您入门,请参阅 第 5.5 节


5.3.2. 过滤输出

sort 命令默认按字母顺序排列行

thomas:~> cat people-I-like | sort
Auntie Emmy
Boyfriend
Dad
Grandma
Mum
My boss

sort 可以做更多的事情。 例如,查看文件大小。 使用此命令,目录内容按文件大小排序,最小的文件在前,最大的文件在后

ls-la| sort-nk 5

Note旧的排序语法
 

您可能会使用 ls -la | sort +4n 获得相同的结果,但这是一个不符合当前标准的旧形式。

sort 命令也与 uniq 程序(或 sort -u)结合使用,以对输出进行排序并过滤掉重复条目

thomas:~> cat itemlist
1
4
2
5
34
567
432
567
34
555

thomas:~> sort itemlist | uniq
1
2
34
4
432
5
555
567

5.4. 总结

在本章中,我们学习了如何将命令链接在一起,以及如何将一个命令的输入用作另一个命令的输出。

输入/输出重定向是 UNIX 和 Linux 机器上的常见任务。 这种强大的机制允许灵活使用组成 UNIX 的构建块。

最常用的重定向是 >|. 请参阅 附录 C,了解重定向命令和其他 shell 结构的概述。

表 5-1. 第 5 章中的新命令:I/O 重定向

命令含义
date显示时间和日期信息。
set配置 shell 选项。
sort对文本行进行排序。
uniq从排序后的文件中删除重复的行。

5.5. 练习

这些练习给出了更多关于如何组合命令的例子。 主要目标是尽量少地使用 Enter 键。

所有练习都是使用普通用户 ID 完成的,以便生成一些错误。 当你在这样做的时候,不要忘记阅读那些 man 页面!

  • 使用 cut 命令处理目录长列表输出,只显示文件权限。然后通过管道将输出传递给 sortuniq 来过滤掉任何重复的行。最后使用 wc 命令来统计该目录中不同权限类型的数量。

  • date 命令的输出写入一个文件。将 ls 命令的输出追加到该文件中。将此文件发送到您的本地邮箱(不要指定任何内容,只需用户名即可)。当使用 Bash 时,成功后您会看到一个新的邮件通知。

  • 列出/dev当前被您的 UID 使用的设备。通过管道传递给 less 以正确查看它们。

  • 以非特权用户身份执行以下命令。确定每个命令的标准输入、输出和错误。

    • catnonexistentfile(不存在的文件)

    • file/sbin/ifconfig

    • greproot /etc/passwd /etc/nofiles > grepresults

    • /etc/init.d/sshdstart > /var/tmp/output

    • /etc/init.d/crondstart > /var/tmp/output 2>&1

    • 现在再次执行这些命令来检查您的结果,这次将标准输出重定向到文件/var/tmp/output并将标准错误重定向到文件/var/tmp/error.

  • 您当前运行了多少个进程?

  • 您的主目录中有多少个隐藏文件?

  • 使用 locate 命令查找关于内核的文档。

  • 找出哪个文件包含以下条目

    root:x:0:0:root:/root:/bin/bash
    

    以及这个条目

    system:		root
    
  • 看看执行这个命令会发生什么

    > time; date >> time; cat < time

  • 您将使用什么命令来检查/etc/init.d中的哪个脚本启动了给定的进程?


第 6 章。文本编辑器

在本章中,我们将讨论掌握编辑器的重要性。我们将主要关注改进的 vi 编辑器。

完成本章后,您将能够

  • 在文本模式下打开和关闭文件

  • 编辑文件

  • 搜索文本

  • 撤消错误

  • 合并文件

  • 恢复丢失的文件

  • 寻找一个用于办公的程序或套件


6.1. 文本编辑器

6.1.1. 我为什么要使用编辑器?

能够使用至少一个文本模式编辑器非常重要。知道如何在您的系统上使用编辑器是独立的第一步。

我们将在下一章需要掌握一个编辑器,因为我们需要它来编辑影响我们环境的文件。作为高级用户,您可能想要开始编写脚本、书籍,开发网站或新程序。掌握一个编辑器将极大地提高您的生产力和能力。


6.1.2. 我应该使用哪个编辑器?

我们专注于文本编辑器,它也可以在没有图形环境的系统和终端窗口中使用。掌握文本编辑器的另一个优势是在远程机器上使用它。由于您不需要通过网络传输整个图形环境,因此使用文本编辑器可以极大地提高网络速度。

通常,有多种方法可以处理这个问题。让我们看看有哪些常用的编辑器


6.1.2.1. GNU Emacs

Emacs 是可扩展、可定制、自文档记录的实时显示编辑器,在许多 UNIX 和其他系统上都为人所知。正在编辑的文本在屏幕上可见,并随着您键入命令自动更新。它是一个实时编辑器,因为显示会非常频繁地更新,通常在您键入每个字符或一对字符后更新。这最大限度地减少了您在编辑时必须记在脑海中的信息量。Emacs 被称为高级编辑器,因为它提供了超出简单插入和删除的功能:控制子进程;程序的自动缩进;一次查看两个或多个文件;编辑格式化文本;以及处理字符、单词、行、句子、段落和页面,以及几种不同编程语言中的表达式和注释。

自文档记录意味着您可以在任何时候键入一个特殊字符,Ctrl+H,以查找您的选项。您也可以使用它来查找任何命令的功能,或查找与某个主题相关的所有命令。可定制意味着您可以稍微更改 Emacs 命令的定义。例如,如果您使用一种注释以 "<**" 开头并以 "**>" 结尾的编程语言,您可以告诉 Emacs 注释操作命令使用这些字符串。另一种定制是重新排列命令集。例如,如果您更喜欢键盘上菱形模式的四个基本光标移动命令(上、下、左和右),您可以以这种方式重新绑定这些键。

可扩展意味着您可以超越简单的定制,并编写全新的命令,即由 Emacs 自己的 Lisp 解释器运行的 Lisp 语言程序。Emacs 是一个在线可扩展系统,这意味着它被分成许多相互调用的函数,其中任何一个都可以在编辑会话的中间重新定义。Emacs 的几乎任何部分都可以被替换,而无需制作 Emacs 的单独副本。Emacs 的大多数编辑命令已经用 Lisp 编写;少数例外可以用 Lisp 编写,但为了效率而用 C 编写。虽然只有程序员才能编写扩展,但之后任何人都可以使用它。

当在 X Window System 下运行时(以 xemacs 启动),Emacs 提供自己的菜单以及与鼠标按钮的方便绑定。但 Emacs 可以在纯文本终端上提供窗口系统的许多优点。例如,您可以一次查看或编辑多个文件,在文件之间移动文本,以及在运行 shell 命令时编辑文件。


6.1.2.2. Vi(m)

Vim 代表 "Vi IMproved"(Vi 的改进版)。它过去是 "Vi IMitation"(Vi 的模仿版),但现在有太多的改进,因此名称更改是合适的。Vim 是一个文本编辑器,它几乎包含了 UNIX 程序 vi 的所有命令以及许多新命令。

vi 编辑器中的命令仅使用键盘输入,其优点是您可以将手指放在键盘上,并将眼睛放在屏幕上,而不是重复地将手臂移到鼠标上。对于那些需要的人,可以激活鼠标支持和带有滚动条和菜单的 GUI 版本。

在本书中,我们将始终使用 vivim 编辑文件,当然您可以自由选择您喜欢的编辑器。但是,我们建议您至少掌握 vi 的基础知识,因为它几乎是所有 UNIX 系统上的标准文本编辑器,而 emacs 可以是一个可选软件包。不同的计算机和终端之间可能存在细微差异,但最重要的是,如果您可以使用 vi,那么您可以在任何 UNIX 系统上生存。

除了 vim 命令外,VIm 软件包可能还提供 gvim,它是 vimGnome 版本。初学者可能会发现这更容易使用,因为当您忘记或不知道如何使用标准 vim 命令执行特定编辑任务时,菜单会提供帮助。


6.2. 使用 Vim 编辑器

6.2.1. 两种模式

vi 编辑器是一个非常强大的工具,并且具有非常广泛的内置手册,您可以在程序启动时使用 :help 命令激活它(而不是使用 maninfo,它们包含的信息少得多)。我们将在这里只讨论一些最基本的内容,以便您入门。

使 vi 令初学者感到困惑的是,它可以以两种模式运行:命令模式和插入模式。编辑器始终以命令模式启动。命令移动您浏览文本、搜索、替换、标记块并执行其他编辑任务,其中一些命令会将编辑器切换到插入模式。

这意味着每个键不是只有一个,而是可能有两个含义:它可以在命令模式下表示编辑器的命令,也可以表示您想要在文本中的字符。

Note发音
 

它的发音是 "vee-eye"(/ˈviː.aɪ/)。


6.2.2. 基本命令

6.2.2.1. 浏览文本

通常可以使用箭头键浏览文本。如果不行,请尝试

  • h 将光标向左移动

  • l 将光标向右移动

  • k 向上移动

  • j 向下移动

SHIFT-G 将把提示符放在文档的末尾。


6.2.2.2. 基本操作

以下是一些常用的 vi 命令

  • n dd 将从当前光标位置开始删除 n 行。

  • n dw 将删除光标右侧的 n 个单词。

  • x 将删除光标所在位置的字符

  • :n 移动到文件的第 n 行。

  • :w 将保存(写入)文件

  • :q 将退出编辑器。

  • :q! 强制退出,当您要退出包含未保存更改的文件时。

  • :wq 将保存并退出

  • :w newfile 将文本保存到newfile.

  • :wq! 覆盖只读权限(如果您有权限覆盖权限,例如当您使用 root 帐户时)。

  • /astring 将在文件中搜索该字符串并将光标定位在其位置下方的第一个匹配项上。

  • / 将再次执行相同的搜索,将光标移动到下一个匹配项。

  • :1, $s/word/anotherword/g 将替换word(单词)anotherword(另一个单词)在整个文件中。

  • yy 将复制一个文本块。

  • n p 将粘贴它 n 次。

  • :recover 将在意外中断后恢复文件。


6.2.2.3. 将编辑器切换到插入模式的命令

  • a 将追加:它在切换到插入模式之前将光标向右移动一个位置

  • i 将插入

  • o 将在当前光标位置下插入一个空行并将光标移动到该行。

Esc 键切换回命令模式。如果您不确定自己处于哪种模式,因为您使用的是一个非常旧版本的 vi,它不显示 "INSERT" 消息,请键入 Esc,您就可以确保返回到命令模式。当您已经处于命令模式时点击 Esc 时,系统可能会发出小提示音,或者发出视觉提示(屏幕上的闪光)。这是正常的行为。


6.2.3. 简单的方法

与其阅读那些枯燥的文字,不如使用 vimtutor 来学习你的第一个 Vim 命令。这是一个 30 分钟的教程,通过八个简单的练习来教授最基本的 Vim 功能。虽然你不可能在短短半小时内学到关于 vim 的所有知识,但该教程旨在讲解足够多的命令,让你能够轻松地使用 Vim 作为通用的编辑器。

在 UNIX 和 MS Windows 中,如果 Vim 已正确安装,你可以从 shell 或命令行启动此程序,输入 vimtutor 命令。 这将创建 tutor 文件的副本,以便你可以编辑它而不会有损坏原始文件的风险。 有一些 tutor 的翻译版本。 要了解你的语言版本是否可用,请使用两位数的语言代码。 例如,法语是 vimtutor fr(如果已安装在系统上)。


6.3. 办公室中的 Linux

6.3.1. 历史

在过去的十年里,办公领域通常被 MS Office 所占据,而且,让我们面对现实:Microsoft 的 WordExcelPowerPoint 格式是行业标准,你迟早要处理它们。

Microsoft 的这种垄断局面对于吸引新用户使用 Linux 来说是一个很大的不利因素,因此一群德国开发者开始了 StarOffice 项目,该项目旨在制作 MS Office 的克隆版本,现在仍然如此。 他们的公司 StarDivision 在 20 世纪 90 年代末,即 5.2 版本发布前,被 Sun Microsystems 收购。 Sun 继续开发,但限制了对源代码的访问。 尽管如此,原始源代码集的开发仍在开源社区中继续,他们不得不将该项目重命名为 OpenOfficeOpenOffice 现在可用于各种平台,包括 MS Windows、Linux、MacOS 和 Solaris。 第 1.3.2 节中有一个屏幕截图。

几乎与此同时,另外几个相当著名的项目也启动了。 另一种常见的 MS Office 替代方案是 KOffice,这套办公软件曾经在 SuSE 用户中很受欢迎。 与原始版本一样,这个克隆版本包含一个 MS WordExcel 兼容的程序,以及更多功能。

较小的项目处理 MS 示例套件中的特定程序,例如 Abiword 和 MS Wordview,用于与 MS Word 文档兼容,以及 Gnumeric,用于查看和创建 Excel 兼容的电子表格。


6.3.2. 套件和程序

当前的发行版通常带有所有必要的工具。由于这些工具在 帮助 菜单中提供了出色的指南和可搜索的索引,因此我们不会详细讨论它们。 有关参考,请参阅你的系统文档或项目的网站,例如


6.3.3. 备注

6.3.3.1. 办公文档的常规使用

尽量将办公文档的使用限制在它们的目的:办公室。

一个例子:如果你发送一封邮件,正文内容类似:"你好,我想告诉你一些事情,请看附件",然后附件被证明是一个 MS Word 兼容的文档,例如:"你好我的朋友,你新工作怎么样,你明天有时间和我一起吃午饭吗?",这会让大多数 Linux 用户感到疯狂。在这样的文件中附加你的签名也是一个坏主意。 如果你想签署消息或文件,请使用 GPG,即 PGP 兼容的 GNU Privacy Guard 或 SSL(安全套接字层)证书。

这些用户感到恼火不是因为他们无法读取这些文档,或者因为他们担心这些格式通常会生成更大的文件,而是因为这意味着他们正在使用 MS Windows,并且可能因为启动一些额外程序而增加工作量。


6.3.3.2. 系统和用户配置文件

在下一章中,我们将开始配置我们的环境,这可能包括编辑各种确定程序行为的文件。

不要使用任何办公组件编辑这些文件!

默认文件格式规范会使程序添加多行代码,定义文件的格式和使用的字体。 这些行不会被依赖它们的程序以正确的方式解释,从而导致错误或读取该文件的程序崩溃。 在某些情况下,你可以将文件另存为纯文本,但如果你养成这种习惯,你将会遇到麻烦。


6.3.3.3. 但我想要一个图形文本编辑器!

如果你真的坚持,请尝试 geditkeditkwritexedit;这些程序只处理文本文件,这正是我们所需要的。 但是,如果你打算做任何严肃的事情,请坚持使用真正的文本模式编辑器,例如 vimemacs

一个可以接受的替代方案是 gvim,即 vimGnome 版本。 你仍然需要使用 vi 命令,但如果你遇到困难,你可以在菜单中查找它们。


6.4. 总结

在本章中,我们学习了如何使用编辑器。 虽然使用哪个编辑器取决于你自己的个人偏好,但至少知道如何使用一个编辑器是必要的。

The vi 编辑器在每个 UNIX 系统上都可用。

大多数 Linux 发行版都包含一个办公软件套件和一个图形文本编辑器。


6.5. 练习

本章只有一个练习:在终端会话中输入 vimtutor 来启动 Vim tutor,然后开始。

或者,你可以启动 emacs 并键入 Ctrl+H,然后键入 T 来调用自定进度的 Emacs 教程。

实践是唯一的途径!


第 7 章。甜蜜的家 /home

本章是关于配置你的环境。 既然我们知道如何使用编辑器,我们就可以更改各种文件,使自己感觉更好。 完成本章后,你将了解更多关于

  • 组织你的环境

  • 常见的 shell 设置文件

  • Shell 配置

  • 配置提示符

  • 配置图形环境

  • 声音和视频应用

  • 显示和窗口管理器

  • X 客户端 - 服务器系统如何工作

  • 语言和字体设置

  • 安装新软件

  • 更新现有软件包


7.1. 常规的良好内务处理

7.1.1. 介绍

正如我们之前提到的,很容易把系统搞乱。 我们再怎么强调保持整洁的重要性也不为过。 当你从一开始就学会这一点时,它将成为一个好习惯,在你使用 Linux 或 UNIX 系统进行编程或面对系统管理任务时,这将节省你的时间。 以下是一些让生活更轻松的方法

  • 创建一个bin目录用于你的程序文件和脚本。

  • 在适当的目录中组织非可执行文件,并根据需要创建任意数量的目录。 示例包括用于图像,文档,项目,下载文件,电子表格,个人文件等的单独目录。

  • 使用 chmod 700 dirname 命令使目录私有。

  • 为你的文件提供有意义的名称,例如给总理的投诉 050302而不是letter1.


7.1.2. 腾出空间

在某些系统上,quota 系统可能会迫使你不时进行清理,或者硬盘的物理限制可能会迫使你在不运行任何监视程序的情况下腾出更多空间。 本节讨论除使用 rm 命令之外的多种回收磁盘空间的方法。

运行 quota -v 命令以查看剩余多少空间。


7.1.2.1. 清空文件

有时你对文件的内容不感兴趣,但你需要文件名作为标记(例如,你只需要文件的时间戳,提醒文件存在或应该在未来的某个时间存在)。 重定向 null 命令的输出是 BourneBash shell 中执行此操作的方式

andy:~> cat wishlist > placeholder

andy:~> ls -la placeholder
-rw-rw-r--    1 andy   andy       200 Jun 12 13:34 placeholder

andy:~>  > placeholder

andy:~> ls -la placeholder

-rw-rw-r--    1 andy   andy         0 Jun 12 13:35 placeholder

将现有文件缩小为具有相同名称且大小为 0 字节的文件称为截断

对于创建新的空文件,使用 touch 命令可以获得相同的效果。 在现有文件上,touch 仅会更新时间戳。 有关更多详细信息,请参阅 touch 上的 Info 页面。

“几乎”清空文件,请使用 tail 命令。 假设用户 andy 的愿望清单变得很长,因为他总是添加内容在末尾,但从不删除他实际得到的东西。 现在他只想保留最后五个项目

andy:~> tail -5 wishlist > newlist

andy:~> cat newlist > wishlist

andy:~> rm newlist

7.1.2.2. 更多关于日志文件

某些 Linux 程序坚持将各种输出写入日志文件。 通常,有一些选项可以仅记录错误,或记录最少的信息,例如设置程序的调试级别。 但是即使那样,你可能也不关心日志文件。 以下是一些摆脱它们的方法,或者至少对它们的大小设置一些限制

  • 如果你确定你不会再需要它,请尝试在程序未运行时删除日志文件。 某些程序甚至可能会在重新启动时发现没有日志文件,因此不会记录。

  • 如果你删除日志文件并且程序重新创建它,请阅读此特定程序的文档,以查找避免创建日志文件的命令选项。

  • 尝试通过仅记录与你相关的信息,或仅记录重要信息来创建较小的日志文件。

  • 尝试将日志文件替换为指向的符号链接/dev/null;如果幸运的话,程序不会报错。 不要对系统启动时运行的程序或从 cron 运行的程序的日志文件执行此操作(参见第 4 章)。 这些程序可能会将符号链接替换为一个再次开始增长的小文件。


7.1.2.3. 邮件

定期清理您的邮箱,使用 procmail(参见 Info 页面)或您喜欢的邮件阅读应用程序的过滤器创建子文件夹和自动重定向。 如果您有垃圾箱文件夹,请定期清理它。

要重定向邮件,请使用.forward您主目录中的文件。 Linux 邮件服务会在需要传递本地邮件时查找此文件。 该文件的内容定义了邮件系统应该如何处理您的邮件。 它可以包含一行,其中包含一个完全限定的电子邮件地址。 在这种情况下,系统会将您的所有邮件发送到此地址。 例如,当为网站租用空间时,您可能希望将发往网站管理员的邮件转发到您自己的帐户,以避免浪费磁盘空间。 网站管理员的.forward可能看起来像这样

webmaster@www ~/> cat .forward
mike@pandora.be

使用邮件转发也有助于避免您不得不检查多个不同的邮箱。 您可以使每个地址都指向一个集中的且易于访问的帐户。

您可以要求您的系统管理员在本地邮件别名文件中为您定义一个转发,例如当一个帐户被关闭但电子邮件仍然活跃一段时间时。


7.1.2.4. 使用链接节省空间

当多个用户需要访问相同的文件或程序时,当原始文件名太长或太难记住时,使用符号链接而不是为每个用户或目的创建一个单独的副本。

多个符号链接可能具有不同的名称,例如,一个链接可能被称为monfichier在一个用户的目录中,以及mylink在另一个用户的目录中。 相同目录中也可能出现指向相同文件的多个链接(不同的名称)。 这通常在/lib目录中完成:当发出命令

ls-l /lib

时,您会看到该目录包含大量指向相同文件的链接。 创建这些链接是为了防止搜索某个名称的程序卡住,因此它们指向它们需要的库的正确/当前名称。


7.1.2.5. 限制文件大小

shell 包含一个用于限制文件大小的内置命令 ulimit,该命令也可用于显示系统资源的限制

cindy:~> ulimit -a
core file size (blocks)     0
data seg size (kbytes)      unlimited
file size (blocks)          unlimited
max locked memory (kbytes)  unlimited
max memory size (kbytes)    unlimited
open files                  1024
pipe size (512 bytes)       8
stack size (kbytes)         8192
cpu time (seconds)          unlimited
max user processes          512
virtual memory (kbytes)     unlimited

Cindy 不是开发人员,她不在乎核心转储,核心转储包含程序的调试信息。 如果您确实想要核心转储,可以使用 ulimit 命令设置它们的大小。 阅读 bash 上的 Info 页面以获取详细说明。

Note核心文件?
 

当程序在执行过程中出现问题时,有时会生成核心文件或*核心转储*。 核心文件包含系统内存的副本,即在发生错误时系统内存的状态。


7.1.2.6. 压缩文件

压缩文件很有用,因为它们占用硬盘上的空间较少。 另一个优点是,通过网络发送压缩文件所占用的带宽更少。 许多文件(例如 man 页面)以压缩格式存储在您的系统上。 然而,解压缩这些文件以获取少量信息,然后再将它们压缩,这非常耗时。 您不想解压缩一个 man 页面,例如,阅读有关命令选项的信息,然后再次压缩该 man 页面。 大多数人可能会忘记在找到他们需要的信息后进行清理。

因此,我们有可以处理压缩文件的工具,这些工具仅在内存中解压缩它们。 实际的压缩文件仍然按原样保存在您的磁盘上。 大多数系统都支持 zgrepzcatbzless 和 z 系列的其他成员,以防止不必要的解压缩/压缩操作。 请参阅您系统的二进制目录和 Info 页面。

有关实际压缩文件和创建存档的示例的更多信息,请参见第 9 章


7.2. 您的文本环境

7.2.1. 环境变量

7.2.1.1. 常规

我们已经提到了一些环境变量,例如PATHHOME。 到目前为止,我们只看到了它们为 shell 提供某种用途的示例。 但是,还有许多其他 Linux 实用程序需要有关您的信息才能做好工作。

除了路径和主目录之外,程序还需要哪些其他信息?

许多程序想知道您正在使用的终端类型; 此信息存储在TERM变量中。 在文本模式下,这将是 *linux* 终端仿真,在图形模式下,您可能会使用 *xterm*。 许多程序想知道您最喜欢的编辑器是什么,以防它们必须在子进程中启动编辑器。 您正在使用的 shell 存储在SHELL变量中,操作系统类型存储在OS等等。 可以通过输入 printenv 命令来查看当前为您的会话定义的所有变量的列表。

环境变量由 shell 管理。 与常规 shell 变量不同,环境变量由您启动的任何程序(包括另一个 shell)继承。 新进程被分配这些变量的副本,它们可以读取、修改这些变量,并依次将它们传递给它们自己的子进程。

变量名称没有什么特别之处,只是按照惯例,常见的变量名称使用大写字符。 您可以随意命名,尽管有一些标准变量非常重要,以至于在每个 Linux 系统上都相同,例如PATHHOME.


7.2.1.2. 导出变量

单个变量的内容通常使用 echo 命令显示,如以下示例所示

debby:~> echo $PATH
/usr/bin:/usr/sbin:/bin:/sbin:/usr/X11R6/bin:/usr/local/bin

debby:~> echo $MANPATH
/usr/man:/usr/share/man/:/usr/local/man:/usr/X11R6/man

如果您想以对其他程序有用的方式更改变量的内容,则必须将新值从您的环境导出到运行这些程序的环境中。 一个常见的例子是导出PATH变量。 您可以按如下方式声明它,以便可以使用位于/opt/FlightGear/bin:

debby:~> PATH=$PATH:/opt/FlightGear/bin

中的飞行模拟器软件。这指示 shell 不仅在当前路径$PATH/opt/FlightGear/bin.

中搜索程序,而且还在附加目录PATH中搜索。 但是,只要环境不知道

debby:~> runfgfs
bash: runfgfs: command not found

变量的新值,事情仍然无法正常工作

debby:~> export PATH

debby:~> runfgfs
--flight simulator starts--

导出变量是使用 shell 内置命令 export 完成的

exportVARIABLE=Bash 中,我们通常在一个优雅的步骤中完成此操作

MANPATH该技术也用于MANPATH变量的配置

debby:~> export MANPATH=$MANPATH:/opt/FlightGear/man

debby:~> echo $MANPATH
/usr/man:/usr/share/man:/usr/local/man:/usr/X11R6/man:/opt/FlightGear/man

变量,该变量告诉 man 命令在哪里查找压缩的 man 页面。 如果将新软件添加到系统中的新目录或不常见目录中,则其文档也可能位于不常见的目录中。 如果您想阅读新软件的 man 页面,请扩展


您可以通过将其添加到您的 shell 设置文件中来避免在您打开的每个窗口中重新输入此命令,请参见第 7.2.2 节

7.2.1.3. 保留变量

下表概述了最常见的预定义变量

表 7-1. 常见的环境变量变量名
存储的信息DISPLAY
由 X Window 系统用于标识显示服务器DOMAIN
域名EDITOR
存储您喜欢的行编辑器HISTSIZE
HOMEshell 历史记录文件的大小(以行数计)
到您主目录的路径HOSTNAME
本地主机名INPUTRC
输入设备(如键盘)的定义文件的位置LANG
首选语言LD_LIBRARY_PATH
搜索库的路径LOGNAME
登录名MAIL
MANPATH您的收件箱文件夹的位置
OS搜索 man 页面的路径
描述操作系统的字符串OSTYPE
有关版本等的更多信息PAGER
PATHman 等程序使用,这些程序需要知道如果输出超过一个终端窗口该怎么做。
命令的搜索路径PS1
主提示符PS2
辅助提示符PWD
SHELL当前工作目录
TERM当前 shell
终端类型UID
用户 IDUSER(NAME)
用户名VISUAL
您喜欢的全屏编辑器XENVIRONMENT
您的 X 行为的个人设置的位置XFILESEARCHPATH

搜索图形库的路径


许多变量不仅是预定义的,而且还使用配置文件进行预设。 我们将在下一节中讨论这些内容。

7.2.2. Shell 设置文件.bashrc当输入 ls -al 命令以获取所有文件的长列表(包括以点开头的文件)时,您将在您的主目录中看到一个或多个以 . 开头并以*rc* 结尾的文件。 对于 bash 的情况,这是/etc/bashrc.

。 这是系统范围的配置文件profile的对应文件。 当登录到交互式登录 shell 时,login 将执行身份验证,设置环境并启动您的 shell。 对于 bash 的情况,下一步是从/etc如果该文件存在,则读取常规。 然后 bash 查找, ~/.bash_profile~/.bash_login~/.profile/etc/bashrc,按该顺序,并从存在的第一个可读文件中读取和执行命令。 如果都不存在,则应用

。 当登录 shell 退出时,如果存在,bash 将从文件~/.bash_logout中读取和执行命令。

此过程在 loginbash 的 man 页面中进行了详细说明。


7.2.3. 一组典型的设置文件

7.2.3.1. /etc/profile 示例

让我们看一下其中的一些配置文件。 首先读取/etc/profile,其中设置了重要的变量,例如PATH, USER到您主目录的路径

debby:~> cat /etc/profile
# /etc/profile

# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc


# Path manipulation
if [ `id -u` = 0 ] && ! echo $PATH | /bin/grep -q "/sbin" ; then
    PATH=/sbin:$PATH
fi

if [ `id -u` = 0 ] && ! echo $PATH | /bin/grep -q "/usr/sbin" ; then
    PATH=/usr/sbin:$PATH
fi

if [ `id -u` = 0 ] && ! echo $PATH | /bin/grep -q "/usr/local/sbin"
    then
    PATH=/usr/local/sbin:$PATH
fi

if ! echo $PATH | /bin/grep -q "/usr/X11R6/bin" ; then
    PATH="$PATH:/usr/X11R6/bin"
fi

这些行检查设置的路径:如果root打开一个shell(用户ID为0),则会检查/sbin, /usr/sbin/usr/local/sbin是否在路径中。如果不在,则会添加它们。 对所有人都会检查/usr/X11R6/bin是否在路径中。

# No core files by default
ulimit -S -c 0 > /dev/null 2>&1

所有垃圾都放到/dev/null,如果用户不更改此设置。

USER=`id -un`
LOGNAME=$USER
MAIL="/var/spool/mail/$USER"

HOSTNAME=`/bin/hostname`
HISTSIZE=1000

这里,常规变量被赋予它们正确的值。

if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then
    INPUTRC=/etc/inputrc
fi

如果变量本地主机名未设置,并且没有.inputrc在用户的主目录中,则加载默认的输入控制文件。

export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC

所有变量都被导出,以便它们可用于请求有关您的环境信息的其他程序。


7.2.3.2. profile.d 目录

for i in /etc/profile.d/*.sh ; do
    if [ -r $i ]; then
    	. $i
    fi
done
unset i

来自/etc/profile.d目录中的所有可读 shell 脚本都会被读取和执行。这些脚本会执行诸如启用 color-ls、将 vi 别名为 vim、设置区域设置等操作。临时变量i被取消设置,以防止它干扰以后的 shell 行为。


7.2.3.3. .bash_profile 示例

然后 bash 会查找.bash_profile在用户的主目录中

debby:~> cat .bash_profile 
#################################################################
#                                                               #
#   .bash_profile file                                          #
#                                                               #
#   Executed from the bash shell when you log in.               #
#                                                               #
#################################################################

source ~/.bashrc
source ~/.bash_login

这个非常简单的文件指示您的 shell 首先读取~/.bashrc,然后读取~/.bash_profile。 在 shell 环境中工作时,您会经常遇到 source 内置 shell 命令:它用于将配置更改应用到当前环境。


7.2.3.4. .bash_login 示例

ls~/.bash_profile文件通过设置 umask 值来定义默认文件保护,请参阅 第3.4.2.2节。 该~/.bashrc文件用于定义一堆用户特定的别名和函数以及个人环境变量。 它首先读取/etc/bashrc,它描述了默认提示符 (命令的搜索路径)和默认的 umask 值。 之后,您可以添加自己的设置。 如果没有~/.bashrc存在,则默认读取/etc/bashrc


7.2.3.5. /etc/bashrc 示例

你的/etc/bashrc文件可能如下所示

debby:~> cat /etc/bashrc
# /etc/bashrc

# System wide functions and aliases
# Environment stuff goes in /etc/profile

# by default, we want this to get set.
# Even for non-interactive, non-login shells.
if [ `id -gn` = `id -un` -a `id -u` -gt 99 ]; then
	umask 002
else
	umask 022
fi

这些行设置 umask 值。 然后,根据 shell 的类型,设置提示符

# are we an interactive shell?
if [ "$PS1" ]; then
  if [ -x /usr/bin/tput ]; then
    if [ "x`tput kbs`" != "x" ]; then 
# We can't do this with "dumb" terminal
      stty erase `tput kbs`
    elif [ -x /usr/bin/wc ]; then
      if [ "`tput kbs|wc -c `" -gt 0 ]; then 
# We can't do this with "dumb" terminal
        stty erase `tput kbs`
      fi
    fi
  fi
  case $TERM in
	xterm*)
	if [ -e /etc/sysconfig/bash-prompt-xterm ]; then
		PROMPT_COMMAND=/etc/sysconfig/bash-prompt-xterm
	else
   PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:\
${PWD/$HOME/~}\007"'
	fi
    ;;
	*)
   [ -e /etc/sysconfig/bash-prompt-default ] && PROMPT_COMMAND=\
/etc/sysconfig/bash-prompt-default
	    ;;
    esac
    [ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@\h \W]\\$ "
    
    if [ "x$SHLVL" != "x1" ]; then # We're not a login shell
        for i in /etc/profile.d/*.sh; do
	    if [ -x $i ]; then
	        . $i
	    fi
	done
    fi
fi

7.2.3.6. .bash_logout 示例

注销时,会执行~/.bash_logout中的命令,例如可以清除终端,以便在注销远程会话或离开系统控制台时获得一个干净的窗口

debby:~> cat .bash_logout
# ~/.bash_logout

clear

让我们在下一节中仔细看看这些脚本是如何工作的。 请随身携带 info bash


7.2.4. Bash 提示符

7.2.4.1. 介绍

Bash 提示符可以做的不仅仅是显示诸如您的用户名、机器名称和一些关于当前工作目录的指示等简单信息。 我们可以添加其他信息,例如当前日期和时间、连接的用户数等。

但在我们开始之前,我们将把当前的提示符保存在另一个环境变量中

[jerry@nowhere jerry]$ MYPROMPT=$PS1

[jerry@nowhere jerry]$ echo $MYPROMPT
[\u@\h \W]\$

[jerry@nowhere jerry]$

现在当我们更改提示符时,例如通过发出命令 PS1="->",我们始终可以使用命令 PS1=$MYPROMPT 恢复原始提示符。 当然,只要您在命令行上摆弄提示符并避免将其放入 shell 配置文件中,重新连接时也会恢复原始提示符。


7.2.4.2. 一些例子

为了理解这些提示符和使用的转义序列,我们参考 Bash Info 或手册页。

  • export命令的搜索路径="[\t \j] "

    显示一天中的时间和正在运行的作业数量

  • export命令的搜索路径="[\d][\u@\h \w] : "

    显示日期、用户名、主机名和当前工作目录。 请注意,\W 仅显示当前工作目录的基本名称。

  • export命令的搜索路径="{\!} "

    显示每个命令的历史记录编号。

  • export命令的搜索路径="\[\033[1;35m\]\u@\h\[\033[0m\] "

    以粉红色显示 user@host。

  • export命令的搜索路径="\[\033[1;35m\]\u\[\033[0m\] \[\033[1;34m\]\w\[\033[0m\] "

    以粉红色设置用户名,以蓝色设置当前工作目录。

  • export命令的搜索路径="\[\033[1;44m\]$USER is in \w\[\033[0m\] "

    提示那些难以区分提示符和他们输入内容的人。

  • export命令的搜索路径="\[\033[4;34m\]\u@\h \w \[\033[0m\]"

    带下划线的提示符。

  • export命令的搜索路径="\[\033[7;34m\]\u@\h \w \[\033[0m\] "

    蓝色背景上的白色字符。

  • export命令的搜索路径="\[\033[3;35m\]\u@\h \w \[\033[0m\]\a"

    浅色字体的粉色提示符,在您的命令完成时会提醒您。

  • export命令的搜索路径=...

变量被导出,以便随后执行的命令也了解环境。 您想要的提示符配置行最好放在您的 shell 配置文件中,~/.bashrc.

如果您愿意,提示符可以执行 shell 脚本并在不同的条件下表现不同。 您甚至可以让提示符在每次发出命令时播放一首曲子,尽管这很快就会让人感到厌烦。 更多信息可以在 Bash-Prompt HOWTO 中找到。


7.2.5. Shell 脚本

7.2.5.1. 什么是脚本?

正如我们在 shell 配置示例中看到的那样,shell 脚本是一个包含 shell 命令的文本文件。 当这样的文件在调用 Bash 时用作第一个非选项参数,并且既没有-c也没有-s选项提供时,Bash 从文件中读取并执行命令,然后退出。 这种操作模式会创建一个非交互式 shell。 当 Bash 运行 shell 脚本时,它会将特殊参数0设置为文件名,而不是 shell 的名称,并且位置参数(脚本名称后的所有内容)设置为剩余的参数(如果有)。 如果没有提供额外的参数,则位置参数将被取消设置。

可以通过使用 chmod 命令打开执行位来使 shell 脚本可执行。 当 Bash 在搜索PATH的命令时找到这样的文件,它会生成一个子 shell 来执行它。 换句话说,执行

filename参数

等同于执行

bashfilename 参数

如果 "filename" 是一个可执行的 shell 脚本。 这个子 shell 会重新初始化自身,因此其效果就好像调用了一个新的 shell 来解释该脚本,唯一的例外是父级记住的命令位置(参见 Info 页面中的 hash)由子级保留。

大多数版本的 UNIX 使这成为操作系统命令执行机制的一部分。 如果脚本的第一行以两个字符 "#!" 开头,则该行的其余部分指定程序的解释器。 因此,您可以指定 bashawkperl 或其他一些解释器或 shell,并以该语言编写脚本文件的其余部分。

解释器的参数包括脚本文件第一行解释器名称后的单个可选参数,后跟脚本文件的名称,后跟其余参数。 Bash 将在不自行处理它的操作系统上执行此操作。

Bash 脚本通常以

#! /bin/bash

(假设 Bash 已安装在/bin) 开头,因为这确保了即使在另一个 shell 下执行脚本,也将使用 Bash 来解释该脚本。


7.2.5.2. 一些简单的例子

一个非常简单的脚本,仅包含一个命令,向执行它的用户打招呼

[jerry@nowhere ~] cat hello.sh
#!/bin/bash
echo "Hello $USER"

该脚本实际上只包含一个命令,echo,它使用 ($) 的USER环境变量来打印一个为发出命令的用户定制的字符串。

另一个单行脚本,用于显示连接的用户

#!/bin/bash
who | cut -d " " -f 1 | sort -u

这是一个包含更多行的脚本,我用它来制作目录中所有文件的备份副本。 该脚本首先列出当前目录中的所有文件,并将其放入变量列表中。 然后,它设置每个文件的副本名称,然后复制该文件。 对于每个文件,都会打印一条消息

tille:~> cat bin/makebackupfiles.sh
#!/bin/bash
# make copies of all files in a directory
LIST=`ls`
for i in $LIST; do
	ORIG=$i
	DEST=$i.old
	cp $ORIG $DEST
	echo "copied $i"
done

仅输入像 mv * *.old 这样的行是行不通的,当您在一组测试文件上尝试此操作时,您会注意到这一点。 添加了一个 echo 命令以显示一些活动。 当脚本无法正常工作时,echo 通常很有用:在每个可疑步骤后插入一个,您将很快找到错误。

ls/etc/rc.d/init.d目录包含大量示例。 让我们看一下控制虚拟 ICanSeeYou 服务器的这个脚本

#!/bin/sh
# description: ICanSeeYou allows you to see networked people

# process name: ICanSeeYou
# pidfile: /var/run/ICanSeeYou/ICanSeeYou.pid
# config: /etc/ICanSeeYou.cfg

# Source function library.
. /etc/rc.d/init.d/functions

# See how (with which arguments) we were called.
case "$1" in
	start)
		echo -n "Starting ICanSeeYou: "
		daemon ICanSeeYou
		echo
		touch /var/lock/subsys/ICanSeeYou
		;;
	stop)
		echo -n "Shutting down ICanSeeYou: "
		killproc ICanSeeYou
		echo
		rm -f /var/lock/subsys/ICanSeeYou
		rm -f /var/run/ICanSeeYou/ICanSeeYou.pid
		;;
	status)
		status ICanSeeYou
		;;
	restart)
		$0 stop
		$0 start
		;;
	*)
		echo "Usage: $0 {start|stop|restart|status}"
		exit 1
esac

exit 0

首先,使用 . 命令(点),加载了一组 shell 函数,这些函数被/etc/rc.d/init.d中的几乎所有 shell 脚本使用。 然后发出一个 case 命令,该命令定义了脚本可以执行的 4 种不同方式。 一个例子可能是 ICanSeeYou start。 通过读取脚本的(第一个)参数来确定要应用哪个 case,使用表达式 $1

如果没有给出符合要求的输入,则应用以星号标记的默认 case,然后脚本给出一条错误消息。 case 列表以 esac 语句结尾。 在 start case 中,服务器程序作为守护进程启动,并分配一个进程 ID 和锁。 在 stop case 中,跟踪并停止服务器进程,并删除锁和 PID。 诸如守护进程选项和诸如killproc之类的函数在/etc/rc.d/init.d/functions文件中定义。 此设置特定于此示例中使用的发行版。 您系统上的 initscripts 可能会使用在其他文件中定义的其他函数,或者根本不使用任何函数。

成功后,该脚本会向其父级返回零的退出代码。

这个脚本是使用函数的一个很好的例子,函数使脚本更易于阅读并使工作完成得更快。 请注意,他们使用 sh 而不是 bash,以使它们在更广泛的系统上可用。 在 Linux 系统上,将 bash 作为 sh 调用会导致 shell 在符合 POSIX 的模式下运行。

bash 手册页包含有关组合命令、for- 和 while-循环以及正则表达式的更多信息,以及示例。 来自与本 Linux 指南简介的同一作者编写的、针对系统管理员和高级用户的、带有练习的、可理解的 Bash 课程位于 http://tille.garrels.be/training/bash/Bash 功能和应用的详细描述位于参考指南 高级 Bash 脚本 中。


7.3. 图形环境

7.3.1. 介绍

普通用户可能不太关心他的登录设置,但 Linux 提供了各种各样的炫酷窗口和桌面管理器,可在图形环境 X 下使用。 窗口管理器和桌面的使用和配置非常简单,甚至可能类似于标准的 MS Windows、Apple 或 UNIX CDE 环境,尽管许多 Linux 用户更喜欢更炫的桌面和更高级的窗口管理器。 我们将不在此处讨论用户特定的配置。 只需尝试并阅读这些管理器提供的内置帮助功能的文档,您就会没事的。

但是,我们将更仔细地研究底层系统。


7.3.2. X 窗口系统

X Window System 是一种网络透明的窗口系统,它可以在各种计算和图形机器上运行。X Window System 服务器运行在带有位图显示的计算机上。X 服务器通过各种不同的进程间通信通道,将用户输入分发给多个客户端程序,并接受来自这些客户端程序的输出请求。虽然最常见的情况是客户端程序与服务器运行在同一台机器上,但客户端也可以透明地从其他机器(包括具有不同架构和操作系统的机器)上运行。我们将在第 10 章中学习如何实现网络和远程应用。

X 支持单色和彩色显示器上的重叠分层子窗口以及文本和图形操作。使用 X 服务器的 X 客户端程序数量非常庞大。X Consortium 核心发行版中提供的一些程序包括:

  • xterm: 终端模拟器

  • twm: 极简主义窗口管理器

  • xdm: 显示管理器

  • xconsole: 控制台重定向程序

  • bitmap: 位图编辑器

  • xauth, xhosticeauth: 访问控制程序

  • xset, xmodmap 以及许多其他程序:用户偏好设置程序

  • xclock: 时钟

  • xlsfonts 及其他程序:字体显示器,用于列出有关字体、窗口和显示器信息的实用程序

  • xfs: 字体服务器

  • ...

有关详细信息,我们再次参考这些命令的手册页。更多关于可用功能的解释可以在 Xlib - C 语言 X 接口 手册(随您的 X 发行版提供)、X Window System 协议规范以及各种 X 工具包的手册和文档中找到。目录/usr/share/doc包含这些文档和许多其他文档的引用。

X Consortium 发行版中还包含许多其他的实用程序、窗口管理器、游戏、工具包和小工具作为用户贡献的软件,或者可以通过 Internet 上的匿名 FTP 获取。好的起始点是 http://www.x.orghttp://www.xfree.org

此外,您所有的图形应用程序,例如您的浏览器、您的电子邮件程序、您的图像查看程序、声音播放工具等等,都是 X 服务器的客户端。请注意,在正常操作中,即在图形模式下,Linux 上的 X 客户端和 X 服务器运行在同一台机器上。


7.3.2.1. 显示名称

从用户的角度来看,每个 X 服务器都有一个显示名称,其形式为:

hostname:displaynumber.screennumber

应用程序使用此信息来确定它应该如何连接到 X 服务器以及它应该默认使用哪个屏幕(在具有多个监视器的显示器上)

  • hostname:主机名指定显示器物理连接到的客户端机器的名称。如果未给出主机名,则将使用与同一台机器上的服务器通信的最有效方式。

  • displaynumber:短语 "display" 通常用于指代共享一个通用键盘和指针(鼠标、平板电脑等)的监视器集合。大多数工作站往往只有一个键盘,因此只有一个显示器。然而,较大的多用户系统通常有多个显示器,以便多人可以同时进行图形工作。为了避免混淆,当启动该显示器的 X 服务器时,机器上的每个显示器都会被分配一个显示编号(从 0 开始)。显示名称中必须始终给出显示编号。

  • screen number:一些显示器在两个或多个监视器之间共享一个键盘和指针。由于每个监视器都有自己的一组窗口,因此当启动该显示器的 X 服务器时,每个屏幕都会被分配一个屏幕编号(从 0 开始)。如果未给出屏幕编号,将使用屏幕 0。

在 POSIX 系统上,默认显示名称存储在您的存储的信息环境变量中。此变量由 xterm 终端模拟器自动设置。但是,当您登录到网络上的另一台机器时,您可能需要手动设置存储的信息以指向您的显示器,请参阅第 10.4.3.2 节

更多信息可以在 X 手册页中找到。


7.3.2.2. 窗口和桌面管理器

屏幕上窗口的布局由称为窗口管理器的特殊程序控制。虽然许多窗口管理器会遵守给定的几何规范,但其他窗口管理器可能会选择忽略它们(例如,要求用户使用指针在屏幕上明确绘制窗口的区域)。

由于窗口管理器是常规的(尽管很复杂)客户端程序,因此可以构建各种不同的用户界面。X Consortium 发行版带有一个名为 twm 的窗口管理器,但当系统资源允许时,大多数用户更喜欢更花哨的东西。Sawfish 和 Enlightenment 是流行的示例,它们允许每个用户根据心情和风格拥有一个桌面。

桌面管理器使用一个或另一个窗口管理器,以便以方便的方式安排您的图形桌面,包括菜单栏、下拉菜单、信息性消息、时钟、程序管理器、文件管理器等等。最流行的桌面管理器包括 GnomeKDE,它们都在几乎所有 Linux 发行版和许多其他 UNIX 系统上运行。

TipGnome 中的 KDE 应用程序/KDE 中的 Gnome 应用程序
 

您不需要在 KDE 中启动桌面才能运行 KDE 应用程序。如果您已安装 KDE 库(kdelibs 软件包),您可以从 Gnome 菜单运行这些应用程序,或者从 Gnome 终端启动它们。

KDE 环境中运行 Gnome 应用程序有点棘手,因为 Gnome 中没有一组基础库。但是,当运行或安装此类应用程序时,您可能必须安装的依赖项和因此产生的额外软件包将会变得清晰。


7.3.3. X 服务器配置

Linux 附带的 X 发行版,XFree86,使用配置文件XF86Config进行初始设置。此文件配置您的显卡,并在多个位置搜索该文件,尽管它通常位于/etc/X11.

如果您看到文件/etc/X11/XF86Config存在于您的系统上,可以在关于XF86Config.

由于 XFree86 的许可问题,较新的系统通常附带 X 服务器和工具的 X.Org 发行版。这里的主要配置文件是xorg.conf,通常也位于/etc/X11。该文件由多个可以按任何顺序出现的节组成。这些节包含有关您的显示器、您的视频适配器、屏幕配置、键盘等的信息。作为用户,您无需过多担心此文件中的内容,因为一切通常在安装系统时确定。

但是,如果您需要更改图形服务器设置,您可以运行配置工具或编辑配置基础结构以使用 XFree86 服务器的配置文件。有关更多信息,请参阅手册页;您的发行版可能具有自己的工具。由于配置错误可能会导致图形模式下出现无法读取的乱码,因此您可能需要在尝试更改配置之前制作配置文件的备份副本,以防万一。


7.4. 区域特定设置

7.4.1. 键盘设置

使用 loadkeys 命令为文本控制台设置键盘布局。使用您的本地 X 配置工具或编辑 Keyboard 部分中的XF86Config手动配置图形模式的布局。XkbdLayout是您要设置的

    XkbLayout       "us"

这是默认值。通过将带引号的值替换为您keymaps子目录中列出的任何名称,将其更改为您当地的设置。如果您找不到 keymaps,请尝试通过发出命令在您的系统上显示它们的位置

locatekeymaps

可以组合布局设置,如下例所示

Xkblayout      "us,ru"

在编辑/etc/X11/XF86Config文件之前备份它!您需要使用 root 帐户来执行此操作。

注销并重新连接以重新加载 X 设置。

Gnome 键盘小程序支持实时切换布局;使用此程序不需要特殊权限。KDE 也有类似的工具可以在键盘布局之间切换。


7.4.2. 字体

使用 setfont 工具在文本模式下加载字体。大多数系统都带有一个标准的inputrc文件,该文件支持组合字符,例如法语 "�"(元字符)。然后,系统管理员应该添加行

export INPUTRC="/etc/inputrc"

/etc/bashrc文件中。


7.4.3. 日期和时区

时间信息的设置通常在安装时完成。之后,可以使用 NTP(网络时间协议)客户端保持最新。大多数 Linux 系统默认运行 ntpd

debby:~> ps -ef | grep ntpd
ntp      24678     1  0  2002 ?        00:00:33 ntpd -U ntp

您可以手动运行 ntpdate 来设置时间,前提是您可以访问时间服务器。使用 ntpdate 调整时间时,ntpd 守护程序不应运行。使用时间服务器作为命令的参数

root@box:~# ntpdate 10.2.5.200
26 Oct 14:35:42 ntpdate[20364]: adjust time server 10.2.5.200 offset
 -0.008049 sec

请参阅您的系统手册和 NTP 软件包附带的文档。大多数桌面管理器都包含设置系统时间的工具,前提是您可以访问系统管理员帐户。

要正确设置时区,您可以使用 tzconfigtimezone 命令。时区信息通常在安装机器期间设置。许多系统都有特定于发行版的工具来配置它,请参阅您的系统文档。


7.4.4. 语言

如果您希望从系统中获取荷兰语或法语的消息,您可能需要设置输入设备(如键盘)的定义文件的位置LANGUAGE环境变量,从而为所需的语言启用区域设置支持,并最终启用与该语言中的字符约定相关的字体。

对于大多数图形登录系统,例如 gdmkdm,您可以在登录之前配置这些语言设置。

请注意,在大多数系统中,默认设置往往是en_US.UTF-8。这没什么问题,因为默认使用此设置的系统也会自带所有支持此编码的程序。因此,vi可以编辑您系统上的所有文件,cat也不会出现奇怪的行为,等等。

当您连接到不支持此字体编码的旧系统,或者在仅支持单字节字符字体的系统上打开UTF-8编码的文件时,问题就开始了。 recode实用程序可能可以帮助您将文件从一种字符集转换为另一种字符集。阅读手册页以了解功能和用法概述。另一种解决方案可能是通过设置以下环境变量来临时使用另一个编码定义:输入设备(如键盘)的定义文件的位置环境变量

debby:~> acroread /var/tmp/51434s.pdf
Warning: charset "UTF-8" not supported, using "ISO8859-1".
Aborted

debby:~> set | grep UTF
LANG=en_US.UTF-8

debby:~> export LANG=en_US

debby:~> acroread /var/tmp/51434s.pdf
<--new window opens-->

请访问Mozilla网站,了解如何获取您语言版本的FirefoxOpenOffice.org网站包含有关OpenOffice.org套件本地化的信息。


7.4.5. 特定国家/地区的信息

HOWTO列表包含孟加拉语、白俄罗斯语、中文、世界语、芬兰语、法语、希伯来语、希腊语、拉脱维亚语、波兰语、葡萄牙语、塞尔维亚语、斯洛伐克语、斯洛文尼亚语、西班牙语、泰语和土耳其语本地化说明的参考资料。


7.5. 安装新软件

7.5.1. 概述

大多数人惊讶地发现,安装 Linux 后,他们可以获得一台可以运行的可用计算机;大多数发行版都包含对视频卡和网卡、监视器和其他外部设备的充分支持,因此通常不需要安装额外的驱动程序。主发行版中还包括常用的工具,如办公套件、Web 浏览器、电子邮件和其他网络客户端程序。即便如此,初始安装可能无法满足您的要求。

如果您找不到所需的内容,可能是未在您的系统上安装。也可能是您拥有所需的软件,但它没有按预期工作。请记住,Linux 的发展速度很快,软件每天都在改进。不要浪费时间排除可能已经解决的问题。

您可以随时更新系统或向其中添加软件包。大多数软件都以软件包的形式提供。额外的软件可以在您的安装光盘上或在 Internet 上找到。您的 Linux 发行版的网站是开始寻找其他软件的好地方,并包含有关如何在您的 Linux 类型上安装它的说明,请参阅附录 A。始终阅读新软件随附的文档以及该软件包可能包含的任何安装指南。所有软件都附带一个README文件,强烈建议您阅读该文件。


7.5.2. 软件包格式

7.5.2.1. RPM 软件包

7.5.2.1.1. 什么是 RPM?

RPM,RedHat Package Manager,是一个强大的软件包管理器,您可以使用它来安装、更新和删除软件包。它允许您搜索软件包,并跟踪每个软件包附带的文件。它内置了一个系统,因此您可以验证从 Internet 下载的软件包的真实性。高级用户可以使用 RPM 构建自己的软件包。

RPM 软件包由文件存档和用于安装和擦除存档文件的元数据组成。元数据包括帮助脚本、文件属性和有关软件包的描述性信息。软件包有两种类型:二进制软件包,用于封装要安装的软件;以及源软件包,包含生成二进制软件包所需的源代码和配方。

许多其他发行版都支持 RPM 软件包,其中流行的有 RedHat Enterprise Linux、Mandriva(以前的 Mandrake)、Fedora Core 和 SuSE Linux。除了针对您的发行版的建议之外,您还需要阅读man rpm


7.5.2.1.2. RPM 示例

大多数软件包只需使用升级选项即可安装,-U,无论软件包是否已安装。 RPM 软件包包含该程序的完整版本,它会覆盖现有版本或作为新软件包安装。典型用法如下

rpm-Uvh /path/to/rpm-package(s)

ls-v选项会生成更详细的输出,并且-h使rpm打印进度条

[root@jupiter tmp]# rpm -Uvh totem-0.99.5-1.fr.i386.rpm
Preparing...                ########################################### [100%]
   1:totem                  ########################################### [100%]
[root@jupiter tmp]#

但是,新的内核软件包使用安装选项安装-i,该选项不会覆盖软件包的现有版本。这样,如果新内核无法工作,您仍然可以使用旧内核启动系统。

您也可以使用rpm来检查系统上是否安装了软件包

[david@jupiter ~] rpm -qa | grep vim
vim-minimal-6.1-29
vim-X11-6.1-29
vim-enhanced-6.1-29
vim-common-6.1-29

或者您可以找出哪个软件包包含某个文件或可执行文件

[david@jupiter ~] rpm -qf /etc/profile
setup-2.5.25-1

[david@jupiter ~] which cat
cat is /bin/cat

[david@jupiter ~] rpm -qf /bin/cat
coreutils-4.5.3-19

请注意,您无需拥有管理权限即可使用rpm查询 RPM 数据库。您只需要在添加、修改或删除软件包时是root用户。

下面是最后一个示例,演示如何使用rpm卸载软件包

[root@jupiter root]# rpm -e totem
[root@jupiter root]#

请注意,默认情况下卸载不是那么详细,您通常不会看到太多发生。如有疑问,请再次使用rpm -qa来验证软件包是否已删除。

RPM 可以做的事情远不止我们在本简介中讨论的几个基本功能; RPM HOWTO包含更多参考资料。


7.5.2.2. DEB (.deb) 软件包

7.5.2.2.1. 什么是 Debian 软件包?

这种软件包格式是 Debian GNU/Linux 上的默认格式,其中dselect和现在更常见的aptitude是管理软件包的标准工具。它用于选择要安装或升级的软件包,但它也会在 Debian 系统的安装过程中运行,并帮助您定义要使用的访问方法、列出可用软件包和配置软件包。

Debian 网站包含您需要的所有信息,包括“适用于初学者的 dselect 文档”

根据最新消息,Debian 软件包格式越来越受欢迎。在撰写本文时,排名前 10 位的发行版中有 5 个使用它。此外,apt-get(请参阅第 7.5.3.2 节)也变得非常流行,即使在非 DEB 系统上也是如此。


7.5.2.2.2. DEB 工具的示例

使用dpkg命令完成对软件包是否已安装的检查。例如,如果您想知道您的机器上安装了哪个版本的Gallery软件

nghtwsh@gorefest:~$ dpkg -l *gallery*
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Installed/Config-files/Unpacked/Failed-config/Half-installed
|/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad)
||/ Name           Version        Description
+++-==============-==============-============================================
ii  gallery        1.5-1sarge2    a web-based photo album written in php

"ii"前缀表示已安装软件包。如果您看到"un"作为前缀,则表示该软件包在您的计算机保存的列表中已知,但未安装。

使用以下命令完成对文件属于哪个软件包的搜索-Sdpkg

nghtwsh@gorefest:~$ dpkg -S /bin/cat
coreutils: /bin/cat

更多信息可以在dpkgInfo页面中找到。


7.5.2.3. 源码包

Linux程序的大部分是自由/开源的,因此这些程序有源码包可用。编译自己的程序版本需要源文件。可以从程序的网站下载源代码,通常作为压缩的 tarball (program-version.tar.gz或类似文件)。对于基于 RPM 的发行版,通常以program-version.src.rpm的形式提供源代码。 Debian 和大多数基于它的发行版本身提供改编的源代码,可以使用apt-get source获取。

文件README中提供了具体的要求、依赖关系和安装说明。您可能需要一个 C 编译器,gcc。此 GNU C 编译器包含在大多数 Linux 系统中,并已移植到许多其他平台。


7.5.3. 自动化软件包管理和更新

7.5.3.1. 一般说明

安装新系统后,您要做的第一件事就是应用更新;这适用于所有操作系统,Linux 也不例外。

大多数 Linux 系统的更新通常可以在镜像您的发行版的附近站点上找到。提供此服务的站点列表可以在您的发行版的网站上找到,请参阅附录 A

应定期应用更新,如果可能,每天都应用 - 但每隔几周是一个合理的开始。您确实应该尝试拥有发行版的最新版本,因为 Linux 不断变化。正如我们之前所说,新功能、改进和错误修复以稳定的节奏提供,有时还会解决重要的安全问题。

好消息是,大多数 Linux 发行版都提供了工具,因此您不必每天手动升级数十个软件包。以下各节概述了软件包管理器管理器。这个主题涉及的内容很多,即使是源代码包的定期更新也可以自动管理;我们只列出最常见的系统。始终参阅您的特定发行版的文档以获取建议的程序。


7.5.3.2. APT

Advanced Package Tool是用于软件包的管理系统。用于处理软件包的命令行工具是apt-get,它附带一个出色的手册页,描述了如何安装和更新软件包以及如何升级单个软件包或整个发行版。 APT 起源于 Debian GNU/Linux 发行版,它是 Debian 软件包的默认管理器。 APT 也已被移植为可与 RPM 软件包一起使用。 APT 的主要优点是它是免费且使用灵活的。它将允许您设置类似于以下各节中列出的发行版特定(并且在某些情况下是商业)的系统。

通常,首次使用 apt-get 时,需要获取可用软件包的索引。这可以使用以下命令完成:

apt-getupdate

之后,您可以使用 apt-get 来升级您的系统

apt-getupgrade

经常这样做,这是保持系统最新并因此安全的简单方法。

除了这种通用用法外,apt-get 在安装单个软件包时也非常快。以下是它的工作方式:

[david@jupiter ~] su - -c "apt-get install xsnow"
Password:
Reading Package Lists... Done
Building Dependency Tree... Done
The following NEW packages will be installed:
  xsnow
0 packages upgraded, 1 newly installed, 0 removed and 3 not upgraded.
Need to get 33.6kB of archives.
After unpacking 104kB of additional disk space will be used.
Get:1 http://ayo.freshrpms.net redhat/9/i386/os xsnow 1.42-10 [33.6kB]
Fetched 33.6kB in 0s (106kB/s)
Executing RPM (-Uvh)...
Preparing...                ########################################### [100%]
   1:xsnow                  ########################################### [100%]

请注意-csu 命令的选项,该选项指示 root shell 仅执行此命令,然后返回到用户的环境。这样,您就不会忘记退出 root 帐户。

如果存在对其他软件包的任何依赖关系,apt-get 将下载并安装这些支持软件包。

更多信息可以在 APT HOWTO 中找到。


7.5.3.3. 使用 RPM 软件包的系统

Update Agent 最初仅支持 RedHat RPM 软件包,现在已移植到更广泛的软件,包括非 RedHat 存储库。此工具提供了一个完整的系统,用于更新 RedHat 或 Fedora Core 系统上的 RPM 软件包。在命令行中,键入 up2date 以更新您的系统。在桌面上,默认情况下会激活一个小图标,告诉您系统是否有可用的更新。

Yellowdog's Updater Modified (yum) 是另一个最近变得流行的工具。它是一个交互式但自动化的更新程序,用于在系统上安装、更新或删除 RPM 软件包。它是 Fedora 系统上的首选工具。

在 SuSE Linux 上,一切都使用 YaST(另一个设置工具)完成,该工具支持各种系统管理任务,其中包括更新 RPM 软件包。从 SuSE Linux 7.1 开始,您还可以使用 Web 界面和 YOU(Yast Online Update)进行升级。

Mandrake Linux 和 Mandriva 提供了所谓的 URPMI 工具,这是一组包装程序,使用户更容易安装新软件。这些工具与 RPMDrakeMandrakeUpdate 相结合,提供了平滑安装和卸载软件包所需的一切。MandrakeOnline 提供了一系列扩展服务,并且可以在您的特定 Mandrake 系统有可用更新时自动通知管理员。有关更多信息,请参阅 man urpmi 等。

此外,KDEGnome 桌面套件都有自己的(图形化)软件包管理器版本。


7.5.4. 升级内核

如果您定期升级发行版,则大多数 Linux 安装都可以正常工作。升级过程会在需要时安装新内核,并对您的系统进行所有必要的更改。只有当您需要 Linux 发行版中包含的默认内核不支持的内核功能时,才应手动编译或安装新内核。

无论是编译自己的优化内核还是使用预编译的内核包,在您确定一切都按计划工作之前,请将其与旧内核共存安装。

然后创建一个双启动系统,通过更新启动加载程序配置文件,您可以选择启动哪个内核grub.conf。这是一个简单的例子

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making config changes. 
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, e.g.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/hde8
#          initrd /initrd-version.img
#boot=/dev/hde
default=0
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Hat Linux new (2.4.9-31)
	root (hd0,0)
	kernel /vmlinuz-2.4.9-31 ro root=/dev/hde8
	initrd /initrd-2.4.9-31.img
title old-kernel
        root (hd0,0)
        kernel /vmlinuz-2.4.9-21 ro root=/dev/hde8
        initrd /initrd-2.4.9-21.img

在证明新内核可以工作后,您可以从 GRUB 配置文件中删除旧内核的行,尽管最好等待几天以确保安全。


7.5.5. 从安装 CD 安装额外的软件包

7.5.5.1. 挂载 CD

这基本上与手动安装软件包的方式相同,除了您必须将 CD 的文件系统附加到您计算机的文件系统中以使其可访问。在大多数系统上,这将在将 CD 插入驱动器时自动完成,因为 automount 守护程序会在启动时启动。如果您的 CD 没有自动提供,请在终端窗口中发出 mount 命令。根据您的实际系统配置,通常会使用类似于下面这样的行

mount/dev/cdrom /mnt/cdrom

在某些系统上,只有 root 可以挂载可移动介质;这取决于配置。

出于自动化目的,CD 驱动器通常在/etc/fstab中有一个条目,该条目列出了组成文件系统树的文件系统及其挂载点。 这是这样的一行

[david@jupiter ~] grep cdrom /etc/fstab
/dev/cdrom	/mnt/cdrom	iso9660		noauto,owner,ro 0 0

这表明系统将理解命令 mount /mnt/cdromnoauto选项意味着在此系统上,CD 在启动时不会挂载。

如果您的文件管理器没有为您执行此操作,您甚至可以尝试右键单击桌面上的 CD 图标以挂载 CD。 您可以通过不带任何参数发出 mount 命令来检查它是否有效

[david@jupiter ~] mount | grep cdrom
/dev/cdrom on /mnt/cdrom type iso9660 (ro,nosuid,nodev)

7.5.5.2. 使用 CD

挂载 CD 后,您可以更改目录,通常是挂载点/mnt/cdrom,您可以在其中访问 CD-ROM 的内容。 使用与处理硬盘驱动器上的文件相同的文件和目录命令。


7.5.5.3. 弹出 CD

为了在使用完 CD 后将其从驱动器中取出,CD 上的文件系统应未使用。 即使位于挂载点的子目录中,/mnt/cdrom在我们的示例中,也将被视为“使用文件系统”,因此您应该离开那里。 例如,通过键入不带任何参数的 cd 来执行此操作,这将使您回到您的主目录。 之后,您可以选择使用命令

umount/mnt/cdrom

或者

ejectcdrom

Warning被阻止的驱动器
 

切勿 强制驱动器。 使用回形针的技巧是一个坏主意,因为这最终会弹出 CD,但您的系统会认为 CD 仍然存在,因为没有遵循正常的程序。 您可能需要重新启动才能使系统恢复到一致状态。

如果您一直收到 “设备繁忙” 消息,请首先检查所有 shell 会话是否已离开 CD 文件系统,并且没有图形应用程序再使用它。 如有疑问,请使用 lsof 工具来跟踪仍在使用 CD 资源的进程。


7.6. 总结

当一切都井然有序时,这意味着已经完成了一半的工作。

虽然保持秩序很重要,但在您的环境中感到宾至如归同样重要,无论是文本还是图形。 文本环境通过 shell 设置文件进行控制。 图形环境主要取决于 X 服务器配置,在其上构建了许多其他应用程序,例如窗口和桌面管理器以及图形应用程序,每个应用程序都有自己的配置文件。 您应该阅读系统和程序特定的文档,以了解如何配置它们。

键盘设置、安装合适的字体和语言支持等区域设置最好在安装时完成。

软件是使用软件包系统自动或手动管理的。

本章介绍了以下命令

表 7-2. 第 7 章中的新命令:让您宾至如归

命令含义
aptitude以 Debian 风格管理软件包。
automount自动包含新插入的文件系统。
dpkgDebian 软件包管理器。
dselect以 Debian 风格管理软件包。
loadkeys加载键盘配置。
lsof识别进程。
mount将新文件系统包含到现有文件系统树中。
ntpdate使用时间服务器设置系统时间和日期。
quota显示有关允许的磁盘空间使用情况的信息。
recode将文件转换为另一种字符集。
rpm管理 RPM 软件包。
setfont选择字体。
timezone设置时区。
tzconfig设置时区。
ulimit设置或显示资源限制。
up2date管理 RPM 软件包。
urpmi管理 RPM 软件包。
yum管理 RPM 软件包。

7.7. 练习

7.7.1. Shell 环境

  • 打印出您的环境设置。 哪个变量可用于存储您机器的 CPU 类型?

  • 制作一个脚本,可以说出类似“hello, world.” 之类的内容。 给它适当的权限,以便可以运行。 测试您的脚本。

  • 在您的主目录中创建一个目录,并将脚本移动到新目录。 将此新目录永久添加到您的搜索路径。 测试脚本是否可以在不给出其实际位置的路径的情况下执行。

  • 在您的主目录中创建子目录以存储各种文件,例如目录music以保存音频文件,一个目录documents用于您的笔记,等等。 并使用它们!

  • 创建一个个性化的提示符。

  • 显示资源使用限制。 你能改变它们吗?

  • 尝试读取压缩的 man 页面,而无需先解压缩它们。

  • 创建一个别名 lll,它实际上执行 ls -la

  • 为什么命令 tail testfile > testfile 不起作用?

  • 挂载一个数据 CD,例如您的 Linux 安装 CD,四处看看。 当您不再需要它时,不要忘记卸载它。

  • 第 7.2.5.2 节中的脚本并不完美。 它会为目录的文件生成错误。 调整脚本,使其仅选择纯文本文件进行复制。 使用 find 进行选择。 在您尝试运行脚本之前,不要忘记使脚本可执行。


7.7.2. 图形环境

  • 尝试在不同区域(终端、背景、任务栏)中使用所有鼠标按钮。

  • 浏览菜单。

  • 自定义您的终端窗口。

  • 使用鼠标按钮将文本从一个终端复制并粘贴到另一个终端。

  • 了解如何配置您的窗口管理器; 尝试不同的工作区(虚拟屏幕)。

  • 在任务栏添加小程序,例如负载监视器。

  • 应用不同的主题。

  • 启用所谓的懒惰焦点 - 即只需将鼠标移动到窗口上方即可激活窗口,无需点击窗口即可使用。

  • 切换到不同的窗口管理器。

  • 注销并选择不同的会话类型,例如,如果您之前使用Gnome,则选择KDE。重复之前的步骤。


第八章. 打印机和打印

在本章中,我们将学习更多关于打印机和打印文件的知识。阅读完本章后,您将能够:

  • 格式化文档

  • 在将文档发送到打印机之前预览文档

  • 选择一个适用于您的Linux系统的好的打印机

  • 打印文件并检查打印机状态

  • 排除打印故障

  • 查找安装打印机所需的文档


8.1. 打印文件

8.1.1. 命令行打印

8.1.1.1. 将文件发送到打印机

从应用程序中打印非常容易,只需从菜单中选择打印选项。

从命令行,使用lplpr命令。

lpfile(s)

lprfile(s)

这些命令可以从管道读取数据,因此您可以使用以下命令打印命令的输出:

command | lp

有很多选项可以调整页面布局、副本数量、要打印到的打印机(如果您有多个可用打印机)、纸张尺寸、单面或双面打印(如果您的打印机支持此功能)、边距等。请阅读 man 手册以获取完整的概述。


8.1.1.2. 您的打印作业状态

一旦文件被打印队列接受,就会分配一个打印作业的识别号码

davy:~> lp /etc/profile
request id is blob-253 (1 file(s))

要查看(查询)打印队列,请使用lpqlpstat命令。如果没有参数,它将显示默认打印队列的内容。

davy:~> lpq
blob is ready and printing
Rank	Owner	Job	File(s)		Total Size
active	davy	253	profile		1024 bytes
davy:~> lpstat
blob-253	davy	1024	Tue 25 Jul 2006 10:20_01 AM CEST

8.1.1.3. 您的打印机状态

在可以访问多个打印机的系统中,哪个是默认打印机?

lpstat-d

davy:~> lpstat -d
system default destination: blob

我的打印机状态是什么?

lpstat-p

davy:~> lpstat -p
printer blob now printing blob-253. enabled since Jan 01 18:01

8.1.1.4. 从打印队列中删除作业

如果您不喜欢从状态命令中看到的内容,请使用lprmcancel删除作业。

davy:~> lprm 253

在图形环境中,您可能会看到一个弹出窗口,告诉您该作业已被取消。

在较大的环境中,可以使用lpc来控制多个打印机。请参阅每个命令上的信息或 man 手册。

有很多GUI打印工具用作lp的前端,并且大多数图形应用程序都有使用lp的打印功能。 有关更多信息,请参见内置的帮助功能和特定于程序的文档。

Note为什么与打印相关的每个任务都有两个命令?
 

UNIX和类似系统上的打印有着悠久的历史。 过去有两种截然不同的方法:BSD风格的打印和SystemV风格的打印。 为了兼容性,带有CUPS的Linux支持这两种风格的命令。 另请注意,lp的行为并不完全像lprlpq的选项与lpstat略有不同,而lprm几乎与cancel相似,但不完全相同。 您使用哪个并不重要,只需选择您习惯使用的命令,或者您可能从以前使用类UNIX系统的经验中了解的命令即可。


8.1.2. 格式化

8.1.2.1. 工具和语言

如果我们希望从打印机中获得有意义的内容,则应首先格式化文件。 除了大量的格式化软件外,Linux还带有基本的UNIX格式化工具和语言。

现代Linux系统支持直接打印,无需用户进行任何格式化,即可打印各种文件类型:文本、PDF、PostScript和几种图像格式,例如PNG、JPEG、BMP和GIF。

对于确实需要格式化的那些文件格式,Linux带有许多格式化工具,例如pdf2psfax2psa2ps命令,这些命令可以将其他格式转换为PostScript。 这些命令可以创建可以在其他没有安装所有转换工具的系统上使用的文件。

除了这些命令行工具之外,还有很多图形文字处理程序。 有几个完整的办公套件可用,其中许多是免费的。 这些在提交打印作业时会自动进行格式化。 仅举几个例子:OpenOffice.orgKOfficeAbiWordWordPerfect等。

以下是打印上下文中常见的语言

  • groff:UNIX roff命令的GNU版本。 它是groff文档格式化系统的前端。 通常,它运行troff命令以及适合于所选设备的后处理器。 它允许生成PostScript文件。

  • TeX和宏包LaTeX:UNIX系统上使用最广泛的标记语言之一。 通常以tex的形式调用,它格式化文件并输出排版文档的相应设备无关的表示形式。

    由于LaTeX支持数学公式,因此技术著作仍然经常以LaTeX编写,尽管W3C(万维网联盟)正在努力将此功能包含在其他应用程序中。

  • SGML和XML:UNIX和Linux可以使用免费的解析器。 XML是下一代SGML,它构成了DocBook XML的基础,DocBook XML是一种文档系统(例如,本书是用XML编写的)。

Tip打印文档
 

man手册包含预先格式化的troff数据,必须先将其格式化,然后才能从打印机中输出。 打印是使用-t选项到man命令

man-t command > man-command.ps

然后打印PostScript文件。 如果为您的系统/帐户配置了默认打印目标,则只需发出命令man -t command,即可将格式化的页面直接发送到打印机。


8.1.2.2. 预览格式化的文件

通常,可以将可以发送到打印机的任何内容也发送到屏幕。 根据文件格式,可以使用以下命令之一

  • PostScript文件:使用gv(GhostView)命令。

  • TeX dvi文件:使用xdviKDEkdvi

  • PDF文件:xpdfkpdfgpdf或Adobe的查看器acroread,也可以免费获得,但不是自由软件。 Adobe的阅读器支持PDF 1.6,其他的只支持PDF版本到1.5。 可以使用file命令确定PDF文件的版本。

  • 从应用程序(例如Firefox或OpenOffice)中,通常可以从菜单中选择打印预览


8.2. 服务器端

8.2.1. 一般

直到几年前,Linux用户的选择很简单:每个人都运行来自BSD的Net-2代码的相同的旧LPD。 然后LPRng变得越来越流行,但是如今,大多数现代Linux发行版都使用CUPS,即通用UNIX打印系统。 CUPS是Internet打印协议(IPP)的实现,IPP是类似HTTP的RFC标准,可替代古老(且笨拙)的LPD协议。 CUPS在GNU公共许可下分发。 CUPS也是MacOS X上的默认打印系统。


8.2.2. 图形打印机配置

大多数发行版都带有用于配置联网和本地(并行端口或USB)打印机的GUI。 它们使您可以从列表中选择打印机类型,并可以轻松进行测试。 您不必担心配置文件的语法和位置。 在尝试安装打印机之前,请检查您的系统文档。

也可以使用计算机上端口631上运行的Web界面来配置CUPS。 要检查是否启用了此功能,请尝试浏览到localhost:631/helplocalhost:631/


8.2.3. 为Linux购买打印机

随着越来越多的打印机供应商提供CUPS的驱动程序,CUPS将可以轻松地与您可以插入串行、并行或USB端口的几乎任何打印机以及网络上的任何打印机连接。 CUPS将确保以统一的方式向您和您的应用程序展示所有不同类型的打印机。

如果仅具有Win9x驱动程序且没有其他支持的打印机可能有问题。 如有疑问,请与http://linuxprinting.org/联系。

过去,您最好的选择是固件中具有本机PostScript支持的打印机,因为几乎所有产生可打印输出的UNIX或Linux软件都以PostScript形式生成可打印输出,而PostScript是出版业首选的打印机控制语言。 PostScript打印机通常更昂贵,但它是一种与设备无关的开放式编程语言,并且您始终可以100%确定它们可以工作。 但是,如今,这条经验法则的重要性正在下降。


8.3. 打印问题

在本节中,我们将讨论作为用户,当出现问题时您可以做什么。 我们不会讨论与打印服务的守护程序部分有关的任何问题,因为那是系统管理员的任务。


8.3.1. 错误的文件

如果您打印了错误的文件,则可以使用命令lprm jobID取消该作业,其中jobID的格式为printername-printjobnumber(从lpqlpstat显示的信息中获取)。 当其他作业正在等待在此打印机的队列中打印时,这将起作用。 但是,如果您是唯一使用此打印机的人,则必须非常迅速,因为作业通常会假脱机并在几秒钟内发送到打印机。 一旦到达打印机上,使用Linux工具删除作业就为时已晚。

在这些情况下,或者在配置了错误的打印驱动程序并且只有垃圾从打印机中输出的情况下,您可以尝试关闭打印机的电源。 但是,这可能不是最佳选择,因为您可能会导致卡纸和其他异常情况。


8.3.2. 我的打印没有出来

使用lpq命令,看看您是否可以找到您的作业

elly:~> lpq
Printer: lp@blob
 Queue: 2 printable jobs
 Server: pid 29998 active
 Unspooler: pid 29999 active
 Status: waiting for subserver to exit at 09:43:20.699
 Rank   Owner/ID             Class Job Files          Size Time
1      elly@blob+997           A   997 (STDIN)         129 09:42:54
2      elly@blob+22            A    22 /etc/profile    917 09:43:20

如今,许多打印机都具有Web界面,可以通过在Web浏览器中键入打印机的IP地址来显示状态信息

图8-1。 通过Web界面显示打印机状态

NoteCUPS Web界面与打印机Web界面
 

请注意,这不是CUPS Web界面,仅适用于支持此功能的打印机。 请检查打印机的文档。

如果您的作业ID不在那里也不在打印机上,请与您的系统管理员联系。 如果您的作业ID在输出中列出,请检查打印机是否正在打印。 如果是这样,请稍等片刻,您的工作将在适当的时间完成。

如果打印机未打印,请检查其是否装有纸张,检查与电源和数据网络的物理连接。 如果可以,则可能需要重新启动打印机。 请咨询您的系统管理员。

如果是网络打印机,尝试从另一台主机打印。如果从您自己的主机可以访问打印机(关于 ping 工具,请参见第 10 章),您可以尝试将格式化的文件放入其中,例如:file.ps如果是 PostScript 打印机,可以使用 FTP 客户端。如果可以正常工作,则说明您的打印系统配置错误。如果不能正常工作,则可能是打印机无法理解您提供的格式。

GNU/Linux 打印网站包含更多技巧。


8.4. 总结

Linux 打印服务提供了一组基于标准 UNIX LPD 工具的打印工具,无论是 SystemV 还是 BSD 实现。以下是与打印相关的命令列表。

表 8-1. 第 8 章中的新命令:打印

命令含义
lprlp打印文件
lpqlpstat查询打印队列
lprmcancel移除打印作业
acroreadPDF 阅读器
groff格式化工具
gvPostScript 阅读器
printconf配置打印机
xdviDVI 阅读器
xpdfPDF 阅读器
*2ps将文件转换为 PostScript

8.5. 练习

配置和测试打印机需要拥有一台打印机,并且能够访问 root 帐户。如果满足条件,您可以尝试:

  • 使用系统上的 GUI 安装打印机。

  • 使用 GUI 打印测试页。

  • 使用 lp 命令打印测试页。

  • 从应用程序内部打印,例如 Mozilla 或 OpenOffice,从菜单中选择 文件->打印

  • 断开打印机与网络或本地机器/打印服务器的连接。尝试打印某些内容时会发生什么?

以下练习可以在没有打印机或 root 访问权限的情况下完成。

  • 尝试从不同的源文件(例如 HTML、PDF、man 页面)创建 PostScript 文件。 使用 gv 查看器测试结果。

  • 检查打印守护进程是否正在运行。

  • 无论如何都打印文件。会发生什么?

  • 使用 Mozilla 创建一个 PostScript 文件。用 gv 测试它。

  • 将其转换为 PDF 格式。用 xpdf 测试它。

  • 您将如何从命令行打印 GIF 文件?

  • 使用 a2ps/etc/profile文件打印到输出文件。再次使用 gv 进行测试。如果您不指定输出文件会发生什么?


第 9 章. 基本备份技术

事故迟早会发生。在本章中,我们将讨论如何使用其他主机、软盘、CD-ROM 和磁带将数据保存到安全的地方。我们还将讨论最流行的压缩和归档命令。

完成本章后,您将了解如何:

  • 创建、查询和解压缩文件档案

  • 处理软盘并为您的系统制作启动盘

  • 写入 CD-ROM

  • 进行增量备份

  • 创建 Java 档案

  • 查找文档以使用其他备份设备和程序

  • 加密您的数据


9.1. 简介

虽然 Linux 是现有的最安全的操作系统之一,并且即使它被设计为持续运行,数据也可能会丢失。数据丢失通常是用户错误造成的,但偶尔也会因为系统故障,例如电源或磁盘故障而引起,因此始终最好保留敏感和/或重要数据的额外副本。


9.1.1. 准备您的数据

9.1.1.1. 使用 tar 进行归档

在大多数情况下,我们将首先将所有要备份的数据收集到一个单独的归档文件中,稍后我们将对其进行压缩。归档过程包括连接所有列出的文件并删除不必要的空白。在 Linux 中,这通常使用 tar 命令完成。tar 最初设计用于在磁带上归档数据,但它也可以制作归档文件,称为 *tarballs*。

tar 有很多选项,下面列出了最重要的选项:

  • -v: 详细

  • -t: 测试,显示 tarball 的内容

  • -x: 提取档案

  • -c: 创建档案

  • -f archivedevice: 使用archivedevice作为 tarball 的源/目标,设备默认为第一个磁带设备(通常是/dev/st0或类似的东西)

  • -j: 通过 bzip2 过滤,请参阅 第 9.1.1.2 节

通常省略带有 tar 选项的破折号前缀,如下面的示例所示。

Note使用 GNU tar 以获得兼容性
 

在一个系统上使用专有的 tar 版本创建的档案,可能与另一个专有系统上的 tar 不兼容。这可能会导致很多麻烦,例如,如果需要在不再存在的系统上恢复档案。在所有系统上使用 GNU tar 版本,以防止您的系统管理员崩溃。 Linux 始终使用 GNU tar。在其他 UNIX 机器上工作时,输入 tar --help 以找出您正在使用的版本。如果您没有看到 GNU 字样,请联系您的系统管理员。

在下面的示例中,创建一个档案并将其解包。

gaby:~> ls images/
me+tux.jpg  nimf.jpg

gaby:~> tar cvf images-in-a-dir.tar images/
images/
images/nimf.jpg
images/me+tux.jpg

gaby:~> cd images

gaby:~/images> tar cvf images-without-a-dir.tar *.jpg
me+tux.jpg
nimf.jpg

gaby:~/images> cd

gaby:~> ls */*.tar
images/images-without-a-dir.tar

gaby:~> ls *.tar
images-in-a-dir.tar 

gaby:~> tar xvf images-in-a-dir.tar 
images/
images/nimf.jpg
images/me+tux.jpg

gaby:~> tar tvf images/images-without-dir.tar 
-rw-r--r-- gaby/gaby  42888 1999-06-30 20:52:25 me+tux.jpg
-rw-r--r-- gaby/gaby   7578 2000-01-26 12:58:46 nimf.jpg

gaby:~> tar xvf images/images-without-a-dir.tar 
me+tux.jpg
nimf.jpg

gaby:~> ls *.jpg
me+tux.jpg  nimf.jpg

此示例还说明了已打包的目录和已打包的一堆文件之间的区别。建议仅压缩目录,这样在解包 tarball 时文件不会散布,(这可能在另一个系统上,您可能不知道哪些文件已经存在,哪些是来自档案的文件)。

当磁带驱动器连接到您的机器并由您的系统管理员配置时,以.tar结尾的文件名将替换为磁带设备名称,例如

tarcvf /dev/tape mail/

目录mail及其包含的所有文件都将被压缩到一个立即写入磁带的文件中。由于我们使用了 verbose 选项,因此会显示内容列表。


9.1.1.2. 使用 tar 进行增量备份

tar 工具支持使用-N选项创建增量备份。使用此选项,您可以指定一个日期,tar 将根据此日期检查所有指定文件的修改时间。如果文件的更改时间比日期更新,则它们将包含在备份中。下面的示例使用先前档案上的时间戳作为日期值。首先,创建初始档案并显示初始备份文件上的时间戳。然后创建一个新文件,然后我们进行一个新的备份,仅包含这个新文件。

jimmy:~> tar cvpf /var/tmp/javaproggies.tar java/*.java
java/btw.java
java/error.java
java/hello.java
java/income2.java
java/income.java
java/inputdevice.java
java/input.java
java/master.java
java/method1.java
java/mood.java
java/moodywaitress.java
java/test3.java
java/TestOne.java
java/TestTwo.java
java/Vehicle.java

jimmy:~> ls -l /var/tmp/javaproggies.tar
-rw-rw-r-- 1 jimmy   jimmy   10240 Jan 21 11:58 /var/tmp/javaproggies.tar

jimmy:~> touch java/newprog.java

jimmy:~> tar -N /var/tmp/javaproggies.tar \
-cvp /var/tmp/incremental1-javaproggies.tar java/*.java 2> /dev/null
java/newprog.java

jimmy:~> cd /var/tmp/

jimmy:~> tar xvf incremental1-javaproggies.tar
java/newprog.java

标准错误重定向到/dev/null。如果您不这样做,tar 将为每个未更改的文件打印一条消息,告诉您它不会被转储。

这种工作方式的缺点是它查看文件上的时间戳。假设您将一个档案下载到包含备份的目录中,并且该档案包含两年前创建的文件。在根据初始档案上的时间戳检查这些文件的时间戳时,对于 tar 来说,新文件实际上看起来很旧,并且不会包含在使用-N选项来了解。

的增量备份中。更好的选择是-g

jimmy:~> tar cvpf work-20030121.tar -g snapshot-20030121 work/
work/
work/file1
work/file2
work/file3

jimmy:~> file snapshot-20030121
snapshot-20030121: ASCII text

选项,这将创建一个要备份的文件列表。在进行增量备份时,将根据此列表检查文件。它是这样工作的:第二天,用户 jimmyfile3上做更多的工作,并创建file4

jimmy:~> tar cvpf work-20030122.tar -g snapshot-20030121 work/
work/
work/file3
work/file4

这些是一些非常简单的示例,但是您也可以在 cronjob 中使用这种命令(请参阅 第 4.4.4 节),该命令指定例如每周备份的快照文件和每天备份的快照文件。在这种情况下,进行完整备份时应替换快照文件。

更多信息可以在 tar 文档中找到。

Tip真实的东西
 

您可能已经注意到,当我们谈论一个简单的目录,一组属于一起的文件时,tar 就可以了。但是,当您要归档整个分区或磁盘或更大的项目时,有一些工具更容易管理。我们在这里仅解释 tar,因为它是一种非常流行的分发档案的工具。您经常需要安装一个软件,该软件以所谓的 “压缩 tarball” 的形式提供。有关执行常规备份的更简单方法,请参阅 第 9.3 节


9.1.1.3. 使用 gzipbzip2 压缩和解压缩

可以使用 zip 工具压缩数据,包括 tarball。gzip 命令会将后缀 .gz 添加到文件名并删除原始文件。

jimmy:~> ls -la | grep tar
-rw-rw-r-- 1 jimmy  jimmy    61440 Jun  6 14:08 images-without-dir.tar

jimmy:~> gzip images-without-dir.tar 

jimmy:~> ls -la images-without-dir.tar.gz 
-rw-rw-r-- 1 jimmy  jimmy    50562 Jun  6 14:08 images-without-dir.tar.gz

使用以下命令解压缩 gzipped 文件:-d选项来了解。

bzip2 的工作方式类似,但使用改进的压缩算法,因此创建的文件更小。有关更多信息,请参阅 bzip2 信息页。

Linux 软件包通常以 gzipped tarball 的形式分发。解压缩这种档案后,明智的做法是找到README并阅读它。它通常包含安装软件包的指南。

GNU tar 命令知道 gzipped 文件。使用命令

tarzxvf file.tar.gz

解压缩和 untarring.tar.gz或者.tgz文件。使用

tarjxvf file.tar.bz2

解包使用 bzip2 压缩的 tar 档案。


9.1.1.4. Java 档案

GNU 项目为我们提供了 jar 工具来创建 Java 档案。它是一个 Java 应用程序,可将多个文件合并到单个 JAR 档案文件中。虽然它也是一种通用的归档和压缩工具,基于 ZIP 和 ZLIB 压缩格式,但 jar 主要设计用于方便地将 Java 代码、小程序和/或应用程序打包到单个文件中。当组合在单个档案中时,Java 应用程序的组件可以更快地下载。

tar 不同,jar 默认情况下进行压缩,独立于其他工具 - 因为它基本上是 Java 版本的 zip。此外,它允许档案中的单个条目由作者签名,以便可以验证来源。

语法几乎与 tar 命令相同,有关具体差异,请参阅 info jar

Notetar、jar 和符号链接
 

标准文档中通常不会提及的一个值得注意的特性是,jar 命令会跟随符号链接。这些链接指向的数据将被包含在归档文件中。tar 命令的默认行为是只备份符号链接,但可以使用以下选项来改变此行为:-htar 命令。


9.1.1.5. 传输您的数据

将您的数据副本保存到另一台主机上是一种简单而准确的备份方法。有关 scpftp 等命令的更多信息,请参见第 10 章

在下一节中,我们将讨论本地备份设备。


9.2. 将您的数据移动到备份设备

9.2.1. 在软盘上制作副本

9.2.1.1. 格式化软盘

在大多数 Linux 系统上,用户都可以访问软盘驱动器。设备名称可能因软盘驱动器的大小和数量而异,如果不确定,请联系您的系统管理员。在某些系统上,可能存在一个链接/dev/floppy指向正确的设备,可能指向/dev/fd0(自动检测软盘设备) 或者/dev/fd0H1440(设置为 1.44MB 软盘)。

fdformat 是一个底层软盘格式化工具。它以软盘设备名称作为选项。fdformat 在软盘被写保护时会显示错误。

emma:~> fdformat /dev/fd0H1440
Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB.
Formatting ... done
Verifying ... done
emma:~>

mformat 命令(来自 mtools 软件包)用于创建 DOS 兼容的软盘,然后可以使用 mcopymdir 和其他 m-commands 访问这些软盘。

也有图形化工具可用。

图 9-1. 软盘格式化工具

软盘格式化后,可以将其挂载到文件系统中,并像普通的目录一样访问,虽然容量很小,但通常是通过/mnt/floppy条目进行访问。

如果需要,请安装 mkbootdisk 实用程序,该实用程序会创建一个可以启动当前系统的软盘。


9.2.1.2. 使用 dd 命令转储数据

dd 命令可用于将数据写入磁盘,或从中取出数据,具体取决于给定的输入和输出设备。一个例子:

gaby:~> dd if=images-without-dir.tar.gz of=/dev/fd0H1440
98+1 records in
98+1 records out

gaby~> dd if=/dev/fd0H1440 of=/var/tmp/images.tar.gz
2880+0 records in
2880+0 records out

gaby:~> ls /var/tmp/images*
/var/tmp/images.tar.gz

请注意,转储是在未挂载的设备上进行的。使用此方法创建的软盘无法在文件系统中挂载,但当然这是创建启动盘或救援盘的方法。有关 dd 的更多信息,请阅读 man 手册。

此工具是 GNU *coreutils* 软件包的一部分。

Note转储磁盘
 

dd 命令也可用于制作整个硬盘的原始转储。


9.2.2. 使用 CD 刻录机制作副本

在某些系统上,允许用户使用 CD 刻录机设备。您的数据需要先进行格式化。使用 mkisofs 命令在包含要备份的文件的目录中执行此操作。使用 df 检查是否有足够的磁盘空间可用,因为将创建一个与整个当前目录大小大致相同的新文件。

[rose@blob recordables] df -h .
Filesystem            Size  Used Avail Use% Mounted on
/dev/hde5              19G   15G  3.2G  82% /home

[rose@blob recordables] du -h -s .
325M    .

[rose@blob recordables] mkisofs -J -r -o cd.iso .
<--snap-->
making a lot of conversions
<--/snap-->
98.95% done, estimate finish Fri Apr  5 13:54:25 2002
Total translation table size: 0
Total rockridge attributes bytes: 35971
Total directory bytes: 94208
Path table size(bytes): 452
Max brk space used 37e84
166768 extents written (325 Mb)

ls-J-r选项用于使 CD-ROM 能够在不同的系统上挂载,有关更多信息,请参见 man 手册。之后,可以使用带有适当选项的 cdrecord 工具创建 CD。

[rose@blob recordables] cdrecord -dev 0,0,0 -speed=8 cd.iso
Cdrecord 1.10 (i686-pc-linux-gnu) (C) 1995-2001 Joerg Schilling
scsidev: '0,0,0'
scsibus: 0 target: 0 lun: 0
Linux sg driver version: 3.1.20
Using libscg version 'schily-0.5'
Device type    : Removable CD-ROM
Version        : 0
Response Format: 1
Vendor_info    : 'HP      '
Identification : 'CD-Writer+ 8100 '
Revision       : '1.0g'
Device seems to be: Generic mmc CD-RW.
Using generic SCSI-3/mmc CD-R driver (mmc_cdr).
Driver flags   : SWABAUDIO
Starting to write CD/DVD at speed 4 in write mode for single session.
Last chance to quit, starting real write in 0 seconds. 
Operation starts.

根据您的 CD 刻录机,您现在有时间抽烟^H^H^H^H^H吃一块健康的水果和/或喝一杯咖啡。完成任务后,您将收到一条确认消息。

Track 01: Total bytes read/written: 341540864/341540864 
          (166768 sectors).

有一些图形化工具可以简化此过程。其中一个流行的工具是 xcdroast,可以从 X-CD-Roast 网站免费获得,并且包含在大多数系统和 GNU 目录中。KDE 和 Gnome 桌面管理器都具有制作自己的 CD 的功能。


9.2.3. 在/从 jazz 驱动器、USB 设备和其他可移动设备上备份

这些设备通常挂载到文件系统中。挂载过程完成后,它们可以像普通目录一样访问,因此可以使用标准命令来操作文件。

在下面的示例中,图像从 USB 摄像头复制到硬盘。

robin:~> mount /mnt/camera

robin:~> mount | grep camera
/dev/sda1 on /mnt/camera type vfat (rw,nosuid,nodev)

如果摄像头是您连接到系统的唯一 USB 存储设备,则这是安全的。但请记住,USB 设备在/dev中分配条目,因为它们已连接到系统。因此,如果您首先将 USB 闪存驱动器连接到您的系统,它将位于/dev/sda条目上,如果您之后连接摄像头,它将被分配到/dev/sdb- 假设您没有任何 SCSI 磁盘,它们也在/dev/sd*上。在较新的系统上,自从内核 2.6 以来,一个名为 HAL(硬件抽象层)的热插拔系统可确保用户不必处理此负担。如果要检查您的设备在哪里,请在插入设备后键入 dmesg

您现在可以复制文件了。

robin:~> cp -R /mnt/camera/* images/

robin:~> umount /mnt/camera

同样,jazz 驱动器可以挂载在/mnt/jazz.

应在/etc/modules.conf/etc/fstab中添加适当的行以使其工作。有关更多信息,请参阅特定的硬件 HOWTO。在使用 2.6.x 或更高版本的内核的系统上,您可能还需要查看 modprobemodprobe.conf.


的 man 手册。

9.2.4. 使用磁带设备备份数据/dev/st0. 关于磁带备份已经写了很多书,因此,请参阅附录 B 中的阅读清单以获取更多信息。请记住,由于数据库的架构,可能需要其他备份程序。

适当的备份命令通常放在 *cron* 目录之一中,以便定期执行它们。在较大的环境中,可以实施免费提供的 Amanda 备份套件或商业解决方案来备份多台机器。但是,使用磁带是一项系统管理任务,超出了本文档的范围。


9.2.5. 您的发行版中的工具

大多数 Linux 发行版都提供自己的工具来简化您的生活。一个简短的概述:

  • SuSE: YaST 现在包括扩展的备份和恢复模块。

  • RedHat: File Roller 工具提供对(压缩)归档文件的可视化管理。他们似乎更喜欢使用 X-CD-Roast 工具将备份移动到外部设备。

  • Mandrake: X-CD-Roast。

  • 大多数发行版都带有 BSD dumprestore 实用程序,用于备份 *ext2* 和 *ext3* 文件系统。此工具可以写入各种设备,并将文件或文件系统逐位转储到指定的设备上。像 dd 一样,这允许备份特殊文件类型,例如/dev.


9.3. 使用 rsync

9.3.1. 介绍

rsync 程序是一个快速而灵活的远程备份工具。它在 UNIX 和类 UNIX 系统上很常见,易于配置并在脚本中使用。虽然 rsync 中的 *r* 代表 “remote”(远程),但您不需要过于字面地理解这一点。您的 “remote”(远程)设备可能只是一个 USB 存储设备或硬盘上的另一个分区,您不需要两台独立的机器。


9.3.2. 一个例子:使用 rsync 备份到 USB 存储设备

正如第 3.1.2.3 节中所讨论的,我们首先必须挂载该设备。可能应该以 *root* 身份完成此操作。

root@theserver# mkdir /mnt/usbstore

root@theserver# mount -t vfat /dev/sda1 /mnt/usbstore

Note用户友好
 

越来越多的发行版允许非特权用户访问可移动设备,并自动挂载 USB 设备、CD-ROM 和其他可移动设备。

请注意,此指南需要您的系统上安装 USB 支持。如果此操作不起作用,请参阅 USB 指南以获取帮助。使用 dmesg 检查/dev/sda1是否确实是要挂载的设备。

然后您可以开始实际的备份,例如备份/home/karl目录

karl@theserver:~> rsync -avz /home/karl/ /mnt/usbstore

像往常一样,请参阅 man 手册以获取更多信息。


9.4. 加密

9.4.1. 一般说明

9.4.1.1. 为什么应该加密数据?

加密是保密的同义词。在备份的上下文中,加密非常有用,例如,如果您需要将备份的数据放在您无法控制访问权限的地方,例如您的提供商的服务器。

除此之外,加密也可以应用于电子邮件:通常,邮件是不加密的,并且通常通过网络或互联网以开放形式发送。如果您的消息包含敏感信息,最好对其进行加密。


9.4.1.2. GNU Privacy Guard

在 Linux 系统上,您会发现 GnuPG,即 GNU Privacy Guard,这是一套与 PGP(Pretty Good Privacy)工具兼容的程序,这些工具是商业上可用的。

在本指南中,我们将仅讨论加密工具的非常简单的用法,并说明您需要什么才能生成加密密钥并使用它为您自己加密数据,然后您可以将其安全地存储在公共场所。有关更多高级用法说明,请参见各种命令的 man 手册。


9.4.2. 生成密钥

在开始加密数据之前,您需要创建一对密钥。该对密钥由一个私钥和一个公钥组成。您可以将公钥发送给对应的用户,他们可以使用它为您加密数据,然后您可以使用私钥解密这些数据。您始终保留私钥,切勿与其他人共享,否则他们将能够解密仅供您使用的数据。为了确保不会发生意外,私钥受到密码保护。密钥对是使用以下命令创建的:

willy@ubuntu:~$ gpg --key-gen
gpg (GnuPG) 1.4.2.2; Copyright (C) 2005 Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions.  See the file COPYING for details.

gpg: directory `/home/willy.gnupg' created
gpg: new configuration file `/home/willy/.gnupg/gpg.conf' created
gpg: WARNING: options in `/home/willy/.gnupg/gpg.conf' are not yet
 active during this run
gpg: keyring `/home/willy/.gnupg/secring.gpg' created
gpg: keyring `/home/willy/.gnupg/pubring.gpg' created
Please select what kind of key you want:
    (1) DSA and Elgamal (default)
    (2) DSA (sign only)
    (5) RSA (sign only)
Your selection? 1
DSA keypair will have 1024 bits.
ELG-E keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096
Requested keysize is 4096 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n month
      <n>y = key expires in n years
Key is valid for? (0) 0
Key does not expire at all
Is this correct? (y/N) y

You need a user ID to identify your key; the software constructs the
user ID from the Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

Real name: Willy De Wandel
Email address: wdw@mvg.vl
Comment: Willem
You selected this USER-ID:
    "Willy De Wandel (Willem) <wdw@mvg.vl>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
You need a Passphrase to protect your secret key.
					 
Passphrase:

现在输入您的密码。它可以是一个短语,越长越好,唯一的条件是您应该能够始终记住它。为了验证,您需要再次输入相同的短语。

现在,密钥对由一个生成随机数的程序生成,该程序还接收系统的活动数据等因素。因此,现在启动一些程序,移动鼠标光标或在终端窗口中键入一些随机字符是一个好主意。这样,生成包含大量不同数字的数字的机会将更大,并且密钥将更难破解。


9.4.3. 关于您的密钥

创建密钥后,您将收到一条关于指纹的消息。这是一串 40 个十六进制数字,非常长,因此在任何计算机上两次生成相同的密钥都非常非常困难。您可以相当肯定这是一个唯一的序列。此密钥的简短形式包括您的姓名,后跟最后 8 个十六进制数字。

您可以通过以下方式获取有关密钥的信息

willy@ubuntu:~$ gpg --list-keys
/home/willy/.gnupg/pubring.gpg
------------------------------
pub     1024D/BF5C3DBB 2006-08-08
uid                    Willy De Wandel (Willem) <wdw@mvg.vl>
sub     4096g/A3449CF7 2006-08-08

此密钥的 密钥 ID "BF5C3DBB"。您可以将您的密钥 ID 和姓名发送到密钥服务器,以便其他人可以获取您的信息并使用它来加密您的数据。或者,您可以将您的公钥直接发送给需要它的人。您密钥的公共部分是使用--exportgpg 命令的选项时看到的长串数字

gpg--export -a

但是,就本指南而言,我们假设您只需要您的密钥来加密和解密您自己的数据。如果您想了解更多信息,请阅读 gpg 手册页。


9.4.4. 加密数据

现在您可以加密一个.tar归档文件或压缩归档文件,然后再将其保存到备份介质或传输到备份服务器。使用 gpg 命令,如下所示

gpg-e -r uid 的(一部分) 存档

ls-e选项告诉 gpg 进行加密,-r选项指示为谁加密。请记住,只有此-r选项后面的用户名才能再次解密数据。一个例子

willy@ubuntu:~$ gpg -e -r Willy /var/tmp/home-willy-20060808.tar

9.4.5. 解密文件

使用-d选项,您可以解密为您加密的文件。数据将在屏幕上滚动,但加密副本将保留在磁盘上。因此,对于纯文本以外的文件格式,您需要保存解密后的数据,以便可以使用相应的程序查看它们。这是使用-ogpg 命令的选项时看到的长串数字

willy@ubuntu:~$ gpg -d -o /var/tmp/home-willy-decrypt.tar /var/tmp/home-willy-20060808.tar.gpg

You need a passphrase to unlock the secret key for
user: "Willy De Wandel (Willem) <wdw@mvg.vl>"
4096 ELG-E key, ID A3449CF7, created 2006-08-08 (main key ID BF5C3DBB)

gpg: encrypted with 4096-bit ELG-E key, ID A3449CF7, created 2006-08-08
        "Willy De Wandel (Willem) <wdw@mvg.vl>"

Warning没有密码=没有数据
 

如果您不记得密码,数据将会丢失。即使是系统管理员也无法解密数据。这就是为什么重要密钥的副本有时会保存在银行的密封金库中。


9.5. 摘要

以下是涉及文件备份的命令列表

表 9-1. 第 9 章中的新命令:备份

命令含义
bzip2一种块排序文件压缩器。
cdrecord从母盘录制音频或数据光盘。
dd转换和复制文件
fdformat对软盘进行低级格式化。
gpg加密和解密数据。
gzip压缩或解压缩文件。
mcopy将 MSDOS 文件复制到/从 UNIX 复制。
mdir显示 MSDOS 目录。
mformat将 MSDOS 文件系统添加到低级格式化的软盘。
mkbootdisk为运行的系统创建独立的引导软盘。
mount挂载文件系统(通过将其连接到挂载点将其与当前文件系统集成)。
rsync同步目录。
tar磁带归档实用程序,也用于在磁盘而不是磁带上进行归档。
umount卸载文件系统。

9.6. 练习

  • /var/tmp中使用 tar 命令创建您的主目录的备份副本。然后使用 gzipbzip2 进一步压缩该文件。使其成为一个干净的 tar 文件,一个在解包时不会造成混乱的文件。

  • 格式化软盘并将主目录中的一些文件放到其中。与其他学员交换软盘,并在您的主目录中恢复他/她的软盘。

  • DOS 格式化软盘。使用 mtools 在其上放置和删除文件。

  • 当您想要将未格式化的软盘挂载到文件系统中时会发生什么?

  • 如果您有任何 USB 存储设备,请尝试将文件放到其中。

  • 使用 rsync,将您的主目录的副本复制到另一个本地或远程文件系统。

  • 当将文件留在网络服务器上时,最好对它们进行加密。创建一个tar您的主目录的存档并对其进行加密。


第 10 章。 网络

在网络方面,Linux 是您的首选操作系统,不仅因为网络与操作系统本身紧密集成,并且有各种各样的免费工具和应用程序可用,而且还因为在开源项目中经过多年的调试和测试后才能实现的重负载下的健壮性。

关于 Linux 和网络已经写满了书架的信息,但我们将尝试在本章中给出一个概述。完成本章后,您将了解更多关于

  • 支持的网络协议

  • 网络配置文件

  • 用于配置和探测网络的命令

  • 启用不同网络应用程序的守护进程和客户端程序

  • 文件共享和打印

  • 远程执行命令和应用程序

  • 基本网络互连

  • 安全执行远程应用程序

  • 防火墙和入侵检测


10.1. 网络概述

10.1.1. OSI 模型

简而言之,协议是一组用于通信的规则。

为了通过网络获取数据,例如从您的计算机到世界另一端的某台计算机的电子邮件,需要大量的不同硬件和软件协同工作。

所有这些硬件和不同的软件程序都使用不同的语言。想象一下您的电子邮件程序:它能够通过特定的协议与计算机操作系统通信,但它无法与计算机硬件通信。我们需要操作系统中的一个特殊程序来执行此功能。反过来,计算机需要能够与电话线或其他 Internet 连接方法进行通信。在幕后,网络连接硬件需要能够进行通信,以便将您的电子邮件从一个设备传递到另一个设备,一直到目标计算机。

所有这些不同类型的通信协议都分为 7 层,它们被称为开放系统互连参考模型,简称 OSI 模型。为了便于理解,该模型简化为 4 层协议描述,如下表所述

表 10-1. 简化的 OSI 模型

层名称层协议
应用层HTTP, DNS, SMTP, POP, ...
传输层TCP, UDP
网络层IP, IPv6
网络接入层PPP, PPPoE, 以太网

每一层只能使用其下层的特性;每一层只能将其特性导出到其上层。换句话说:各层仅与相邻层通信。让我们再次以您的电子邮件消息为例:您通过应用层输入它。在您的计算机中,它向下传输到传输层和网络层。您的计算机通过网络接入层将其放置在网络上。这也是将在世界各地移动消息的层。在目标端,接收计算机将通过其自身的网络层接受消息,并将使用传输层和应用层将其显示给接收者。

Note它真的要复杂得多
 

包含以上和以下部分是因为您迟早会遇到一些网络术语;它们将为您提供一些起点,如果您想了解详细信息。


10.1.2. 一些流行的网络协议

Linux 支持许多不同的网络协议。我们只列出最重要的


10.1.2.1. TCP/IP

传输控制协议互联网协议是在 Internet 上进行通信的两种最流行的方式。许多应用程序,例如您的浏览器和电子邮件程序,都构建在此协议套件之上。

简单地说,IP 提供了一种解决方案,用于将信息包从一台机器发送到另一台机器,而 TCP 确保数据包以流的形式排列,以便来自不同应用程序的数据包不会混淆,并且数据包以正确的顺序发送和接收。

有关 TCP 和 IP 的更多信息的良好起点是以下文档

  • man 7 ip:描述 Linux 上的 IPv4 协议实现(当前版本 4 是 IP 协议最广泛使用的版本)。

  • man 7 tcp:TCP 协议的实现。

  • TCP 的 RFC793、RFC1122、RFC2001,以及 IP 的 RFC791、RFC1122 和 RFC1112。

    Request For Comments 文档包含网络标准、协议、应用程序和实现的描述。这些文档由 Internet 工程任务组管理,该任务组是一个国际社区,致力于 Internet 的平稳运行以及 Internet 体系结构的演进和发展。

    您的 ISP 通常会提供 RFC 存档,或者您可以通过 http://www.ietf.org/rfc.html 浏览 RFC。


10.1.2.2. TCP/IPv6

没有人预料到 Internet 会增长如此之快。当网络中存在大量计算机时,IP 被证明存在一些缺点,其中最重要的是可用于分配给参与的每台机器的唯一地址的可用性。因此,设计了 IP 版本 6 以满足当今 Internet 的需求。

不幸的是,并非所有应用程序和服务都支持 IPv6。目前正在许多可以从升级到 IPv6 中受益的环境中启动迁移。对于某些应用程序,仍然使用旧协议,对于已经重新设计的应用程序,新版本已经处于活动状态。因此,当检查您的网络配置时,有时可能会有点令人困惑,因为可以采取各种措施来隐藏一个协议,以免两者混合连接。

更多信息可以在以下文档中找到

  • man 7 ipv6:Linux IPv6 协议实现。

  • RFC1883 描述了 IPv6 协议。


10.1.2.3. PPP, SLIP, PLIP, PPPOE

Linux 内核内置支持 PPP (点对点协议)、SLIP (串行线路 IP)、PLIP (并行线路 IP) 和基于以太网的 PPPP。 PPP 是个人用户访问其 ISP (互联网服务提供商) 最常用的方式,尽管在人口稠密的地区,它通常被 PPPOE 取代,PPPOE 是用于 ADSL (非对称数字用户线路) 连接的协议。

大多数 Linux 发行版都提供易于使用的工具来设置 Internet 连接。 您基本上只需要一个用户名和密码来连接到您的互联网服务提供商 (ISP),以及在使用 PPP 的情况下需要一个电话号码。 这些数据输入到图形配置工具中,该工具很可能还允许启动和停止与您的提供商的连接。


10.1.2.4. ISDN

Linux 内核具有内置的 ISDN 功能。 Isdn4linux 控制 ISDN PC 卡,并可以使用 Hayes 命令集("AT" 命令)模拟调制解调器。 功能范围从简单地使用终端程序到完全连接到 Internet。

请查看您的系统文档。


10.1.2.5. AppleTalk

Appletalk 是 Apple 的互联网协议栈的名称。 它允许点对点网络模型,提供诸如文件和打印机共享等基本功能。 每台机器都可以同时充当客户端和服务器,并且每台 Apple 计算机都包含必要的软件和硬件。

Linux 提供完整的 AppleTalk 网络功能。 Netatalk 是 AppleTalk 协议套件的内核级实现,最初用于基于 BSD 的系统。 它包括支持路由 AppleTalk、使用 AppleShare 服务 UNIX 和 AFS 文件系统以及服务 UNIX 打印机和访问 AppleTalk 打印机。


10.1.2.6. SMB/NMB

为了与 MS Windows 环境兼容,可以在任何类 UNIX 系统上安装 Samba 套件,包括对 NMB 和 SMB 协议的支持。 服务器消息块协议(也称为会话消息块、NetBIOS 或 LanManager 协议)在 MS Windows 3.11、NT、95/98、2K 和 XP 上用于共享磁盘和打印机。

Samba 套件的基本功能是:与 Windows 机器共享 Linux 驱动器,从 Linux 机器访问 SMB 共享,与 Windows 机器共享 Linux 打印机,以及与 Linux 机器共享 Windows 打印机。

大多数 Linux 发行版都提供一个 *samba* 软件包,它完成了大部分服务器设置,并在默认情况下在启动时启动 smbd(Samba 服务器)和 nmbd(netbios 名称服务器)。 Samba 可以通过图形界面、Web 界面或通过命令行和文本配置文件进行配置。 这些守护程序使 Linux 机器在 MS Windows 我的网络位置/网上邻居窗口中显示为 MS Windows 主机; 来自 Linux 机器的共享与 MS Windows 环境中任何其他主机上的共享没有区别。

有关更多信息,请访问以下位置

  • man smb.conf:描述了主要的 Samba 配置文件的格式。

  • Samba 项目文档(或检查您的本地 samba.org 镜像)包含一个易于阅读的安装和测试指南,其中还解释了如何将您的 Samba 服务器配置为主域控制器。 所有手册页也在这里提供。


10.1.2.7. 杂项协议

Linux 还支持业余无线电、WAN 互联网 (X25、帧中继、ATM)、红外线和其他无线连接,但由于这些协议通常需要特殊的硬件,因此我们不会在本文档中讨论它们。


10.2. 网络配置和信息

10.2.1. 网络接口配置

所有大型、用户友好的 Linux 发行版都带有各种图形工具,可以轻松地在本地网络中设置计算机,将其连接到互联网服务提供商或进行无线访问。 这些工具可以从命令行或菜单启动

  • Ubuntu 配置通过选择 系统->管理->网络 完成。

  • RedHat Linux 带有 redhat-config-network,它具有图形和文本模式界面。

  • Suse 的 YAST 或 YAST2 是一种多合一的配置工具。

  • Mandrake/Mandriva 带有网络和 Internet 配置向导,最好从 Mandrake 的控制中心启动。

  • 在 Gnome 系统上:gnome-network-preferences

  • 在 KDE 系统上:knetworkconf

您的系统文档提供了大量关于工具的可用性和使用的建议和信息。

您需要提供的信息

  • 用于连接到本地网络,例如与您的家用计算机连接,或者在工作场所:主机名、域名和 IP 地址。 如果您想设置自己的网络,最好先多读一些资料。 在工作中,此信息很可能在您启动计算机时自动提供给您的计算机。 如有疑问,最好不要指定任何信息,而不是编造信息。

  • 用于连接到 Internet:您的 ISP 的用户名和密码,以及使用调制解调器时的电话号码。 您的 ISP 通常会自动为您分配一个 IP 地址以及您的 Internet 应用程序工作所需的所有其他内容。


10.2.2. 网络配置文件

图形助手工具编辑一组特定的网络配置文件,使用几个基本命令。 配置文件的确切名称及其在文件系统中的位置很大程度上取决于您的 Linux 发行版和版本。 但是,几个网络配置文件在所有 UNIX 系统上都是通用的


10.2.2.1. /etc/hosts

ls/etc/hosts文件始终包含 *localhost* IP 地址 127.0.0.1,该地址用于进程间通信。 永远不要删除此行! 有时包含其他主机的地址,这些主机可以在不使用外部命名服务(例如 DNS(域名服务器))的情况下进行联系。

一个小家庭网络的示例hosts文件

# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1       localhost.localdomain   localhost
192.168.52.10	tux.mylan.com		tux
192.168.52.11	winxp.mylan.com		winxp

man hosts 中阅读更多内容。


10.2.2.2. /etc/resolv.conf

ls/etc/resolv.conf文件配置对 DNS 服务器的访问,请参阅 第 10.3.7 节。 此文件包含您的域名和要联系的名称服务器。

search mylan.com
nameserver 193.134.20.4

resolv.conf手册页中阅读更多内容。


10.2.2.3. /etc/nsswitch.conf

ls/etc/nsswitch.conf文件定义了联系不同名称服务的顺序。 对于 Internet 使用,重要的是 *dns* 出现在 "hosts" 行中。

[bob@tux ~] grep hosts /etc/nsswitch.conf
hosts:	files dns

这指示您的计算机首先在/etc/hosts文件中查找主机名和 IP 地址,并且如果给定主机未出现在本地hosts文件中,则联系 DNS 服务器。 其他可以联系的名称服务包括 LDAP、NIS 和 NIS+。

更多内容请参见 man nsswitch.conf


10.2.3. 网络配置命令

10.2.3.1. ip 命令

特定于发行版的脚本和图形工具是 ip(或旧系统上的 ifconfigroute)的前端,用于显示和配置内核的网络配置。

ip 命令用于为接口分配 IP 地址,设置到 Internet 和其他网络的路由,显示 TCP/IP 配置等等。

以下命令显示 IP 地址和路由信息

benny@home benny> ip addr show
1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
    inet6 ::1/128 scope host 
2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 100
    link/ether 00:50:bf:7e:54:9a brd ff:ff:ff:ff:ff:ff
    inet 192.168.42.15/24 brd 192.168.42.255 scope global eth0
    inet6 fe80::250:bfff:fe7e:549a/10 scope link 

benny@home benny> ip route show
192.168.42.0/24 dev eth0  scope link 
127.0.0.0/8 dev lo  scope link 
default via 192.168.42.1 dev eth0 

需要注意的事项

  • 两个网络接口,即使在只有一个网络接口卡的系统上也是如此:"lo" 是本地环回,用于内部网络通信;"eth0" 是一个 *real* 接口的常用名称。 永远不要更改本地环回配置,否则您的机器将开始出现故障! 无线接口通常定义为 "wlan0";调制解调器接口定义为 "ppp0",但可能还有其他名称。

  • IP 地址,标记为 "inet":本地环回始终具有 127.0.0.1,物理接口可以具有任何其他组合。

  • 您的接口的硬件地址(可能需要作为连接到网络进行身份验证过程的一部分)标记为 "ether"。 本地环回具有 6 对全零,物理环回具有 6 对十六进制字符,其中前 3 对是特定于供应商的。


10.2.3.2. ifconfig 命令

虽然 ip 是配置 Linux 系统的最新方法,但 ifconfig 仍然非常流行。 使用它不带选项来显示网络接口信息

els@asus:~$ /sbin/ifconfig
eth0      Link encap:Ethernet  HWaddr 00:50:70:31:2C:14
          inet addr:60.138.67.31  Bcast:66.255.255.255  Mask:255.255.255.192
          inet6 addr: fe80::250:70ff:fe31:2c14/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:31977764 errors:0 dropped:0 overruns:0 frame:0
          TX packets:51896866 errors:0 dropped:0 overruns:0 carrier:0
          collisions:802207 txqueuelen:1000
          RX bytes:2806974916 (2.6 GiB)  TX bytes:2874632613 (2.6 GiB)
          Interrupt:11 Base address:0xec00
										lo        Link encap:Local Loopback
	  inet addr:127.0.0.1  Mask:255.0.0.0
	  inet6 addr: ::1/128 Scope:Host
	  UP LOOPBACK RUNNING  MTU:16436  Metric:1
	  RX packets:765762 errors:0 dropped:0 overruns:0 frame:0
	  TX packets:765762 errors:0 dropped:0 overruns:0 carrier:0
	  collisions:0 txqueuelen:0
	  RX bytes:624214573 (595.2 MiB)  TX bytes:624214573 (595.2 MiB)

在这里,我们还注意到接口配置的最重要方面

  • IP 地址标记为 "inet addr"

  • 硬件地址跟在 "HWaddr" 标记后面。

ifconfigip 都显示更详细的配置信息以及关于每个接口的许多统计信息,也许最重要的是,它是否 "UP""RUNNING"


10.2.3.3. PCMCIA 命令

在您的笔记本电脑上,您通常使用板载以太网连接连接到公司网络,但现在您需要在家里或酒店配置拨号连接,您可能需要激活 PCMCIA 卡。 这可以使用 cardctl 控制实用程序或较新发行版上的 pccardctl 来完成。

一个使用示例

cardctlinsert

现在可以使用图形界面或命令行界面来配置该卡。 在取出卡之前,请使用此命令

cardctleject

但是,一个好的发行版应该在网络配置工具中提供 PCMCIA 支持,从而防止用户必须手动执行 PCMCIA 命令。


10.2.3.4. 更多信息

对网络配置的进一步讨论超出了本文档的范围。 您的额外信息的主要来源是您要设置的服务的手册页。 补充阅读

  • Modem-HOWTO:帮助选择、连接、配置、解决问题以及理解 PC 的模拟调制解调器。

  • LDP HOWTO 索引,第 4.4 节:按照类别排列的关于通用网络、协议、拨号、DNS、VPN、桥接、路由、安全等等的 HOWTO 文档。

  • 大多数系统都有一个版本的ip-cref文件(使用 locate 命令来查找);这个文件的 PS 格式可以通过例如 gv 来查看。


10.2.4. 网络接口名称

在 Linux 机器上,设备名称 lo 或者 local loop (本地回环)与内部地址 127.0.0.1 相关联。如果这个设备不存在,计算机很难让你的应用程序工作;它总是存在的,即使在没有联网的计算机上。

第一个以太网设备,在标准的网络接口卡的情况下,是 eth0,指向你的本地 LAN IP 地址。普通的客户端机器只有一个网络接口卡。连接网络的路由器,为每个它服务的网络都有一个网络设备。

如果你使用调制解调器连接到互联网,你的网络设备很可能被命名为 ppp0

还有很多其他的名称,例如用于虚拟专用网络接口 (VPN) 的名称,而且多个接口可以同时激活,所以当没有使用选项时,ifconfig 或者 ip 命令的输出可能会非常多。甚至相同类型的多个接口也可以激活。在这种情况下,它们会被顺序编号:第一个将会得到数字 0,第二个将会得到后缀 1,第三个将会得到 2,等等。这种情况在许多应用程序服务器、具有故障转移配置的机器、路由器、防火墙以及许多其他机器上都会发生。


10.2.5. 使用 netstat 检查主机配置

除了使用 ip 命令来显示网络配置之外,还有一个常见的 netstat 命令,它有很多选项,并且在任何 UNIX 系统上通常都很有用。

可以使用-nr选项来显示路由信息,这个选项属于 netstat 命令。

bob:~> netstat -nr
Kernel IP routing table
Destination  Gateway      Genmask       Flags MSS Window irtt Iface
192.168.42.0 0.0.0.0      255.255.255.0 U      40 0         0 eth0
127.0.0.0    0.0.0.0      255.0.0.0     U      40 0         0 lo
0.0.0.0      192.168.42.1 0.0.0.0       UG     40 0         0 eth0

这是一个典型的 IP 网络中的客户端机器。它只有一个网络设备,eth0lo 接口是本地回环。

Note现代方法
 

从你的系统中获取这些信息的新方法是使用 ip 命令。

iproute show

当这台机器尝试联系一个位于另一个网络上的主机时,通过以 0.0.0.0 开头的行可以判断,它会将连接请求发送到 IP 地址为 192.168.42.1 的机器(路由器),并且它将使用其主接口 eth0 来执行此操作。

位于同一网络上的主机,通过以 192.168.42.0 开头的行可以判断,也将通过主网络接口进行联系,但不需要路由器,数据只是放在网络上。

机器可以拥有比这更复杂的路由表,其中有很多不同的 "目的地-网关" 对来连接到不同的网络。如果你有机会连接到应用程序服务器,例如在工作中,检查路由信息会很有教育意义。


10.2.6. 其他主机

大量的工具专注于 Linux 机器的网络管理和远程管理。你的本地 Linux 软件镜像会提供很多这些工具。在这个文档中讨论它们会让我们偏离主题太远,所以请参考特定程序的文档。

在本节中,我们将只讨论一些常见的 UNIX/Linux 文本工具。


10.2.6.1. host 命令

要显示关于主机或域的信息,可以使用 host 命令。

[emmy@pc10 emmy]$ host www.eunet.be
www.eunet.be. has address 193.74.208.177

[emmy@pc10 emmy]$ host -t any eunet.be
eunet.be. SOA dns.eunet.be. hostmaster.Belgium.EU.net. 
  2002021300 28800 7200 604800 86400
eunet.be. mail is handled by 50 pophost.eunet.be.
eunet.be. name server ns.EU.net.
eunet.be. name server dns.eunet.be.

可以使用 dig 命令来显示类似的信息,它会提供关于记录如何存储在名称服务器中的额外信息。


10.2.6.2. ping 命令

要检查主机是否存活,可以使用 ping。如果你的系统配置为发送多个数据包,使用 Ctrl+C 组合键来中断 ping

[emmy@pc10 emmy]$ ping a.host.be 
PING a.host.be (1.2.8.3) from 80.20.84.26: 56(84) bytes of data.
64 bytes from a.host.be(1.2.8.3):icmp_seq=0 ttl=244 time=99.977msec
--- a.host.be ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max/mdev = 99.977/99.977/99.977/0.000 ms

10.2.6.3. traceroute 命令

要检查数据包到网络主机所遵循的路由,可以使用 traceroute 命令。

[emmy@pc10 emmy]$ /usr/sbin/traceroute www.eunet.be
traceroute to www.eunet.be(193.74.208.177),30 hops max,38b packets
1 blob (10.0.0.1)  
       0.297ms  0.257ms  0.174ms
2 adsl-65.myprovider.be (217.136.111.1) 
       12.120ms 13.058ms 13.009ms
3 194.78.255.177 (194.78.255.177)  
       13.845ms 14.308ms 12.756ms
4 gigabitethernet2-2.intl2.gam.brussels.skynet.be (195.238.2.226)
       13.123ms 13.164ms 12.527ms
5 pecbru2.car.belbone.be (194.78.255.118) 
       16.336ms 13.889ms 13.028ms
6 ser-2-1-110-ias-be-vil-ar01.kpnbelgium.be (194.119.224.9)
       14.602ms 15.546ms 15.959ms
7 unknown-195-207-939.eunet.be (195.207.93.49) 
       16.514ms 17.661ms 18.889ms
8 S0-1-0.Leuven.Belgium.EU.net (195.207.129.1) 
       22.714ms 19.193ms 18.432ms
9 dukat.Belgium.EU.net (193.74.208.178) 22.758ms * 25.263ms

在某些系统上,traceroute 已经重命名为 tracepath


10.2.6.4. whois 命令

可以使用 whois 命令来查询特定的域名信息,就像很多 whois 服务器所解释的那样,比如下面的这个。

[emmy@pc10 emmy]$ whois cnn.com
[whois.crsnic.net]

Whois Server Version 1.3

	$<--snap server message-->

   Domain Name: CNN.COM
   Registrar: NETWORK SOLUTIONS, INC.
   Whois Server: whois.networksolutions.com
   Referral URL: http://www.networksolutions.com
   Name Server: TWDNS-01.NS.AOL.COM
   Name Server: TWDNS-02.NS.AOL.COM
   Name Server: TWDNS-03.NS.AOL.COM
   Name Server: TWDNS-04.NS.AOL.COM
   Updated Date: 12-mar-2002
>>> Last update of whois database: Fri, 5 Apr 2002 05:04:55 EST <<<

The Registry database contains ONLY .COM, .NET, .ORG, .EDU domains
and Registrars.

[whois.networksolutions.com]

        $<--snap server message-->

Registrant:
Turner Broadcasting (CNN-DOM)
   1 CNN Center
   Atlanta, GA 30303

   Domain Name: CNN.COM

   Administrative Contact:
        $<--snap contactinfo-->   
   Technical Contact:
        $<--snap contactinfo-->   
   Billing Contact:
	$<--snap contactinfo-->
   Record last updated on 12-Mar-2002.
   Record expires on 23-Sep-2009.
   Record created on 22-Sep-1993.
   Database last updated on 4-Apr-2002 20:10:00 EST.

   Domain servers in listed order:

   TWDNS-01.NS.AOL.COM		149.174.213.151
   TWDNS-02.NS.AOL.COM		152.163.239.216
   TWDNS-03.NS.AOL.COM		205.188.146.88
   TWDNS-04.NS.AOL.COM		64.12.147.120

对于 .com、.net、.org 和 .edu 之外的域名,你可能需要指定 whois 服务器,例如这个用于 .be 域名的服务器。

whoisdomain.be@whois.dns.be


10.3. 互联网/内联网应用

Linux 系统是一个提供网络服务的绝佳平台。在本节中,我们将尝试概述最常见的网络服务器和应用程序。


10.3.1. 服务器类型

10.3.1.1. 独立服务器

向用户提供服务可以通过两种方式进行。守护程序或服务可以以独立模式运行,或者它可以依赖于另一个服务来激活。

经常和/或持续使用的网络服务,通常以独立模式运行:它们是始终运行的独立程序守护程序。它们很可能在系统启动时启动,并且它们在特定的连接点或端口上等待请求,这些连接点或端口是它们被设置为监听的。当请求到达时,它会被处理,并且监听会持续到下一个请求。Web 服务器就是一个典型的例子:你希望它 24 小时可用,并且如果它太忙,它应该创建更多的监听实例来为同时访问的用户提供服务。其他的例子包括大型软件档案库,例如 Sourceforge 或者 你的 Tucows 镜像,它们必须每天处理数千个 FTP 请求。

你的家用电脑上的独立网络服务的一个例子可能是 named (名称守护程序),一个缓存名称服务器。独立服务有它们自己的进程在运行,你可以随时使用 ps 命令来检查。

bob:~> ps auxw | grep named
named   908  0.0  1.0 14876 5108 ?   S  Mar14  0:07 named -u named

然而,即使没有服务器进程为该服务运行,你也可以在你的 PC 上使用一些服务。例子包括 FTP 服务、安全复制服务或 finger 服务。这些服务有互联网守护程序 (inetd) 在它们的位置监听。


10.3.1.2. (x)inetd

在你的家用 PC 上,事情通常会平静一些。你可能有一个小型的网络,例如,你可能需要不时地将文件从一台 PC 传输到另一台 PC,使用 FTP 或 Samba(用于与 MS Windows 机器连接)。在这些情况下,启动你只需要偶尔使用的所有服务并让它们一直运行将是一种资源的浪费。所以在较小的设置中,你会发现必要的守护程序依赖于一个中心程序,该程序监听它负责的所有服务的端口。

这个超级服务器,互联网服务守护程序,在系统初始化时启动。有两种常见的实现:inetdxinetd(扩展的互联网服务守护程序)。其中一个通常在每个 Linux 系统上运行。

bob:~> ps -ef | grep inet
root  926   1 0 Mar14 ?   00:00:00 xinetd-ipv6 -stayalive -reuse \
-pidfile /var/run/xinetd.pid

互联网守护程序负责的服务列在其配置文件中,/etc/inetd.conf,对于 inetd,以及在目录/etc/xinetd.d对于 xinetd。常用的管理服务包括文件共享和打印服务、SSH、FTP、telnet、Samba 配置守护程序、talk 和 time 服务。

一旦收到连接请求,中心服务器将启动所需服务器的一个实例。因此,在下面的例子中,当用户 bob 启动一个到本地主机的 FTP 会话时,只要会话是活动的,就会有一个 FTP 守护程序在运行。

bob:~> ps auxw | grep ftp
bob     793  0.1  0.2  3960 1076 pts/6    S    16:44   0:00 ncftp localhost
ftp     794  0.7  0.5  5588 2608 ?        SN   16:44   0:00 ftpd: 
localhost.localdomain: anonymous/bob@his.server.com: IDLE

当然,当你打开到远程主机的连接时也会发生同样的事情:要么守护程序直接响应,要么远程的 (x)inetd 启动你需要的服务,并在你退出时停止它。


10.3.2. 邮件

10.3.2.1. 服务器

Sendmail 是 UNIX 平台的标准邮件服务器程序或邮件传输代理。它很健壮、可伸缩,并且当配置了适当的硬件时,可以轻松处理数千个用户。Sendmailsendmail-cf 包中包含了关于如何配置 Sendmail 的更多信息,你可能想阅读READMEREADME.cf文件,它们位于/usr/share/doc/sendmailman sendmailman aliases 也是很有用的。

Qmail 是另一个邮件服务器,由于它声称比 Sendmail 更安全,所以越来越受欢迎。虽然 Sendmail 是一个单体程序,但 Qmail 由更小的相互作用的程序部件组成,这些部件可以更好地保护。Postfix 是另一个越来越受欢迎的邮件服务器。

这些服务器处理邮件列表、过滤、病毒扫描等等。免费和商业扫描器可用于 Linux。邮件列表软件的例子有 MailmanListservMajordomoEZmlm。请查看你喜欢的病毒扫描器的网页,了解关于 Linux 客户端和服务器支持的信息。AmavisSpamassassin 是病毒扫描器和垃圾邮件扫描器的免费实现。


10.3.2.2. 远程邮件服务器

远程访问邮件最流行的协议是 POP3IMAP4。IMAP 和 POP 都允许离线操作,远程访问新邮件,并且它们都依赖于 SMTP 服务器来发送邮件。

虽然 POP 是一个简单的协议,易于实现并且几乎所有的邮件客户端都支持,但 IMAP 应该被优先选择,因为它:

  • 可以操作持久的消息状态标志。

  • 可以存储和获取邮件消息。

  • 可以访问和管理多个邮箱。

  • 支持并发更新和共享邮箱。

  • 也适合于访问 Usenet 消息和其他文档。

  • IMAP 可以在线和离线工作。

  • 它针对在线性能进行了优化,尤其是在低速链接上。


10.3.2.3. 邮件用户代理

有很多文本和图形化的 E-mail 客户端,我们只列出一些常见的。选择你喜欢的。

UNIX 的 mail 命令已经存在多年,甚至在网络存在之前就有了。它是一个简单的接口,用于将消息和小文件发送给其他用户,然后这些用户可以保存消息、重定向它、回复它等等。

虽然 mail 程序不再常用作客户端,但它仍然很有用,例如,可以将命令的输出通过邮件发送给某人。

mail < 简历.txt

elm 邮件阅读器是 mail 的一个非常需要的改进,pine (Pine Is Not ELM) 也是如此。mutt 邮件阅读器更新,并提供诸如线程之类的功能。

对于那些喜欢图形界面的邮件用户(以及患有网球肘或鼠标手的用户),有数百种选择。最受新用户欢迎的是 Mozilla Mail/Thunderbird,它具有简单的反垃圾邮件配置选项,以及 Evolution,即 MS Outlook 的克隆版本。Kmail 在 KDE 用户中很受欢迎。

图 10-1。Evolution 邮件和新闻阅读器

还有数十个可用的 Web 邮件应用程序,例如 SquirrelmailYahoo! 邮件、Google 的 gmailHotmail

可以通过 Linux Mail User HOWTO 获取概述。

大多数 Linux 发行版都包含 fetchmail,这是一个邮件检索和转发实用程序。它从远程邮件服务器(POP、IMAP 和其他一些服务器)获取邮件,并将其转发到您的本地传送系统。然后,您可以使用普通的邮件客户端处理检索到的邮件。它可以以守护进程模式运行,以指定的间隔重复轮询一个或多个系统。信息和用法示例可以在 Info 页面中找到;目录/usr/share/doc/fetchmail[-<version>]包含功能的完整列表和面向初学者的 FAQ。

procmail 过滤器可用于过滤收到的邮件、创建邮件列表、预处理邮件、选择性地转发邮件等等。附带的 formail 程序,可以生成自动回复和分割邮箱。Procmail 在 UNIX 和 Linux 机器上已经存在多年,是一个非常强大的系统,旨在即使在最坏的情况下也能工作。更多信息可以在/usr/share/doc/procmail[-<version>]目录和 man 页面中找到。

Note关于电子邮件礼仪的说明
 

现在有些人似乎认为电子邮件消息不应该太正式。当然,这取决于情况。如果您写信给不认识的人,最好保持一些距离,就像您在传统信件中所做的那样。并且不要忘记:你不认识的人可能是男性或女性...


10.3.3. 网站

10.3.3.1. Apache Web 服务器

Apache 是目前最流行的 Web 服务器,在超过一半的 Internet Web 服务器上使用。大多数 Linux 发行版都包含 ApacheApache 的优势包括其模块化设计、SSL 支持、稳定性和速度。在适当的硬件和配置下,它可以支持最高的负载。

在 Linux 系统上,服务器配置通常在/etc/httpd目录下完成。最重要的配置文件是httpd.conf;它相当不言自明。如果您需要帮助,可以在 httpd 的 man 页面或 Apache 网站上找到。


10.3.3.2. Web 浏览器

Linux 平台存在许多 Web 浏览器,包括免费的和商业的。Netscape Navigator 作为唯一不错的选择早已成为过去,因为 Mozilla/Firefox 提供了一个具有竞争力的替代方案,可在许多其他操作系统上运行,例如 MS Windows 和 MacOS X。

Amaya 是 W3C 浏览器。Opera 是一款商业浏览器,紧凑而快速。许多桌面管理器都在其文件管理器中提供 Web 浏览功能,例如 nautilus

流行的文本浏览器包括 lynxlinks。您可能需要在您的 shell 中定义代理服务器,方法是设置适当的变量。当没有图形环境可用时(例如在脚本中使用时),文本浏览器速度快且方便。


10.3.3.3. 代理服务器

10.3.3.3.1. 什么是代理服务器?

公司和组织通常希望他们的用户使用代理服务器。特别是在用户众多的环境中,代理服务器可以更快地下载网页。代理服务器存储网页。当用户请求之前已请求过的网页时,代理服务器将直接将该网页提供给用户,这样他/她就不需要从 Internet 获取该网页,这将花费更长的时间。当然,可以采取措施,以便代理服务器进行快速检查并始终提供页面的最新版本。在某些环境中,必须使用代理服务器,而在其他环境中,您可以选择是否使用它。


10.3.3.3.2. 代理配置

如果您有代理服务器名称和端口,那么将这些信息输入到您的浏览器中应该非常明显。但是,许多(命令行)应用程序依赖于变量http_proxyftp_proxy才能正常工作。为了您的方便,您可能想在您的文件中添加如下一行~/.bashrc:

exporthttp_proxy=http://username:password@proxy_server_name:port_number

例如

exporthttp_proxy=http://willy:Appelsi3ntj3@proxy:80

如果您不需要提供用户名和密码,只需省略 "@" 符号之前的所有内容,包括该符号。


10.3.4. 文件传输协议

10.3.4.1. FTP 服务器

在 Linux 系统上,FTP 服务器通常使用 WU-ftpd 服务器从 xinetd 运行,尽管 FTP 服务器可能配置为具有繁重 FTP 流量的系统上的独立服务器。请参阅练习。

其他 FTP 服务器包括 vsftpdNcftpdProftpd 等。

大多数 Linux 发行版都包含 anonftp 包,该包设置一个匿名 FTP 服务器树以及随附的配置文件。


10.3.4.2. FTP 客户端

大多数 Linux 发行版都包含 ncftp,它是通用 UNIX ftp 命令的改进版本,您可能也从 Windows 命令行中知道该命令。ncftp 程序提供额外的功能,例如更美观和更易于理解的用户界面、文件名完成、附加和恢复功能、书签、会话管理等等。

thomas:~> ncftp blob
NcFTP 3.0.3 (April 15, 2001) by Mike Gleason (ncftp@ncftp.com).
Connecting to blob...
blob.some.net FTP server (Version wu-2.6.1-20) ready.
Logging in...
Guest login ok, access restrictions apply.
Logged in to blob.
ncftp / > help
Commands may be abbreviated.  'help showall' shows hidden and 
unsupported commands.  
'help <command>' gives a brief description of <command>.

ascii      cat      help      lpage     open     quote    site     
bgget      cd       jobs      lpwd      page     rename   type     
bgput      chmod    lcd       lrename   pdir     rhelp    umask    
bgstart    close    lchmod    lrm       pls      rm       version  
binary     debug    lls       lrmdir    put      rmdir      
bookmark   dir      lmkdir    ls        pwd      set        
bookmarks  get      lookup    mkdir     quit     show       
ncftp / > 

可以在 man 页面中找到包含大量示例的出色帮助。同样,许多 GUI 应用程序可用。

WarningFTP 是不安全的!
 

除非您知道自己在做什么,否则不要使用文件传输协议进行非匿名登录。您的用户名和密码可能会被恶意网络用户捕获!请改用安全的 FTP;sftp 程序随 Secure SHell 套件一起提供,请参阅 第 10.4.4.4 节


10.3.5. 聊天和会议

每个发行版中都有各种客户端和系统可用,以取代旧式的基于 IRC 文本的聊天。以下是最流行的程序的简短且不完整的列表

  • gaim:用于 Linux、Windows 和 Mac 的多协议即时消息客户端,与 MSN Messenger、ICQ、IRC 等兼容;请参阅 Info 页面或 Gaim 网站 了解更多信息。

  • xchat:X 窗口系统的 IRC 客户端

    图 10-2。X-Chat

    主页位于 SourceForge

  • aMSN:MSN 克隆。

  • KonversationkopeteKVIrc 以及 KDE 套件中的许多其他 K 工具。

  • gnomemeeting:用于 UNIX 的视频会议程序(现在是 Ekiga)。

  • jabber:开源即时消息平台,与 ICQ、AIM、Yahoo、MSN、IRC、SMTP 等兼容。

  • psi:jabber 客户端,请参阅 PSI Jabber 客户端主页

  • skype:通过 Internet 向其他 Skype 用户拨打类似电话的程序的程序,请参阅 http://www.skype.com 了解更多信息。Skype 是免费的,但不是开源的。

  • Gizmo:用于您计算机的免费(但不是开源的)电话,请参阅 http://www.gizmoproject.com


10.3.6. 新闻服务

运行 Usenet 服务器需要大量的专业知识和微调,因此请参阅 INN 主页 了解更多信息。

comp.* 层次结构中有几个有趣的新闻组,可以使用各种文本和图形客户端访问。许多邮件客户端也支持新闻组浏览,请检查您的程序或查看您的本地开源软件镜像,以获取文本客户端,例如 tinslrnnmutt,或下载 Mozilla 或其他一些图形客户端。

Deja.com 保留了由 Google 提供支持的所有新闻组的可搜索存档。这是一个非常强大的工具,可以获得帮助:很可能有人遇到过您的问题,找到了解决方案并将其发布在其中一个新闻组中。


10.3.7. 域名系统

所有这些应用程序都需要 DNS 服务才能将 IP 地址与主机名进行匹配,反之亦然。DNS 服务器不知道世界上所有的 IP 地址,但它知道其他 DNS 服务器的网络,它可以查询这些服务器以查找未知的地址。大多数 UNIX 系统都可以运行 named,它是 Internet 软件联盟分发的 BIND(Berkeley Internet Name Domain)包的一部分。它可以作为独立的缓存域名服务器运行,这通常在 Linux 系统上完成,以加快网络访问速度。

您的主要客户端配置文件是/etc/resolv.conf,它确定联系域名服务器的顺序

search somewhere.org
nameserver 192.168.42.1
nameserver 193.74.208.137

更多信息可以在 named 的 Info 页面中找到,在/usr/share/doc/bind[-<version>]文件和 Bind 项目主页上。DNS HOWTO 介绍了如何将 BIND 用作 DNS 服务器。


10.3.8. DHCP

DHCP 是动态主机配置协议,它正在逐渐取代大型环境中的旧式 bootp。它用于控制重要的网络参数,例如主机的 IP 地址和名称服务器。DHCP 向后兼容 bootp。要配置服务器,您需要阅读 HOWTO。

DHCP 客户端计算机通常将使用配置 dhcpcd (DHCP 客户端守护进程) 的 GUI 进行配置。如果您需要将您的机器配置为 DHCP 客户端,请检查您的系统文档。


10.3.9. 身份验证服务

10.3.9.1. 传统的

传统上,用户在本地进行身份验证,使用存储在/etc/passwd/etc/shadow在每个系统上。但是,即使使用网络服务进行身份验证,本地文件也始终存在,用于配置管理使用的系统帐户,例如 root 帐户、守护程序帐户以及通常用于其他程序和目的的帐户。

这些文件通常是黑客检查的第一个候选对象,因此请确保权限和所有权按照应有的方式严格设置

bob:~> ls -l /etc/passwd /etc/shadow
-rw-r--r--    1 root     root         1803 Mar 10 13:08 /etc/passwd
-r--------    1 root     root         1116 Mar 10 13:08 /etc/shadow

10.3.9.2. PAM

Linux 可以使用 PAM,即 可插拔认证模块,这是一种灵活的 UNIX 认证方法。PAM 的优点:

  • 一种通用的认证方案,可以用于各种应用程序。

  • PAM 可以在各种应用程序中实现,而无需重新编译应用程序来专门支持 PAM。

  • 为管理员和应用程序开发人员提供极大的灵活性和对认证的控制。

  • 应用程序开发人员不需要开发程序来使用特定的认证方案。相反,他们可以专注于程序的细节。

目录/etc/pam.d包含 PAM 配置文件(过去是/etc/pam.conf)。每个应用程序或服务都有自己的文件。文件中的每一行都有四个元素:

  • 模块:

    • auth:提供实际的身份验证(可能需要请求和检查密码)并设置凭据,例如组成员资格或 Kerberos 票证。

    • account:检查是否允许用户访问(帐户未过期,用户是否允许在此时间段登录等)。

    • password:用于设置密码。

    • session:在用户通过身份验证后使用。此模块执行允许访问所需的其他任务(例如,挂载用户的主目录或使其邮箱可用)。

    模块堆叠的顺序非常重要,因此可以使用多个模块。

  • 控制标志:告诉 PAM 在失败或成功时采取哪些操作。 值可以是:required (必须), requisite (必要), sufficient (足够)或者optional (可选).

  • 模块路径:要使用的可插拔模块的路径,通常在/lib/security.

  • 参数:模块的信息

PAM 会自动检测影子密码文件。

更多信息可以在 pam 手册页或 Linux-PAM 项目主页上找到。


10.3.9.3. LDAP

轻量级目录访问协议是一种客户端 - 服务器系统,用于通过网络访问全局或本地目录服务。在 Linux 上,使用 OpenLDAP 实现。它包括 slapd(一个独立的服务器)、slurpd(一个独立的 LDAP 复制服务器)、实现 LDAP 协议的库以及一系列实用程序、工具和示例客户端。

使用 LDAP 的主要好处是整合组织内的某些类型的信息。例如,组织内所有不同的用户列表可以合并到一个 LDAP 目录中。需要此信息的任何启用 LDAP 的应用程序都可以查询此目录。需要目录信息的用户也可以访问它。

LDAP 或 X.500 Lite 的其他优点包括易于实现(与 X.500 相比)以及定义明确的应用程序编程接口 (API),这意味着启用 LDAP 的应用程序和 LDAP 网关的数量在未来应该会增加。

从消极方面来看,如果要使用 LDAP,则需要启用 LDAP 的应用程序或使用 LDAP 网关的能力。虽然 LDAP 的使用应该只会增加,但目前可用于 Linux 的启用 LDAP 的应用程序并不多。此外,虽然 LDAP 支持一些访问控制,但它不像 X.500 那样具有许多安全功能。

由于 LDAP 是一种开放且可配置的协议,因此它可用于存储几乎任何与特定组织结构相关的信息类型。常见的例子包括邮件地址查找、与 PAM 结合的中央身份验证、电话目录和机器配置数据库。

有关详细信息,请参阅系统特定信息以及相关命令(如 ldapmodifyldapsearch)的手册页。更多信息可以在 LDAP Linux HOWTO 中找到,其中讨论了在 Linux 上安装、配置、运行和维护 LDAP 服务器。本 Linux 入门文档的作者还编写了 LDAP Operations HOWTO,描述了每个人在处理 LDAP 管理、操作和服务集成时应该了解的基础知识。


10.4. 远程执行应用程序

10.4.1. 简介

有几种不同的方法可以在远程计算机上执行命令或运行程序,并将输出(无论是文本还是图形)发送到您的工作站。连接可以是安全的或不安全的。当然建议使用安全连接,而不是通过未加密的网络传输密码,但我们将讨论旧(不安全)机制的一些实际应用,因为它们在现代网络环境中仍然有用,例如用于故障排除或运行特殊的程序。


10.4.2. Rsh, rlogin 和 telnet

用于远程登录和远程执行命令的 rloginrsh 命令是从 UNIX 继承的。虽然很少使用,因为它们明显不安全,但几乎每个 Linux 发行版都附带它们,以便向后兼容 UNIX 程序。

另一方面,Telnet 仍然被普遍使用,通常由系统和网络管理员使用。Telnet 是远程访问文件和远程管理的最强大工具之一,允许从 Internet 上的任何地方进行连接。结合 X 服务器,远程图形应用程序可以在本地显示。在本地计算机上工作和使用远程计算机之间没有区别。

由于整个连接都是未加密的,因此允许 telnet 连接会带来很高的安全风险。对于程序的正常远程执行,建议使用 Secure SHellssh。我们将在本节后面讨论安全方法。

但是,telnet 仍然在许多情况下使用。以下是一些测试邮件服务器和 Web 服务器以获取回复的示例:

检查邮件服务器是否工作

[jimmy@blob ~] telnet mailserver 25
Trying 192.168.42.1...
Connected to mailserver.
Escape character is '^]'.
220 m1.some.net ESMTP Sendmail 8.11.6/8.11.6; 200302281626
ehlo some.net
250-m1.some.net Hello blob.some.net [10.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-SIZE
250-DSN
250-ONEX
250-ETRN
250-XUSR
250 HELP
mail from: jimmy@some.net
250 2.1.0 jimmy@some.net... Sender ok
rcpt to: davy@some.net
250 2.1.5 davy@some.net... Recipient ok
data
354 Enter mail, end with "." on a line by itself
test
.
250 2.0.0 g2MA1R619237 Message accepted for delivery
quit
221 2.0.0 m1.some.net closing connection
Connection closed by foreign host.

检查 Web 服务器是否响应基本请求

[jimmy@blob ~] telnet www.some.net 80
Trying 64.39.151.23...
Connected to www.some.net.
Escape character is '^]'.
HEAD / ;HTTP/1.1

HTTP/1.1 200 OK
Date: Fri, 22 Mar 2002 10:05:14 GMT
Server: Apache/1.3.22 (UNIX) (Red-Hat/Linux) 
 mod_ssl/2.8.5 OpenSSL/0.9.6
 DAV/1.0.2 PHP/4.0.6 mod_perl/1.24_01
Last-Modified: Fri, 04 Jan 2002 08:21:00 GMT
ETag: "70061-68-3c3565ec"
Accept-Ranges: bytes
Content-Length: 104
Connection: close
Content-Type: text/html

Connection closed by foreign host.

[jimmy@blob ~]

这是完全安全的,因为您永远不必提供用户名和/或密码来获取所需的数据,因此没有人可以从电缆上嗅探到重要的信息。


10.4.3. X Window System

10.4.3.1. X 功能

正如我们在第 7 章中已经解释过的(参见 第 7.3.3 节),X Window 系统带有一个 X 服务器,该服务器为需要显示的客户端提供图形。

重要的是要认识到 X 服务器和 X 客户端应用程序之间的区别。X 服务器直接控制显示,并负责通过键盘、鼠标和显示器进行的所有输入和输出。另一方面,X 客户端不直接访问输入和输出设备。它与处理输入和输出的 X 服务器通信。X 客户端执行实际工作,例如计算值、运行应用程序等等。X 服务器仅打开窗口以处理指定客户端的输入和输出。

在正常操作(图形模式)中,即使仅运行客户端应用程序,每个 Linux 工作站也是其自身的 X 服务器。您正在运行的所有应用程序(例如,Gimp、终端窗口、浏览器、办公应用程序、CD 播放工具等等)都是 X 服务器的客户端。在这种情况下,服务器和客户端在同一台机器上运行。

X 系统的这种客户端/服务器性质使其成为远程执行应用程序和程序的理想环境。因为该过程实际上是在远程计算机上执行的,所以在本地主机上只需要很少的 CPU 能力。纯粹充当 X 服务器的此类机器称为 X 终端,曾经非常流行。更多信息可以在 Remote X applications mini-HOWTO 中找到。


10.4.3.2. Telnet 和 X

如果您想使用 telnet 来显示在远程计算机上运行的图形应用程序,您首先需要使用 xhost 命令允许远程计算机访问您的显示器(访问您的 X 服务器!),方法是在本地计算机上的终端窗口中键入类似于以下命令的命令:

davy:~> xhost +remote.machine.com

之后,连接到远程主机,并通过设置环境变量来告诉它在本地计算机上显示图形:存储的信息:

[davy@remote ~] export DISPLAY="local.host.com:0.0"

完成此步骤后,在此终端窗口中启动的任何应用程序都将显示在您的本地桌面上,使用远程资源进行计算,但使用您的本地图形资源(您的 X 服务器)来显示应用程序。

此过程假定您已经在要显示图像的机器上设置了某种 X 服务器(XFree86X.orgExceedCygwin)。客户端机器的架构和操作系统并不重要,只要它们允许您在其上运行 X 服务器即可。

请注意,从远程计算机显示终端窗口也被认为是显示图像。


10.4.4. SSH 套件

10.4.4.1. 简介

大多数 UNIX 和 Linux 系统现在运行 Secure SHell,以消除 telnet 带来的安全风险。大多数 Linux 系统将运行 OpenSSH 的版本,它是 SSH 协议的开源实现,可在不受信任的网络上的不受信任的主机之间提供安全加密的通信。在标准设置中,X 连接会自动转发,但也可以使用安全通道转发任意 TCP/IP 端口。

ssh 客户端连接并登录到指定的主机名。用户必须按照sshd_config文件中的指定,向远程计算机提供其身份,该文件通常可以在/etc/ssh中找到。配置文件相当不言自明,默认情况下启用大多数常用功能。如果您需要帮助,可以在 sshd 手册页中找到它。

当用户的身份被服务器接受后,服务器要么执行给定的命令,要么登录到机器并在远程机器上为用户提供一个普通的 shell。与远程命令或 shell 的所有通信都将自动加密。

当远程机器上的命令或 shell 退出并且所有 X11 和 TCP/IP 连接都已关闭时,会话终止。

首次使用 SSH 集合中包含的任何程序连接到主机时,您需要建立该主机的真实性并确认您要连接:

lenny ~> ssh blob
The authenticity of host 'blob (10.0.0.1)' can't be established.
RSA fingerprint is 18:30:50:46:ac:98:3c:93:1a:56:35:09:8d:97:e3:1d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'blob,192.168.30.2' (RSA) to the list of 
known hosts.
Last login: Sat Dec 28 13:29:19 2002 from octarine
This space for rent.

lenny is in ~

重要的是您输入 "yes",用三个字符,而不仅仅是 "y"。这会编辑您的~/.ssh/known_hosts文件,请参阅 第 10.4.4.3 节

如果您只是想在远程计算机上检查某些内容,然后将您的提示符返回到本地主机,您可以将您要远程执行的命令作为 ssh 的参数给出:

lenny ~> ssh blob who
jenny@blob's password:
root     tty2         Jul 24 07:19
lena	 tty3         Jul 23 22:24
lena     0:	      Jul 25 22:03

lenny ~> uname -n
magrat.example.com

10.4.4.2. X11 和 TCP 转发

如果在目标机器上X11Forwarding条目设置为 yes 并且用户正在使用 X 应用程序,则存储的信息如果设置了环境变量,到 X11 显示的连接将自动转发到远程端,这样从 shell 启动的任何 X11 程序都将通过加密通道,并且到真正的 X 服务器的连接将从本地机器建立。用户不应手动设置。存储的信息X11 连接的转发可以在命令行或 sshd 配置文件中配置。

的值存储的信息ssh 设置的值将指向服务器机器,但显示编号大于零。这是正常的,这是因为 ssh 在服务器机器上(运行 X 客户端应用程序)创建一个代理 X 服务器,用于通过加密通道转发连接。

这一切都是自动完成的,因此当您键入图形应用程序的名称时,它会显示在您的本地机器上,而不是在远程主机上。我们在示例中使用 xclock,因为它是一个通常安装的小程序,非常适合测试。

图 10-3. SSH X11 转发

SSH 还会在服务器机器上自动设置 Xauthority 数据。为此,它将生成一个随机授权 cookie,并将其存储在服务器上的Xauthority中,并验证任何转发的连接是否携带此 cookie,并在连接打开时用真正的 cookie 替换它。真正的身份验证 cookie 永远不会发送到服务器机器(也没有 cookie 以明文形式发送)。

可以通过命令行或配置文件指定通过安全通道转发任意 TCP/IP 连接。

NoteX 服务器
 

此过程假定您在客户端上运行着一个 X 服务器,您希望在该客户端上显示来自远程主机的应用程序。客户端的架构和操作系统可能与远程主机不同,只要它可以运行 X 服务器,例如 Cygwin(为 MS Windows 客户端和其他客户端实现 X.org 服务器)或 Exceed,就应该可以使用任何 Linux 或 UNIX 机器建立远程连接。


10.4.4.3. 服务器身份验证

ssh 客户端/服务器系统自动维护并检查一个数据库,其中包含它曾经使用过的所有主机的标识。主机密钥存储在用户主目录的$HOME/.ssh/known_hosts中。此外,还会自动检查文件/etc/ssh/ssh_known_hosts中已知的hosts。任何新主机都会自动添加到用户的文件中。如果主机的标识发生更改,ssh 会发出警告并禁用密码身份验证,以防止特洛伊木马获取用户的密码。此机制的另一个目的是防止中间人攻击,否则这些攻击可能被用来规避加密。在需要高安全性的环境中,甚至可以将 sshd 配置为阻止登录到主机密钥已更改或未知的主机。


10.4.4.4. 安全远程复制

SSH 套件提供 scp 作为 rcp 命令的安全替代方案,该命令在只有 rsh 时曾经很流行。scp 使用 ssh 进行数据传输,使用相同的身份验证并提供与 ssh 相同的安全性。与 rcp 不同,如果需要身份验证,scp 将要求输入密码或口令。

lenny /var/tmp> scp Schedule.sdc.gz blob:/var/tmp/
lenny@blob's password:
Schedule.sdc.gz  100% |*****************************| 100 KB 00:00

lenny /var/tmp>

任何文件名都可以包含主机和用户规范,以指示该文件将复制到该主机或从该主机复制。允许在两个远程主机之间进行复制。有关更多信息,请参见 Info 页面。

如果您更喜欢使用类似 FTP 的界面,请使用 sftp

lenny /var/tmp> sftp blob
Connecting to blob...
lenny@blob's password:

sftp> cd /var/tmp

sftp> get Sch*
Fetching /var/tmp/Schedule.sdc.gz to Schedule.sdc.gz

sftp> bye

lenny /var/tmp>

Note安全复制或 FTP GUI
 

还不习惯命令行?试试 Konqueror 的安全远程复制功能,或者安装 Putty


10.4.4.5. 身份验证密钥

ssh-keygen 命令为 ssh 生成、管理和转换身份验证密钥。它可以创建用于 SSH 协议版本 1 的 RSA 密钥和用于 SSH 协议版本 2 的 RSA 或 DSA 密钥。

通常,每个希望使用带有 RSA 或 DSA 身份验证的 SSH 的用户都会运行此命令一次,以在$HOME/.ssh/identity, id_dsa或者id_rsa中创建身份验证密钥。此外,系统管理员可以使用它为系统生成主机密钥。

通常,此程序会生成密钥,并要求您提供一个文件来存储私钥。公钥存储在具有相同名称的文件中,但附加了 .pub。该程序还会要求输入口令。口令可以为空以表示没有口令(主机密钥必须具有空口令),也可以是任意长度的字符串。

没有办法恢复丢失的口令。如果口令丢失或忘记,则必须生成一个新密钥并将其复制到相应的公钥。

我们将在练习中学习 SSH 密钥。所有信息都可以在 man 或 Info 页面中找到。


10.4.5. VNC

VNC 或 Virtual Network Computing 实际上是一个远程显示系统,它不仅允许在运行它的本地机器上查看桌面环境,而且可以从 Internet 上的任何位置以及来自各种机器和体系结构,包括 MS Windows 和多个 UNIX 发行版。例如,您可以在 Windows NT 机器上运行 MS Word,并在您的 Linux 桌面上显示输出。VNC 提供服务器和客户端,因此反过来也有效,因此它可以用于在 Windows 客户端上显示 Linux 程序。VNC 与普通 X 服务器或商业实现的不同之处在于以下功能:

  • 查看器端不存储任何状态:您可以离开办公桌并从另一台机器恢复,继续您离开的地方。当您运行 PC X 服务器,并且 PC 崩溃或重新启动时,您正在运行的所有远程应用程序都将死亡。使用 VNC,它们会继续运行。

  • 它很小且简单,无需安装,如果需要,可以从软盘运行。

  • 平台独立,带有 Java 客户端,几乎可以在任何支持 X 的设备上运行。

  • 可共享:一个桌面可以在多个查看器上显示。

  • 免费。

有关更多信息,请参见 VNC 客户端 man 页面 (man vncviewer) 或 VNC 网站


10.4.6. rdesktop 协议

为了简化 MS Windows 主机的管理,最新的 Linux 发行版支持远程桌面协议 (RDP),该协议在 rdesktop 客户端中实现。该协议用于许多 Microsoft 产品中,包括 Windows NT Terminal Server、Windows 2000 Server、Windows XP 和 Windows 2003 Server。

使用全屏模式、多种类型的键盘布局和单应用程序模式(就像真的一样)给您的朋友(或管理层)一个惊喜。man rdesktop 手册提供了更多信息。该项目的主页位于 http://www.rdesktop.org/


10.4.7. Cygwin

Cygwin 在 MS Windows 系统上提供重要的 UNIX 功能。除了提供 UNIX 命令行工具和图形应用程序之外,它还可以用于在使用远程 X 的 MS Windows 机器上显示 Linux 桌面。从 Cygwin Bash shell 中,键入命令

/usr/X11R6/bin/XWin.exe-query 您的_linux_机器_名称_或_IP

默认情况下,连接被拒绝。您需要更改 X 显示管理器 (XDM) 配置,并可能更改 X 字体服务器 (XFS) 配置以启用这种类型的连接,在该连接中,您会在远程机器上获得一个登录屏幕。根据您的桌面管理器(GnomeKDE,或其他),您可能还必须在那里更改一些配置。

如果您不需要显示整个桌面,则可以在 Cygwin 中使用 SSH,就像 第 10.4.4 节 中解释的那样,而无需编辑配置文件的所有麻烦。


10.5. 安全性

10.5.1. 简介

一旦计算机连接到网络,各种滥用行为都可能发生,无论是基于 UNIX 的系统还是任何其他系统。诚然,关于这个主题已经发表了大量的文章,详细讨论安全问题会让我们走得太远。但是,即使是新手用户也可以做一些相当合乎逻辑的事情来获得非常安全的系统,因为大多数入侵都是由于无知或粗心的用户造成的。

也许您正在问自己,这一切是否适用于您,在家里使用您的计算机,或者在您办公室的桌面上的一个受到相当保护的环境中工作。但是,您应该问自己的问题更多的是

  • 您是否希望控制自己的系统?

  • 您是否想(在不知情的情况下)参与犯罪活动?

  • 您是否希望您的设备被其他人使用?

  • 您是否想冒险失去您的 Internet 连接?

  • 您是否想在每次被黑客入侵时都重建您的系统?

  • 您是否想冒个人或其他数据丢失的风险?

假设您不想,我们将快速列出您可以采取的措施来保护您的机器。更多信息可以在 Linux Security HOWTO 中找到。


10.5.2. 服务

目标是尽可能少地运行服务。如果为外部世界打开的端口数量保持在最低限度,则更有利于保持概览。如果无法为本地网络关闭服务,请尝试至少禁用它们以进行外部连接。

一个经验法则是,如果您不识别特定服务,您可能无论如何都不需要它。还要记住,某些服务实际上并不打算通过 Internet 使用。不要依赖于应该运行的内容,请使用 netstat 命令检查哪些服务正在监听哪些 TCP 端口。

[elly@mars ~] netstat -l | grep tcp
tcp     0      0 *:32769                 *:*      LISTEN
tcp     0      0 *:32771                 *:*      LISTEN
tcp     0      0 *:printer               *:*      LISTEN
tcp     0      0 *:kerberos_master       *:*      LISTEN
tcp     0      0 *:sunrpc                *:*      LISTEN
tcp     0      0 *:6001                  *:*      LISTEN
tcp     0      0 *:785                   *:*      LISTEN
tcp     0      0 localhost.localdom:smtp *:*      LISTEN
tcp     0      0 *:ftp                   *:*      LISTEN
tcp     0      0 *:ssh                   *:*      LISTEN
tcp     0      0 ::1:x11-ssh-offset      *:*      LISTEN

要避免的事情

  • execrloginrsh,以及 telnet,以确保安全。

  • 服务器机器上的 X11。

  • 如果没有物理连接打印机,则没有 lp。

  • 网络中没有 MS Windows 主机,不需要 Samba。

  • 除非需要 FTP 服务器,否则不允许 FTP。

  • 不要允许通过 Internet 访问 NFS 和 NIS,在独立安装中禁用所有相关服务。

  • 如果实际上不是邮件服务器,请不要运行 MTA。

  • ...

使用 chkconfig 命令、initscripts 或通过编辑 (x)inetd 配置文件停止运行服务。


10.5.3. 定期更新

Linux 在不断变化的环境中快速适应的能力使其蓬勃发展。但这也带来一种可能性,即在你安装全新版本的同时,已经发布了安全更新,因此安装后你应该做的第一件事(这适用于你能想到的任何操作系统)是尽快获取更新。之后,定期更新所有你使用的软件包。

某些更新可能需要新的配置文件,旧文件可能会被替换。查看文档,并确保更新后一切运行正常。

大多数 Linux 发行版都提供邮件列表服务,用于发布安全更新公告,并提供将更新应用于系统的工具。 通常的 Linux 安全问题也会在 Linuxsecurity.com 等网站上报告。

更新是一个持续的过程,因此应该成为几乎每天的习惯。


10.5.4. 防火墙和访问策略

10.5.4.1. 什么是防火墙?

在前一节中,我们已经提到了 Linux 中的防火墙功能。 虽然防火墙管理是你的网络管理员的任务之一,但你应该了解一些关于防火墙的事情。

防火墙是一个模糊的术语,可以指代任何充当我们与外部世界(通常是 Internet)之间保护屏障的东西。 防火墙可以是专用系统或提供此功能的特定应用程序。 或者它可以是组件的组合,包括硬件和软件的各种组合。 防火墙由 "规则" 构建,这些规则用于定义允许进入和/或离开给定系统或网络的内容。

禁用不必要的服务后,我们现在想要限制接受的服务,以便只允许最少的必要连接。 一个很好的例子是在家工作:只应允许你的办公室和你的家之间的特定连接,来自 Internet 上其他机器的连接应被阻止。


10.5.4.2. 数据包过滤器

第一道防线是数据包过滤器,它可以查看 IP 数据包内部并根据内容做出决定。 最常见的是 Netfilter 包,它提供 iptables 命令,这是用于 Linux 的下一代数据包过滤器。

较新内核中最值得注意的增强功能之一是状态检测功能,它不仅可以告诉你数据包内部的内容,还可以检测数据包是否属于新的或现有的连接或与之相关。

Shoreline Firewall 或简称 Shorewall 是 Linux 中标准防火墙功能的前端。

更多信息可以在 Netfilter/iptables 项目页面找到。


10.5.4.3. TCP 封装器

TCP 封装器提供与数据包过滤器几乎相同的结果,但工作方式不同。封装器实际上接受连接尝试,然后检查配置文件并决定是接受还是拒绝连接请求。它在应用程序级别而不是在网络级别控制连接。

TCP 封装器通常与 xinetd 一起使用,以提供基于主机名和 IP 地址的访问控制。此外,这些工具还包括易于配置的日志记录和利用率管理功能。

TCP 封装器的优点是连接的客户端不知道使用了封装器,并且它们与它们保护的应用程序分开运行。

基于主机的访问在以下文件中控制:hosts.allowhosts.deny文件。更多信息可以在以下位置的 TCP 封装器文档文件中找到:/usr/share/doc/tcp_wrappers[-<version>/]或者/usr/share/doc/tcp以及主机访问控制文件的手册页中,其中包含示例。


10.5.4.4. 代理

代理可以执行各种职责,并非所有职责都与安全性有很大关系。但它们作为中介的事实使代理成为执行访问控制策略、限制通过防火墙的直接连接以及控制代理后面的网络在 Internet 上看起来的方式的好地方。

通常与数据包过滤器结合使用,但有时它们会单独使用,代理提供额外的控制级别。更多信息可以在 Firewall HOWTO 或 Squid 网站上找到。


10.5.4.5. 访问单个应用程序

某些服务器可能有自己的访问控制功能。常见的例子包括 SambaX WindowBindApache 和 CUPS。对于你想提供的每项服务,请检查适用的配置文件。


10.5.4.6. 日志文件

如果有什么话,UNIX 将各种活动的各种活动记录到各种文件中的方式证实了“它正在做某事。”当然,应该定期手动或自动检查日志文件。 防火墙和其他访问控制手段往往会产生大量的日志文件,因此诀窍是尝试只记录异常活动。


10.5.5. 入侵检测

入侵检测系统旨在捕获可能已通过防火墙的内容。它们可以设计为捕获正在进行的主动入侵尝试,或者在事后检测到成功的入侵。在后一种情况下,阻止任何损坏已经太晚了,但至少我们对问题有早期意识。有两种基本类型的 IDS:保护网络的 IDS 和保护单个主机的 IDS。

对于基于主机的 IDS,这是通过监视文件系统变化的实用程序来完成的。以某种方式更改但本不应该更改的系统文件是出了问题的明显标志。 任何进入并获得 root 访问权限的人都可能会在某个地方对系统进行更改。 这通常是首先完成的事情,要么这样他就可以通过后门返回,要么对其他人发起攻击,在这种情况下,他必须更改或向系统添加文件。 某些系统带有 tripwire 监视系统,该系统在 Tripwire 开源项目网站上有文档记录。

网络入侵检测由一个系统处理,该系统查看通过防火墙的所有流量(不是通过端口扫描器,端口扫描器会公布可用的端口)。 Snort 是此类程序的开源示例。 Whitehats.com 提供一个开放的入侵检测数据库,arachNIDS


10.5.6. 更多技巧

你应该记住的一些一般事项

  • 不允许 root 登录。 UNIX 开发人员在 20 多年前提出了 su 来提高安全性。

  • 直接的 root 访问始终是危险的,并且容易出现人为错误,无论是允许 root 登录还是使用 su - 命令。 最好不要使用 su,而是使用 sudo 仅执行你需要额外权限的命令,然后在之后返回到你自己的环境。

  • 认真对待密码。 使用影子密码。 定期更改密码。

  • 尽量始终使用 SSH 或 SSL。 避免使用 telnet、FTP 和电子邮件客户端以及其他通过网络发送未加密密码的客户端程序。 安全不仅是保护你的计算机,也是保护你的密码。

  • 使用 quota 和/或 ulimit 限制资源。

  • root 的邮件应该被发送给实际的人,或者至少由实际的人阅读。

  • SANS institute 有更多技巧,按发行版排序,并提供邮件列表服务。

  • 检查新软件的来源,从受信任的地方/站点获取它。 在安装前验证新软件包。

  • 使用非永久性 Internet 连接时,一旦不再需要它,就将其关闭。

  • 在奇数端口上运行私有服务,而不是可能的黑客期望的端口。

  • 了解你的系统。 过一段时间,你几乎可以感觉到什么时候发生什么事情。


10.5.7. 我被黑了吗?

你怎么知道? 这是一个可疑事件的清单

  • 神秘的开放端口,奇怪的进程。

  • 系统实用程序(常用命令)表现奇怪。

  • 登录问题。

  • 无法解释的带宽使用。

  • 损坏或丢失的日志文件,syslog 守护进程行为异常。

  • 接口处于异常模式。

  • 意外修改的配置文件。

  • shell 历史文件中的奇怪条目。

  • 未识别的临时文件。


10.5.8. 从入侵中恢复

简而言之,保持冷静。 然后按此顺序采取以下操作

  • 断开机器与网络的连接。

  • 尽量多地了解你的安全漏洞是如何被破坏的。

  • 备份重要的非系统数据。 如果可能,请针对在系统被破坏之前制作的现有备份检查这些数据,以确保数据完整性。

  • 重新安装系统。

  • 使用新密码。

  • 从系统和数据备份还原。

  • 应用所有可用的更新。

  • 重新检查系统:阻止不必要的服务,检查防火墙规则和其他访问策略。

  • 重新连接。


10.6. 总结

Linux 和网络是密不可分的。 Linux 内核支持所有常见和大多数不常见的网络协议。 每个发行版中都提供标准的 UNIX 网络工具。 除此之外,大多数发行版都提供易于网络安装和管理的工具。

Linux 以其作为运行各种 Internet 服务的稳定平台而闻名,Internet 软件数量是无限的。 像 UNIX 一样,Linux 也可以很好地从远程位置使用和管理,可以使用几种远程执行程序的解决方案。

我们简要地谈到了安全性。Linux 是一个理想的防火墙系统,轻量且廉价,但可以用于其他几种网络功能,例如路由器和代理服务器。

提高网络安全性的主要方法是应用频繁的更新和常识。

以下是与网络相关的命令的概述

表 10-2. 第 10 章中的新命令:网络

命令含义
ftp将文件传输到另一台主机(不安全)。
host获取有关联网主机的信息。
ifconfig显示 IP 地址信息。
ip显示 IP 地址信息。
netstat显示路由信息和网络统计信息。
ping向其他主机发送应答请求。
rdesktop在您的 Linux 系统上显示 MS Windows 桌面。
route显示路由信息。
scp安全地将文件复制到其他主机以及从其他主机复制文件。
sftp安全地 FTP 文件到其他主机以及从其他主机 FTP 文件。
ssh建立到另一台主机的加密连接。
ssh-keygenSecure SHell 生成身份验证密钥。
telnet建立到另一台主机的不安全连接。
tracepath/traceroute打印数据包到达另一台主机的路径。
whois获取有关域名的信息。
xclockX Window 时钟应用程序,方便测试远程显示。
xhostX Window 访问控制工具。

10.7. 练习

10.7.1. 一般网络

  • 显示您的工作站的网络信息:IP 地址、路由、域名服务器。

  • 假设没有 DNS 可用。 如果不一直输入 IP 地址,您将如何访问邻居的机器?

  • 您将如何永久存储文本模式浏览器(如 links)的代理信息?

  • 哪些域名服务器处理 redhat.com 域名?

  • 向您的本地帐户发送电子邮件。 尝试两种不同的发送和读取方式。 您如何检查它是否真的到达?

  • 您的机器是否接受匿名 FTP 连接? 您如何使用 ncftp 程序使用您的用户名和密码进行身份验证?

  • 您的机器是否运行 Web 服务器? 如果没有,请使其运行。 检查日志文件!


10.7.2. 远程连接

  • 从您的本地工作站,在您邻居的屏幕上显示一个图形应用程序,例如 xclock。 将必须设置必要的帐户。 使用安全连接!

  • 设置 SSH 密钥,以便您可以连接到邻居的机器,而无需输入密码。

  • /var/tmp在邻居的"备份服务器"上,使用 scp。 在开始数据传输之前进行存档和压缩! 使用 ssh 连接到远程主机,解压缩备份,并使用 sftp 将一个文件放回原始机器上。


10.7.3. 安全性

  • 列出机器上打开(正在侦听)的端口的列表。

  • 假设您要运行 Web 服务器。 您将停用哪些服务? 你会怎么做?

  • 安装可用的更新。

  • 您如何查看谁连接到您的系统?

  • 创建一个重复性的工作,提醒您每月更改密码,最好也更改 root 密码。


第 11 章。声音和视频

本章讨论以下任务(简要地,因为声音和视频领域非常广泛)

  • 声卡配置

  • 播放 CD、复制 CD、

  • 播放音乐文件

  • 音量控制

  • 视频和电视

  • 录音


11.1. 音频基础

11.1.1. 安装

最有可能的是,您的系统已经安装了音频驱动程序,并且在安装时完成了配置。 同样,如果您需要更换音频硬件,大多数系统都提供允许轻松设置和配置设备的工具。 大多数当前可用的即插即用声卡应会自动识别。 如果您可以听到配置期间播放的样本,只需单击 确定,一切都会为您设置好。

如果您的卡未自动检测到,可能会向您显示一个声卡和/或声卡属性列表供您选择。 之后,您将必须提供正确的 I/O 端口、IRQ 和 DMA 设置。 有关这些设置的信息可以在声卡文档中找到。 如果您使用的是具有 MS Windows 的双启动系统,则也可以在 Windows 控制面板中找到此信息。

Note如果自动声卡检测失败
 

如果默认情况下不支持您的声卡,您将需要应用其他技术。 这些在 Linux Sound HOWTO 中进行了描述。


11.1.2. 驱动程序和架构

通常有两种类型的声音架构:较旧的开放声音系统或 OSS,它适用于每个类似 UNIX 的系统;以及较新的高级 Linux 声音架构或 ALSA,正如其名称所示,它更好地支持 Linux。 ALSA 还具有更多功能,并允许更快的驱动程序开发。 我们将在这里重点介绍 ALSA 系统。

如今,几乎所有主流音频芯片组都得到支持。 只有一些高端专业解决方案和一些由拒绝记录其芯片组规格的制造商开发的卡不受支持。 可以在 ALSA 网站 http://www.alsa-project.org/alsa-doc/index.php?vendor=All#matrix 上找到受支持设备的概述。

使用 ALSA 安装的系统的配置是使用 alsaconf 工具完成的。 此外,发行版通常提供自己的工具来配置声卡; 这些工具甚至可以集成旧的和新的处理声音设备的方式。


11.2. 声音和视频播放

11.2.1. CD 播放和复制

cdp 软件包随大多数发行版一起提供,并提供 cdpcdplay,这是一个基于文本的 CD 播放器。 桌面管理器通常包含一个图形工具,例如 Gnome 中的 gnome-cd 播放器,可以从菜单启动。

请务必了解音频 CD 和数据 CD 之间的区别。 您无需将音频 CD 装入文件系统即可收听。 这是因为此类 CD 上的数据不是 Linux 文件系统数据; 它们使用 CD 播放器程序直接访问并发送到音频输出通道。 如果您的 CD 是包含的数据 CD.mp3文件,您首先需要将其装入文件系统,然后使用我们在下面讨论的程序之一来播放音乐。 如何将 CD 装入文件系统在 第 7.5.5 节 中进行了解释。

来自具有相同名称的软件包的 cdparanoia 工具直接将音频作为数据从 CD 中读取,而无需模拟转换,并将数据以不同格式写入文件或管道,其中.wav可能是最受欢迎的。 用于转换为其他格式的各种工具,格式,例如.mp3,随大多数发行版一起提供或可作为单独的软件包下载。 GNU 项目提供多个 CD 播放、翻录和编码工具、数据库管理器; 有关详细信息,请参阅 自由软件目录,音频部分

KDE 套件中的 kaudiocreator 工具简化了音频 CD 的创建,其中包括许多其他工具。 它带有来自 KDE 帮助中心的清晰信息。

CD 刻录在 第 9.2.2 节 中进行了总体介绍。


11.2.2. 播放音乐文件

11.2.2.1. mp3 文件

流行的.mp3格式在 Linux 机器上得到广泛支持。 大多数发行版都包含可以播放这些文件的多个程序。 在许多其他应用程序中,XMMS(如下图所示)是最广泛使用的应用程序之一,部分原因是它具有与 Windows 工具相同的外观和感觉。

图 11-1. XMMS mp3 播放器

用于播放音乐的另一个非常受欢迎的应用程序是 AmaroK,这是一个 KDE 应用程序,正在稳步普及,以及 MPlayer,它也可以播放电影。

Note限制
 

某些发行版不允许您在不修改配置的情况下播放 MP3,这是由于 MP3 工具的许可证限制。 您可能需要安装额外的软件才能播放音乐。

在文本模式下,您可以使用 mplayer 命令

[tille@octarine ~]$ mplayer /opt/mp3/oriental/*.mp3
MPlayer 1.0pre7-RPM-3.4.2 (C) 2000-2005 MPlayer Team
CPU: Advanced Micro Devices Duron Spitfire (Family: 6, Stepping: 1)
Detected cache-line size is 64 bytes
CPUflags:  MMX: 1 MMX2: 1 3DNow: 1 3DNow2: 1 SSE: 0 SSE2: 0
Playing /opt/oldopt/mp3/oriental/Mazika_Diana-Krozon_Super-Star_Ensani-Ma-
Bansak.mp3.
Cache fill:  1.17% (98304 bytes)    Audio file detected.
Clip info:
Title: Ensani-Ma-Bansak.mp3
Artist: Diana-Krozon
Album: Super-Star
Year:
Comment:
Genre: Unknown
==========================================================================
Opening audio decoder: [mp3lib] MPEG layer-2, layer-3
mpg123: Can't rewind stream by 450 bits!
AUDIO: 44100 Hz, 2 ch, s16le, 160.0 kbit/11.34% (ratio: 20000->176400)
Selected audio codec: [mp3] afm:mp3lib (mp3lib MPEG layer-2, layer-3)
==========================================================================
Checking audio filter chain for 44100Hz/2ch/s16le -> 44100Hz/2ch/s16le...
AF_pre: 44100Hz/2ch/s16le
AO: [oss] 44100Hz 2ch s16le (2 bps)
Building audio filter chain for 44100Hz/2ch/s16le -> 44100Hz/2ch/s16le...
Video: no video
Starting playback...
A: 227.8 (03:23:.1) 1.8% 12%

11.2.2.2. 其他格式

讨论所有可能的音频格式和播放方式对我们来说太远了。 其他常见的音频播放和操作软件的(不完整)概述

  • Ogg Vorbis:免费音频格式:有关工具,请参见 GNU 音频目录 - 它们也可能包含在您的发行版中。 开发此格式是因为 MP3 已获得专利。

  • Real 音频和视频:来自 RealNetworksrealplay

  • SoX 或 Sound eXchange:实际上是一个声音转换器,带有 play 程序。 播放.wav, . ogg和各种其他格式,包括原始二进制格式。

  • Playmidi:一个 MIDI 播放器,请参见 GNU 目录。

  • AlsaPlayer:来自高级 Linux 声音架构项目,请参见 AlsaPlayer 网站

  • mplayer:几乎可以播放任何内容,包括 mp3 文件。 有关更多信息,请访问 MPlayerHQ 网站

  • hxplay:支持 RealAudio 和 RealVideo、mp3、mp4 音频、Flash、wav 等,请参见 HelixDNA(并非此软件的所有组件都是完全免费的)。

  • rhythmbox:基于 GStreamer 框架,可以播放 GStreamer 中支持的所有内容,该框架声称能够播放所有内容,请参见 RhythmboxGStreamer 网站。

查阅您的系统文档和手册页,以获取有关特定工具以及如何使用它们的详细说明。

Note我的系统上没有这些应用程序!
 

上述章节中讨论的许多工具和应用程序都是可选软件。 你的系统默认可能没有安装这些应用程序,但你可以在你的发行版中找到作为附加软件包的这些应用程序。 你所寻找的应用程序很可能根本不在你的发行版中。 在这种情况下,你需要从该应用程序的网站下载它。


11.2.2.3. 音量控制

aumixalsamixer 是两个常用的文本工具,用于调整音频控制。 使用箭头键来切换设置。alsamixerGnome 菜单启动或作为命令行中的 gnome-alsamixer 启动时,具有图形界面。kmix 工具在 KDE 中执行相同的操作。

无论你选择如何收听音乐或其他声音,请记住,可能还有其他人对听到你或你的电脑的声音不感兴趣。 尽量礼貌,尤其是在办公室环境中。 使用高质量的头戴式耳机,而不是带有小耳塞的耳机。 这对你的耳朵更好,并且减少了对同事的干扰。


11.2.3. 录音

同样,有各种工具可用于录制语音和音乐。 对于录制语音,你可以在命令行中使用 arecord

alexey@russia:~> arecord /var/tmp/myvoice.wav
Recording WAVE '/var/tmp/myvoice.wav' : Unsigned 8 bit, Rate 8000 Hz, Mono
Aborted by signal Interrups...

"中断"意味着应用程序捕获了 Ctrl+C。 使用简单的 play 命令播放示例。

这是一个很好的测试,你可以在测试需要语音输入的应用程序(如网络语音 (VoIP))之前执行。 请记住,应激活麦克风输入。 如果你听不到自己的声音,请检查你的声音设置。 通常,麦克风会被静音或音量非常低。 可以使用 alsamixer 或特定于你的发行版的音频系统图形界面轻松调整它。

在 KDE 中,你可以启动 krec 实用程序,Gnome 提供了 gnome-sound-recorder


11.3. 视频播放、流媒体和电视观看

有各种播放器可用

  • xine:一个免费的视频播放器

  • ogle:DVD 播放器。

  • okleogle 的 KDE 版本

  • mplayer:Linux 的电影播放器

  • totem:播放音频和视频文件、音频 CD、VCD 和 DVD。

  • realplay:来自 RealNetworks。

  • hxplay:Real 的替代品,请参阅 HelixDNA

  • kaffeine:KDE3 的媒体播放器。

最有可能的是,你会在你的图形菜单中找到其中一个。

请记住,默认情况下,你的系统上可能没有观看不同类型视频所需的所有编解码器。 你可以通过下载 W32codecslibdvdcss 来取得长足的进步。

LDP 发布了一份非常适合本节的文档。 它名为 DVD Playback HOWTO,描述了可用于在具有 DVD 驱动器的系统上观看电影的不同工具。 它是 DVD HOWTO 的一个很好的补充,该指南解释了驱动器的安装。

对于观看电视,可以选择以下工具,以及许多其他用于观看和捕获电视、视频和其他流媒体的工具

  • tvtime:一个很棒的程序,具有电台管理、与图文电视的交互、电影模式和更多

  • zapping:Gnome 专用的电视查看器。

  • xawtv:X11 电视查看器。


11.4. 网络电话

11.4.1. 它是什么?

网络电话,或者更常见的网络语音 (VoIP) 或数字电话,允许各方通过网络交换语音数据流。 最大的区别在于数据流通过通用网络(互联网)传输,而传统电话使用语音传输线路的专用网络。 但是,在特殊情况下,这两个网络可以连接,但就目前而言,这肯定不是标准。 换句话说:你很可能无法呼叫使用传统电话的人。 如果有可能的话,你可能需要支付订阅费用。

虽然目前有各种应用程序可供免费下载,包括免费和专有应用程序,但通过互联网进行电话通信存在一些主要缺点。 最值得注意的是,系统不可靠,速度可能很慢或者连接上可能有很多噪音,因此它肯定不能用于取代传统电话 - 想想紧急呼叫。 虽然有些提供商采取了预防措施,但无法保证你可以联系到你想呼叫的人。

目前大多数应用程序不使用加密,因此请注意,其他人可能会很容易地窃听你的对话。 如果你担心安全问题,请阅读你的 VoIP 客户端随附的文档。 此外,如果你正在使用防火墙,则应将其配置为允许来自任何地方的传入连接,因此使用 VoIP 也包括承担站点安全级别的风险。


11.4.2. 你需要什么?

11.4.2.1. 服务器端

首先,你需要一个提供服务的提供商。 此服务可能集成传统电话,并且可能免费或不免费。 其中包括 SIPphoneVonageLingoAOL TotalTalk 和许多本地可访问的提供所谓的 "完整电话服务" 的提供商。 仅限互联网电话服务由 SkypeSIP BrokerGoogle 和许多其他公司提供。

如果你想建立自己的服务器,你可能需要研究 Asterisk


11.4.2.2. 客户端

在客户端,你可以使用的应用程序取决于你的网络配置。 如果你有直接的互联网连接,则不会有任何问题,前提是你知道可以在哪个服务器上连接,并且通常你还需要用户名和密码来验证服务。

但是,如果你位于执行网络地址转换 (NAT) 的防火墙之后,某些服务可能无法工作,因为它们只会看到防火墙的 IP 地址,而不会看到你的计算机的地址,例如,当你在公司网络中并且你的 IP 地址以 10.、192.168. 或另一个不可路由的子网前缀开头时,该地址在互联网上可能无法路由。 这取决于应用程序使用的协议。

此外,可用带宽可能是一个阻碍因素:某些应用程序针对低带宽消耗进行了优化,而其他应用程序可能需要高带宽连接。 这取决于应用程序使用的编解码器。

最常见的应用程序包括 Skype 客户端(其界面让人想起即时消息)和 X-LiteXTen softphone 的免费版本),它看起来像移动电话。 但是,虽然这些程序可以免费下载并且非常受欢迎,但它们不是像自由言论那样的自由:它们使用专有协议和/或仅以二进制包提供,而不是以源格式提供。

免费和开放的 VoIP 客户端例如 GizmoLinphoneGnomeMeetingKPhone

Tip客户端硬件
 

虽然你的计算机(尤其是笔记本电脑)可能内置麦克风,但如果你连接头戴式耳机,效果会好得多。 如果你有选择,请选择 USB 头戴式耳机,因为它独立于现有音频硬件运行。 使用 alsamixer 配置输入和输出音量级别以适合你的口味。

VoIP 应用程序绝对是一个蓬勃发展的市场。 志愿者们正在尝试记录 http://www.voip-info.org/ 的当前状态。


11.5. 摘要

GNU/Linux 平台完全启用了多媒体功能。 支持各种设备,如声卡、电视卡、头戴式耳机、麦克风、CD 和 DVD 播放器。 应用程序列表简直是无穷无尽的,这就是为什么我们需要缩短下面新命令的列表并将自己限制在一般的音频命令上。

表 11-1. 第 11 章中的新命令:音频

命令含义
alsaconf配置 ALSA 音频系统。
alsamixer调整 ALSA 驱动程序的输出级别。
arecord录制声音样本。
aumix音频混音器工具。
cdp播放音频 CD。
cdparanoia抓取音频 CD。
cdplay播放音频 CD。
gnome-alsamixerGnome ALSA 前端。
gnome-cdGnome 用于播放音频 CD 的前端。
gnome-sound-recorderGnome 用于录制声音样本的前端。
kaudiocreator用于创建音频 CD 的 KDE 前端。
kmix用于声音设置的 KDE 前端。
krec用于录制声音样本的 KDE 前端。
mplayer多媒体播放器。
play用于播放声音样本的命令行工具。

11.6. 练习

  1. 从 Gnome 或 KDE 菜单中,打开你的声音配置面板。 确保音频盒或头戴式耳机已连接到你的系统,并找到适合你的输出音量级别。 确保在你的系统与 ALSA 兼容时,使用相应的面板。

  2. 如果你有麦克风,请尝试录制自己的声音样本。 确保输入音量不要太高,因为当你与他人交流时,这将导致高音调,或者将背景噪音传输给对方。 在命令行中,你甚至可以尝试使用 arecordaplay 来录制和播放声音。

  3. 找到你系统上的声音文件并尝试播放它们。

  4. 插入音频 CD 并尝试播放它。

  5. 找到一个聊天伙伴并配置一个 VoIP 程序。(你可能需要先安装一个。)

  6. 你可以收听网络广播吗?

  7. 如果你有 DVD 播放器和 DVD 光盘上的电影,请尝试播放它。


附录 A. 从这里开始?

本文概述了有用的书籍和网站。


A.1. 有用的书籍

A.1.1. 通用 Linux

  • Ellen Siever、Jessica P. Hackman、Stephen Spainhour、Stephen Figgins 著,“Linux in a Nutshell”,O'Reilly UK 出版,ISBN 0596000251

  • Matt Welsh、Matthias Kalle Dalheimer、Lar Kaufman 著,“Running Linux”,O'Reilly UK 出版,ISBN 156592469X

  • Tim Parker、Bill Ball、David Pitts 著,“Linux Unleashed”,Sams 出版,ISBN 0672316889

  • Linda Mui 著,“When You Can't Find Your System Administrator”,O'Reilly UK 出版,ISBN 1565921046

  • 当你实际购买发行版时,它会包含一个非常不错的用户手册。


A.1.2. 编辑器

  • Linda Lamb 和 Arnold Robbins 著,“Learning the Vi Editor”,O'Reilly UK 出版,ISBN 1565924266

  • Richard M.Stallman 著,“GNU Emacs Manual”,iUniverse.Com Inc. 出版,ISBN 0595100333

  • Debra Cameron、Bill Rosenblatt 和 Eric Raymond 著,“Learning GNU Emacs”,O'Reilly UK 出版,ISBN 1565921526

  • Tom Christiansen 和 Nathan Torkington 著,“Perl Cookbook”,O'Reilly UK 出版,ISBN 1565922433


A.1.3. Shells

  • Stephen G.Kochan 和 Patrick H.Wood 著,“Unix Shell Programming”,Sams Publishing 出版,ISBN 067248448X

  • Cameron Newham 和 Bill Rosenblatt 著,“Learning the Bash Shell”,O'Reilly UK 出版,ISBN 1565923472

  • Ellie Quigley 和 Scott Hawkins 著,“The Complete Linux Shell Programming Training Course”,Prentice Hall PTR 出版,ISBN 0130406767

  • David Tansley 著,“Linux and Unix Shell Programming”,Addison Wesley Publishing Company 出版,ISBN 0201674726

  • Gail 和 Paul Anderson 著,“Unix C Shell Field Guide”,Prentice Hall 出版,ISBN 013937468X


A.1.4. X Window

  • Gnome Community 著,“Gnome User's Guide”,iUniverse.Com Inc. 出版,ISBN 0595132251

  • Dave Nash 著,“KDE Bible”,Hungry Minds Inc. 出版,ISBN 0764546929

  • Aron HSiao 著,“The Concise Guide to XFree86 for Linux”,Que 出版,ISBN 0789721821

  • Bill Ball 著,“The New XFree86”,Prima Publishing 出版,ISBN 0761531521

  • Peter Wright 著,“Beginning GTK+ and Gnome”,Wrox Press 出版,ISBN 1861003811

  • David Sweet 和 Matthias Ettrich 著,“KDE 2.0 Development”,Sams Publishing 出版,ISBN 0672318911

  • Havoc Pennington 著,“GTK+/Gnome Application Development”,New Riders Publishing 出版,ISBN 0735700788


A.1.5. 网络

  • W. Richard Stevens 著,“TCP/IP Illustrated, Volume I: The Protocols”,Addison-Wesley Professional Computing Series 出版,ISBN 0-201-63346-9

  • Paul Albitz、Cricket Liu、Mike Loukides 和 Deborah Russell 著,“DNS and BIND”,O'Reilly & Associates 出版,ISBN 0596001584

  • Nicolai Langfeldt 著,“The Concise Guide to DNS and BIND”,Que 出版,ISBN 0789722739

  • Mark Wilcox 著,“Implementing LDAP”,Wrox Press 出版,ISBN 1861002211

  • Tim Howes 等人著,“Understanding and deploying LDAP directory services”,Sams 出版,ISBN 0672323168

  • Brian Costales 和 Eric Allman 著,“Sendmail”,O'Reilly UK 出版,ISBN 1565922220

  • Geoff Mulligan 著,“Removing the Spam : Email Processing and Filtering”,Addison Wesley Publishing Company 出版,ISBN 0201379570

  • Dianna & Kevin Mullet 著,“Managing IMAP”,O'Reilly UK 出版,ISBN 059600012X


A.2. 有用的网站

A.2.1. 通用信息


A.2.2. 特定架构参考

  • AlphaLinux:Alpha 架构上的 Linux(例如 Digital Workstation)

  • Linux-MIPS:MIPS 上的 Linux(例如 SGI Indy)

  • Linux on the Road:在笔记本电脑、PDA、手机等设备上安装和运行 Linux 的具体指南。各种型号的配置文件。

  • MkLinux:Apple 上的 Linux


A.2.3. 发行版


A.2.4. 软件


附录 B. DOS 与 Linux 命令

在本附录中,我们将 DOS 命令与其 Linux 等效命令进行了匹配。

作为对具有 Windows 背景的新用户的额外指导,下表列出了 MS-DOS 命令及其 Linux 对应命令。请记住,Linux 命令通常有许多选项。阅读 Info 或 man 页面以了解更多信息。

表 B-1. DOS/Linux 命令概述

DOS 命令Linux 命令
<command> /? man <command>command --help
cd cd
chdir pwd
cls clear
copy cp
date date
del rm
dir ls
echo echo
edit vim (或其他编辑器)
exit exit
fc diff
find grep
format mke2fs 或 mformat
mem free
mkdir mkdir
more more 甚至 less
move mv
ren mv
time date

附录 C. Shell 特性

本文概述了常见的 shell 特性(在每种 shell 风味中都相同)和不同的 shell 特性(特定于 shell 的特性)。


C.1. 常见特性

以下特性在每个 shell 中都是标准的。请注意,stop、suspend、jobs、bg 和 fg 命令仅在支持作业控制的系统上可用。

表 C-1. 常见 Shell 特性

命令含义
>重定向输出
>>追加到文件
<重定向输入
<<"Here" 文档(重定向输入)
|管道输出
&在后台运行进程。
;在同一行上分隔命令
*匹配文件名中的任何字符
?匹配文件名中的单个字符
[ ]匹配任何封闭的字符
( )在子 Shell 中执行
` `替换封闭命令的输出
" "部分引用(允许变量和命令扩展)
' '完全引用(无扩展)
\引用以下字符
$var使用变量的值
$$进程 id
$0命令名称
$n第 n 个参数(n 从 0 到 9)
$*所有参数作为单个词
# 开始注释
bg后台执行
break从循环语句中跳出
cd更改目录
continue恢复程序循环
echo显示输出
eval评估参数
exec执行新的 Shell
fg前台执行
jobs显示活动作业
kill终止正在运行的作业
newgrp更改到新的组
shift移动位置参数
stop挂起后台作业
suspend挂起前台作业
time为命令计时
umask设置或列出文件权限
unset擦除变量或函数定义
wait等待后台作业完成

C.2. 不同的特性

下表显示了标准 Shell (sh)、Bourne Again SHell (bash)、Korn shell (ksh) 和 C shell (csh) 之间的主要区别。

NoteShell 兼容性
 

由于 Bourne Again SHell 是 sh 的超集,因此所有 sh 命令也将在 bash 中工作,但反之则不然。 bash 有许多自己的特性,并且如下表所示,许多特性来自其他 shell。

由于 Turbo C shell 是 csh 的超集,因此所有 csh 命令都将在 tcsh 中工作,但反之则不然。

表 C-2. 不同的 Shell 特性

sh bash ksh csh 含义/动作
$$$%默认用户提示符
  >| >| >! 强制重定向
> file 2>&1 &> file > file 2>&1 > file 2>&1 >& file 将 stdout 和 stderr 重定向到file
  { }   { } 展开列表中的元素
`command` `command`$(command) $(command) `command` 替换封闭 command 的输出
$HOME $HOME $HOME $home 主目录
 ~~~主目录符号
  ~+, ~-, dirs ~+, ~- =-, =N 访问目录堆栈
var=value VAR=value var=value setvar=value 变量赋值
exportvar exportVAR=value exportvar=val setenvvar val 设置环境变量
  ${nnnn} ${nn}  可以引用超过 9 个参数
"$@""$@""$@" 所有参数作为独立的单词
$# $# $# $#argv 参数的数量
$? $? $? $status 最近执行的命令的退出状态
$! $! $!  最近后台进程的 PID
$- $- $-  当前选项
. file source file . file . file sourcefile 读取文件中的命令
  alias x='y' alias x=y alias x y 名称 x 代表命令 y
case case case switchcase选择替代方案
done done done end 结束循环语句
esac esac esac endsw 结束 caseswitch
exitn exitn exitn exit(expr) 以某个状态退出
for/do for/do for/do foreach 循环遍历变量
  set -f , set -o nullglob|dotglob|nocaseglob|noglob   noglob 忽略文件名生成的替换字符
hash hash alias-t hashstat 显示哈希命令(跟踪的别名)
hashcmds hashcmds alias-t cmds rehash 记住命令位置
hash-r hash-r   unhash 忘记命令位置
  history history history 列出以前的命令
  ArrowUp+Enter!! r !! 重做上一个命令
  !str rstr !str 重做以上以 "str" 开始的最后一个命令
  !cmd:s/x/y/ rx=y cmd !cmd:s/x/y/ 在以 "cmd" 开始的最近命令中,将 "x" 替换为 "y",然后执行。
if [$i-eq5 ] if [$i-eq5 ] if ((i==5)) if ($i==5) 条件测试示例
fi fi fi endif 结束 if 语句
ulimit ulimit ulimit limit 设置资源限制
pwd pwd pwd dirs 打印工作目录
read read read $< 从终端读取
trap2 trap2 trap2 onintr 忽略中断
  unalias unalias unalias 删除别名
until until until  开始 until 循环
while/do while/do while/do while 开始 while 循环

Bourne Again SHell 还有许多此处未列出的功能。 此表只是为了让您了解这个 shell 如何整合其他 shell 的所有有用思想:bash 列中没有空白。有关仅在 Bash 中找到的功能的更多信息,可以从 Bash 信息页面中的 "Bash Features" 部分检索。

更多信息

您至少应该阅读一本手册,即您的 shell 手册。 首选是 info bashbash 是 GNU shell,对于初学者来说最容易。 打印出来并带回家,每当您有 5 分钟时就学习它。

如果您在理解 shell 命令时遇到困难,请参阅 附录 B

词汇表

本节包含本文档中讨论的命令的按字母顺序排列的概述。

A

a2ps

格式化文件以便在 PostScript 打印机上打印,请参阅 第 8.1.2 节

acroread

PDF 查看器,请参阅 第 8.1.2.2 节

adduser

创建一个新用户或更新默认的新用户信息。

alias

为命令创建一个 shell 别名。

alsaconf

使用 ALSA 驱动程序配置声卡,请参阅 第 11.1.2 节

alsamixer

调整 ALSA 声音设备输出,请参阅 第 11.2.2.3 节

anacron

定期执行命令,不假定机器持续运行。

apropos

在 whatis 数据库中搜索字符串,请参阅 第 2.3.3.2 节

apt-get

APT 包处理实用程序,请参阅 第 7.5.3.2 节

arecord

录制声音样本,请参阅 第 11.2.3 节

aspell

拼写检查器。

at, atq, atrm

队列、检查或删除稍后执行的作业,请参阅 第 4.1.2.2 节第 4.4.3 节

aumix

调整音频混音器,请参阅 第 11.2.2.3 节

(g)awk

模式扫描和处理语言。

B

bash

Bourne Again SHell,请参阅 第 3.2.3.2 节第 7.2.5 节

batch

队列、检查或删除稍后执行的作业,请参阅 第 4.1.2.2 节

bg

在后台运行作业,请参阅 第 4.1.2.1 节

bitmap

用于 X 窗口系统的位图编辑器和转换器实用程序。

bzip2

块排序文件压缩器,请参阅 第 9.1.1.3 节

C

cardctl

管理 PCMCIA 卡,请参阅 第 10.2.3.3 节

cat

连接文件并打印到标准输出,请参阅 第 2.2 节第 3.2.4 节

cd

更改目录,请参阅 第 2.2 节

cdp/cdplay

一个交互式文本模式程序,用于控制和播放 Linux 下的音频 CD Rom,请参阅 第 11.2.1 节

cdparanoia

一种音频 CD 读取实用程序,包括额外的数据验证功能,请参阅 第 11.2.1 节

cdrecord

记录 CD-R,请参阅 第 9.2.2 节

chattr

更改文件属性。

chgrp

更改组所有权,请参阅 第 3.4.2.3 节

chkconfig

更新或查询系统服务的运行级别信息,请参阅 第 4.2.5.1 节

chmod

更改文件访问权限,请参阅 第 3.4.1 节, 第 3.4.2.1 节第 3.4.2.4 节

chown

更改文件所有者和组,请参阅 第 3.4.2.3 节

compress

压缩文件。

cp

复制文件和目录,请参阅 第 3.3.2 节

crontab

维护 crontab 文件,请参阅 第 4.4.4 节

csh

打开一个 C shell,请参阅 第 3.2.3.2 节

cut

从文件的每一行中删除节,请参阅 第 7.2.5.2 节

D

date

打印或设置系统日期和时间。

dd

转换和复制文件(磁盘转储),请参阅 第 9.2.1.2 节

df

报告文件系统磁盘使用情况,请参阅 第 3.1.2.3 节

dhcpcd

DHCP 客户端守护程序,请参阅 第 10.3.8 节

diff

查找两个文件之间的差异。

dig

将域名查询数据包发送到名称服务器,请参阅 第 10.2.6.1 节

dmesg

打印或控制内核环形缓冲区。

du

估计文件空间使用情况。

dump

备份文件系统,请参阅 第 9.2.5 节

E

echo

显示一行文本,请参阅 第 3.2.1 节

ediff

Diff 到英语翻译器。

egrep

扩展 grep。

eject

卸载并弹出可移动介质,请参阅 第 7.5.5.2 节

emacs

启动 Emacs 编辑器,请参阅 第 6.1.2.1 节

exec

调用子进程,请参阅 第 4.1.5.1 节

exit

退出当前 shell,请参阅 第 2.2 节

export

将函数添加到 shell 环境,请参阅 第 3.2.1 节, 第 7.2.1.2 节第 7.2.4.2 节

F

fax2ps

将 TIFF 传真转换为 PostScript,请参阅 第 8.1.2 节

fdformat

格式化软盘,请参阅 第 9.2.1.1 节

fdisk

Linux 的分区表操作器,请参阅 第 3.1.2.2 节

fetchmail

从支持 POP、IMAP、ETRN 或 ODMR 的服务器获取邮件,请参阅 第 10.3.2.3 节

fg

将作业放在前台运行,请参阅 第 4.1.2.1 节

file

确定文件类型,请参阅 第 3.3.1.2 节

find

查找文件,请参阅 第 3.3.3.3 节

firefox

Web 浏览器,请参阅 第 10.3.3.2 节

fork

创建一个新进程,请参阅 第 4.1.5.1 节

formail

邮件(重新)格式化程序,请参阅 第 10.3.2.3 节

fortune

打印一个随机的、希望是有趣的格言。

ftp

传输文件(除非使用匿名帐户,否则不安全!)服务,请参阅 第 10.3.4.2 节

G

galeon

图形化 Web 浏览器。

gdm

Gnome 显示管理器,请参阅 第 4.2.4 节

gedit

GUI 编辑器,请参阅 第 6.3.3.3 节

(min/a)getty

控制控制台设备。

gimp

图像处理程序。

gpg

加密、检查和解密文件,请参阅 第 9.4.1.2 节

grep

打印匹配模式的行,请参阅 第 3.3.3.4 节第 5.3.1 节

groff

使用 groff 模拟 nroff 命令,请参阅 第 8.1.2 节

grub

grub shell,请参阅 第 4.2.3 节第 7.5.4 节

gv

PostScript 和 PDF 查看器,请参阅 第 8.1.2.2 节

gvim

vIm 编辑器的图形化版本,参见第 6.3.3.3 节

gzip

压缩或解压缩文件,参见第 9.1.1.3 节

H

halt

停止系统,参见第 4.2.6 节

head

输出文件的开头部分,参见第 3.3.4.3 节

help

显示 shell 内建命令的帮助信息。

host

DNS 查询工具,参见第 10.2.6.1 节

httpd

Apache 超文本传输协议服务器,参见第 10.2.3.1 节

I

id

打印实际和有效的 UID 和 GID,参见第 3.4.1 节

ifconfig

配置网络接口或显示配置信息,参见第 10.1.2.3 节

info

阅读 Info 文档,参见第 2.3.3.1 节

init

进程控制初始化,参见第 4.1.5.1 节第 4.2.4 节第 4.2.5 节

insserv

管理 init 脚本,参见第 4.2.5.1 节

iostat

显示 I/O 统计信息,参见第 4.3.5.4 节

ip

显示/更改网络接口状态,参见第 10.1.2.3 节

ipchains

IP 防火墙管理,参见第 10.4.4.2 节

iptables

IP 包过滤管理,参见第 10.4.4.2 节

J

jar

Java 归档工具,参见第 9.1.1.4 节

jobs

列出后台任务。

K

kdm

KDE 的桌面管理器,参见第 4.2.4 节

kedit

KDE 图形编辑器,参见第 6.3.3.3 节

kill(all)

终止进程,参见第 4.1.2.1 节

konqueror

文件管理器,(帮助)浏览器,参见第 3.3.2.1 节

ksh

打开 Korn shell,参见第 3.2.3.2 节

kwrite

KDE 图形编辑器,参见第 6.3.3.3 节

L

less

具有更多功能的 more,参见第 3.3.4.2 节

lilo

Linux 引导加载程序,参见第 4.2 节

links

文本模式 WWW 浏览器,参见第 10.2.3.2 节

ln

在文件之间创建链接,参见第 3.3.5 节

loadkeys

加载键盘转换表,参见第 7.4.1 节

locate

查找文件,参见第 3.3.3.3 节第 4.4.4 节

logout

关闭当前 shell,参见第 2.1.3 节

lp

向 LP 打印服务发送请求,参见第 8.1 节

lpc

行式打印机控制程序,参见第 8.1 节

lpq

打印假脱机队列检查程序,参见第 8.1 节

lpr

脱机打印,参见第 8.1 节

lprm

删除打印请求,参见第 8.1 节

ls

列出目录内容,参见第 2.2 节第 3.1.1.2 节第 3.3.1.1 节

lynx

文本模式 WWW 浏览器,参见第 10.2.3.2 节

M

mail

发送和接收邮件,参见第 10.3.2.3 节

man

阅读 man 手册页,参见第 2.3.2 节

mc

Midnight Commander,文件管理器,参见第 3.3.2.1 节

mcopy

在 Unix 和 MSDOS 文件之间复制文件。

mdir

显示 MSDOS 目录。

memusage

显示内存使用情况,参见第 4.3.5.3 节

memusagestat

显示内存使用统计信息,参见第 4.3.5.3 节

mesg

控制对您的终端的写入访问权限,参见第 4.1.6 节

mformat

向低级格式化的软盘添加 MSDOS 文件系统,参见第 9.2.1.1 节

mkbootdisk

为运行的系统创建独立的引导软盘。

mkdir

创建目录,参见第 3.3.2 节

mkisofs

创建混合 ISO9660 文件系统,参见第 9.2.2 节

mplayer

Linux 的电影播放器/编码器,参见第 11.2.2 节第 11.3 节

more

用于一次显示一屏文本的过滤器,参见第 3.3.4.2 节

mount

挂载文件系统或显示有关已挂载文件系统的信息,参见第 7.5.5.1 节

mozilla

Web 浏览器,参见第 10.2.3.2 节

mt

控制磁带驱动器操作。

mtr

网络诊断工具。

mv

重命名文件,第 3.3.2 节

N

named

Internet 域名服务器,参见第 10.3.7 节

nautilus

文件管理器,参见第 3.3.2.1 节

ncftp

ftp 服务的浏览器程序(不安全!),参见第 10.3.4.2 节

netstat

打印网络连接、路由表、接口统计信息、伪装连接和多播成员资格,参见第 10.1.2.5 节第 10.4.2 节

newgrp

登录到另一个组,参见第 3.4.2.2 节

nfsstat

打印有关联网文件系统的统计信息。

nice

以修改后的调度优先级运行程序,参见第 4.3.5.1 节

nmap

网络探索工具和安全扫描器。

ntpd

网络时间协议守护进程,参见第 7.4.3 节

ntpdate

通过 NTP 服务器设置日期和时间,参见第 7.4.3 节

ntsysv

用于配置运行级别的简单界面,参见第 4.2.5.1 节

O

ogle

支持 DVD 菜单的 DVD 播放器,参见第 11.3 节

P

passwd

更改密码,参见第 2.2 节第 4.1.6 节

pccardctl

管理 PCMCIA 卡,请参阅 第 10.2.3.3 节

pdf2ps

Ghostscript PDF 到 PostScript 转换器,参见第 8.1.2 节

perl

实用提取和报表语言。

pg

分页显示文本输出,参见第 3.3.4.2 节

pgrep

根据名称和其他属性查找进程,参见第 4.1.4 节

ping

向主机发送回显请求,参见第 10.2.6.2 节

play

播放声音样本,参见第 11.2.3 节

pr

转换文本文件以进行打印。

printenv

打印全部或部分环境,参见第 7.2.1 节

procmail

自主邮件处理器,参见第 10.3.2.3 节

ps

报告进程状态,参见第 4.1.4 节第 4.3.5.4 节

pstree

显示进程树,参见第 4.1.4 节

pwd

打印当前工作目录,参见第 2.2 节

Q

quota

显示磁盘使用情况和限制,参见第 3.2.3.3 节

R

rcp

远程复制(不安全!)

rdesktop

远程桌面协议客户端,参见第 10.4.6 节

reboot

停止系统,参见第 4.2.6 节

recode

将文件转换为另一种字符集,参见第 7.4.4 节

renice

更改正在运行的进程的优先级,参见第 4.3.5.1 节

restore

恢复使用 dump 创建的备份,参见第 9.2.5 节

rlogin

远程登录(telnet,不安全!),参见第 10.4.2 节第 10.5.2 节

rm

删除文件,参见第 3.3.2 节

rmdir

删除目录,参见第 3.3.2.2 节

roff

roff 排版系统的调查,参见第 8.1.2 节

rpm

RPM 软件包管理器,参见第 7.5.2.1 节

rsh

远程 shell(不安全!),参见第 10.4.2 节

rsync

同步两个目录,参见第 9.3 节

S

scp

安全远程复制,参见第 10.4.4.1 节

screen

带有VT100仿真的屏幕管理器,请参见第 4.1.2.1 节

set

显示、设置或更改变量。

setterm

设置终端属性。

sftp

安全(加密)ftp,请参见第 10.4.4.1 节

sh

打开一个标准 shell,请参见第 3.2.3.2 节

shutdown

关闭系统,请参见第 4.2.6 节

sleep

等待指定的时间段,请参见第 4.4.1 节

slocate

GNU Locate 的安全增强版本,请参见第 3.3.3.3 节

slrnn

文本模式 Usenet 客户端,请参见第 10.2.6 节

snort

网络入侵检测工具。

sort

对文本文件中的行进行排序,请参见第 5.3.2 节

spell

拼写检查器,请参见第 5.1.2.3 节

ssh

安全 shell,请参见第 10.4.4.1 节

ssh-keygen

身份验证密钥生成、管理和转换,请参见第 10.4.4.5 节

stty

更改和打印终端行设置。

su

切换用户,请参见第 3.2.1 节第 7.5.3.2 节第 10.4.6 节

T

tac

连接并以相反的顺序打印文件,请参见cat

tail

输出文件的最后一部分,请参见第 3.3.4.3 节

talk

与用户交谈。

tar

归档实用程序,请参见第 9.1.1.1 节

tcsh

打开一个 Turbo C shell,请参见第 3.2.3.2 节

telinit

进程控制初始化,请参见第 4.2.5 节

telnet

TELNET 协议的用户界面(不安全!),请参见第 10.4.2 节

tex

文本格式化和排版,请参见第 8.1.2 节

time

为一个简单的命令计时或给出资源使用情况,请参见第 4.3.2 节

tin

新闻阅读程序,请参见第 10.2.6 节

top

显示 CPU 占用率最高的进程,请参见第 4.1.4 节第 4.3.5.3 节第 4.3.5.4 节

touch

更改文件时间戳,请参见第 7.1.2 节

traceroute

打印数据包到达网络主机的路由,请参见第 10.2.6.3 节

tripwire

用于 UNIX 系统的文件完整性检查器,请参见第 10.4.5 节

troff

格式化文档,请参见第 8.1.2 节

tvime

高质量电视应用程序。

twm

X Window 系统的 Tab Window Manager。

U

ulimit

控制资源,请参见第 7.1.2.5 节

umask

设置用户文件创建掩码,请参见第 3.4.2.2 节

umount

卸载文件系统。

uncompress

解压缩压缩文件。

uniq

从已排序的文件中删除重复的行,请参见第 5.3.2 节

up2date

更新 RPM 包,请参见第 7.5.3.3 节

update

内核守护程序,用于将脏缓冲区刷新回磁盘。

update-rc.d

配置 init 脚本,请参见第 4.2.5.1 节

uptime

显示系统运行时间和平均负载,请参见第 4.1.4 节第 4.3.5.2 节

urpmi

更新 RPM 包,请参见第 7.5.3.3 节

userdel

删除用户帐户和相关文件。

V

vi(m)

启动 vi(改进版)编辑器,请参见第 6.1.2.2 节

vimtutor

Vim 教程。

vmstat

报告虚拟内存统计信息,请参见第 4.3.5.4 节

W

w

显示谁已登录以及他们在做什么。

wall

向每个人的终端发送消息,请参见第 4.1.6 节

wc

打印文件中的字节数、字数和行数,请参见第 3.2.1 节

which

显示(shell)命令的完整路径,请参见第 3.2.1 节第 3.3.3.2 节

who

显示谁已登录,请参见第 4.1.6 节

who am i

打印有效用户 ID。

whois

查询 whois 或 nicname 数据库,请参见第 10.2.6.4 节

write

向另一个用户发送消息,请参见第 4.1.6 节

X

xargs

从标准输入构建和执行命令行,请参见第 3.3.3.3 节

xauth

X 授权文件实用程序。

xawtv

用于观看电视的 X11 程序。

xcdroast

cdrecord 的图形前端,请参见第 9.2.2 节

xclock

X 的模拟/数字时钟。

xconsole

使用 X 监视系统控制台消息。

xdm

X 显示管理器,支持 XDMCP、主机选择器,请参见第 4.2.4 节第 7.3.2 节

xdvi

DVI 查看器,请参见第 8.1.2.2 节

xedit

X Window 图形编辑器,请参见第 6.3.3.3 节

xfs

X 字体服务器。

xhost

X 的服务器访问控制程序,请参见第 10.4.3.2 节

xine

一个免费的视频播放器,请参见第 11.3 节

xinetd

扩展的 Internet 服务守护程序,请参见第 10.3.1.2 节

xload

X 的系统负载平均值显示,请参见第 4.3.5.6 节

xlsfonts

X 的服务器字体列表显示器。

xmms

X 的音频播放器,请参见第 11.2.2.1 节

xpdf

PDF 查看器,请参阅 第 8.1.2.2 节

xterm

X 的终端模拟器。

Y

yast

Novell SuSE Linux 上的系统管理工具。

yum

更新 RPM 包,请参见第 7.5.3.3 节

Z

zapping

Gnome 环境的电视查看器。

zcat

压缩或解压缩文件。

zgrep

在可能已压缩的文件中搜索正则表达式。

zmore

用于查看压缩文本的过滤器。


索引