linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 linux...

129
1 Linux shell和基本指令 1.1 Linux和shell 1.2 Linux环境 1.3 shell脚本编程基础知识 1.4 Linux目录操作 1.5 I/O重定向和管道 1.6 文件访问权限 1.7 作业控制 1.8 系统管理员指令总结

Upload: others

Post on 14-Sep-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

第 1 章

Linux shell和基本指令

1.1 Linux和shell

1.2 Linux环境

1.3 shell脚本编程基础知识

1.4 Linux目录操作

1.5 I/O重定向和管道

1.6 文件访问权限

1.7 作业控制

1.8 系统管理员指令总结

Page 2: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

2 第 1 章 Linux shell 和基本指令

1.1 Linux 和 shell

我将通过本书与各位Linux爱好者一同学习Linux shell脚本编程知识。开始前需要选择Linux

发行版本,我选择了用社区公开版本重建Red Hat Enterprise(Linux企业版服务器)后公布的

CentOS 5.3版本。 当然也可以选择其他发行版本,但不同发行版本在启动上会略有差异。

图1-1 使用putty连接ssh

在Linux服务器上进行shell脚本操作时,多数人通常会利用ssh(默认22号端口,Secure shell)

进行远程连接。本书将利用ssh连接工具之一的开放源代码软件putty,通过ssh端口连接到Linux

服务器并执行所有操作。本书通过展示简要的示例及运行结果,让Linux爱好者能够完全掌握各

种Linux命令和语法。

通过下列网站可下载并安装基于Windows的ssh登录软件putty。当然也可以直接通过Linux自

带的系统控制台进行登录。

(putty韩文版:http://kldp.net/projects/iputty)

putty英文版:http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

首先,在用户主目录下的.vimrc文件中对vim编辑器进行默认设置。

[root@localhost ~]# vim ~/.vimrc

syntax on

set tabstop=4

set shiftwidth=4

set smartindent

set cindent

[root@localhost ~]#

各选项详解如下。

syntax on:启动语法高亮,也就是按编程语言的语法对代码进行彩色标示。

Page 3: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.1 Linux 和 shell 3

1

2

3

4

5

8

6

7

set tabstop=4:将Tab指定为4个空格字符,默认值是8个空格字符。

set shiftwidth=4:shift移动时(<<、>>)使用4个空格字符,默认值是8。

set smartindent:按Enter键移动到下一行时自动缩进。

set cindent:编写C语言代码时自动匹配C语法形式。

如果不清楚vim的基本用法,可先参考第8章。

下面设置日期格式。安装CentOS版本的初始阶段,使用“ls-l”命令显示的文件目录日期是“xx

月xx时:分”的形式。与上述格式相比,xxxx-xx-xx日期格式可读性更好,因此,对ls命令应用alias

命令,改为long-iso格式,color选项指定为auto。(alias ls='ls--color=auto --time-style=long-iso')

[root@localhost ~]# ls -l

合计68

-rw------- 1 root root 1142 5月 23 05:08 anaconda-ks.cfg

-rw-r--r-- 1 root root 32811 5月 23 05:08 install.log

-rw-r--r-- 1 root root 4730 5月 23 05:07 install.log.syslog

-rw-r--r-- 1 root root 199 5月 23 05:13 scsrun.log

[root@localhost ~]#

ls命令用来显示文件和文件夹,-l(小写字母l)选项显示长格式(long listing format)。

如图1-2所示,在/etc/bashrc文件添加alias命令的原因在于,Linux系统中,用户登录时自动读

取/etc/bashrc文件。第2章将详细讲解用户登录机制。

图 1-2

alias(别名)用简短的名称代替具有多种选项功能的命令,如同Windows中的桌面图标。此

功能与桌面图标功能类似,在Linux文件/文件夹中通常称为符号链接(symbolic link)。后面将具

体讲述符号链接和硬链接 (hardlink)的相关概念,本章只需了解一下即可。

[root@localhost ~]# vim /etc/bashrc

Page 4: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

4 第 1 章 Linux shell 和基本指令

使用vim编辑器修改后按Esc键,使用“:wq”命令保存文件并退出,返回shell执行下一命令。

[root@localhost ~]# source /etc/bashrc

[root@localhost ~]# ls -l

合计68

-rw------- 1 root root 1142 2009-05-23 05:08 anaconda-ks.cfg

-rw-r--r-- 1 root root 32811 2009-05-23 05:08 install.log

-rw-r--r-- 1 root root 4730 2009-05-23 05:07 install.log.syslog

-rw-r--r-- 1 root root 199 2009-05-23 05:13 scsrun.log

[root@localhost ~]#

然后执行“ls-l”命令就会显示xxxx-xx-xx日期格式。

后还要设置语言。安装中文版CentOS时,LANG环境变量值是zh_CN.UTF8, 需要将root用

户的变量值改为en_US.UTF8。也就是说,使用root用户登录shell时,语言显示为英文。特别是打

开帮助页面时,设置为英文可获得更详细的信息。此外,执行yum grouplist、yum groupinstall等

命令时, 好以英文输出软件包的名称;安装远程rpm软件包时,也需要使用英文。因此,请将

语言集设置为英文。无论怎样,使用root用户登录shell时,语言集请选择英文UTF8。如果需要在

英语环境下查看中文帮助页面,可以先将当前shell的LANG环境变量值设置为zh_CN.UTF8,然后

执行“man 命令”即可。若一定要查看中文帮助页面,则以普通用户的身份登录。

要想使用英文UTF8语言集,只需在root用户目录(/root).bashrc文件下添加LANG=en_US.UTF-8,

从下次登录起LANG环境变量值就会自动修改。也可直接用source .bashrc立即加载 新设置。

[root@localhost ~]# env|grep LANG

LANG=zh_CN.UTF-8

[root@localhost ~]# vim ~/.bashrc

图 1-3

Page 5: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.1 Linux 和 shell 5

1

2

3

4

5

8

6

7

[root@localhost ~]# source ~/.bashrc

[root@localhost ~]# env|grep LANG

LANG=en_US.UTF8

[root@localhost ~]# ls -l

total 68

-rw------- 1 root root 1142 2009-05-23 05:08 anaconda-ks.cfg

-rw-r--r-- 1 root root 32811 2009-05-23 05:08 install.log

-rw-r--r-- 1 root root 4730 2009-05-23 05:07 install.log.syslog

-rw-r--r-- 1 root root 199 2009-05-23 05:13 scsrun.log

[root@localhost ~]#

之前ls -l命令运行结果“合计”部分显示为中文,但设置英文语言环境后就显示为“total”。

结束以上3个操作后,退出系统重新登录,确认日期格式变化与否、文本是否显示为英文。

以后会逐一讲解为何修改默认环境变量值。

shell是操作系统提供的命令执行程序,即命令解析器。为操作系统(OS)管理下的文件、打

印机、硬件设备和应用程序之间提供交互界面(沟通渠道)。换言之,在shell平台上执行接收的

各种命令,操作系统就完成相应任务。

POSIX的定义

为了向不同操作系统和程序提供软件标准,POSIX(Portable Operating System Interface ,

可移植性操作系统接口,又称开放系统标准)开始得到广泛应用,它由IEEE(the Institute of

Electrical and Electronic Engineering,电子和电气工程师协会)开发,由ISO(the International

Organization for Standardization,国际标准化组织)标准化。 初开发POSIX标准是为了提高

不同系统环境下应用程序的可移植性,以及提供UNIX-like计算机环境。所以,在某个系统

上编写的新程序也应当能够在其他系统中进行编译并运行。例如,在BSD UNIX系统上开发

的程序也能在Solaris、Linux、HP-UX等系统中运行。

为了提供C语言标准,1998年正式通过了POSIX 1003.1标准。为开发移植性较好的shell

脚本,POSIX集团在1992年通过了针对shell和实用工具的IEEE 1003.2标准。很多UNIX销售

商以POSIX标准定位,但是它没有强制性。POSIX委员会提出“POSIX compliancy”(遵守、

依据POSIX)这一表达以探讨shell和一般UNIX实用工具,在新的实用工具或环境中添加环

境时要根据标准执行。例如,后面要学的Bash shell就具有100%的可移植性。

1974年,Steven R. Bourne创建了 早的Unix shell——Bourne shell(或叫sh),默认使用美

元($)提示符。它属于Linux系统中GNU项目的一部分,后来陆续出现速度更快、功能更强大的

新版本。Bourne shell的更新版本为Bash(Bourne Again shell)。因此,目前Linux发行版本都默认

配置Bash shell。

Page 6: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

6 第 1 章 Linux shell 和基本指令

shell脚本(shell script)是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

化。而且在应用默认指令的同时,使用if语句、test语句或loop语句等shell内置指令(built-in)。shell

脚本广泛应用于系统管理员的相关工作和重复操作。

[root@localhost ~]# du -h * | sort -nr > $HOME/script.txt

[root@localhost ~]# ls

anaconda-ks.cfg install.log install.log.syslog script.txt scsrun.log

[root@localhost ~]# cat script.txt

40K install.log

12K install.log.syslog

8.0K scsrun.log

8.0K anaconda-ks.cfg

0 script.txt

[root@localhost ~]#

进入Bash shell后,首先如上显示[root@localhost]#格式的字符串,表示“当前作为root用户进

入‘localhost’主机”。

Bash shell提示符上显示的默认字符串如图1-4所示。

图 1-4

刚刚执行的shell命令解析如下:

[root@localhost ~]# du –h * | sort –nr >$HOME/script.txt

du指令用于查询文件使用空间, “|”符号(键盘上位于“\”上方的字符)传递指令,将前面

的运行结果作为sort –nr命令的输入进行传递。sort指令以字母表或数字为准进行排序,“>”输出

重定向(redirection)是指将上一个命令结果保存到指定文件名。利用cat命令调出创建的script.txt

文件,可以看出,文件列表确实根据文件使用空间大小降序排列。

sort命令的-n(--numeric-sort)选项根据数值进行升序排列,-r选项具有逆向排序功能

(--reserve),用于降序排列。因为同时使用了以上2个选项,所以得出以数值为准的降序运行结果。

Linux Bash shell中,$表示普通用户,#表示超级用户(root)。

Page 7: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.1 Linux 和 shell 7

1

2

3

4

5

8

6

7

[multi@localhost ~]$ echo "Linux shell Script"

Linux shell Script

[multi@localhost ~]$ su -

密码:

[root@localhost ~]# echo "Linux shell Script"

Linux shell Script

[root@localhost ~]#

以上示例中,echo命令将字符串输出到显示器,su -命令能将普通用户转为超级用户,使用

“-” 选项能传递所转用户的所有环境变量。也就是说,用户转换操作(su)能传递所有环境变量

值,重新登录shell。(su:substitute)

Bash shell以Bourne shell为基础,可执行/bin/sh或/bin/bash。也可使用“./脚本文件名”格式执

行脚本,但使用“./脚本文件名”格式需要满足条件:对当前shell用户赋予执行权限。后面将详

解关于文件执行和访问权限的问题,先看图1-5。

图1-5 执行Bourne shell脚本

下列vim编辑器用法请参考第8章。

[root@localhost ~]# vim shelltest.sh

#!/bin/bash

echo "This is shell test!"

[root@localhost ~]# ls -l shelltest.sh

-rw-r--r-- 1 root root 40 2009-07-15 07:24 shelltest.sh

[root@localhost ~]# /bin/sh shelltest.sh

This is shell test!

[root@localhost ~]# /bin/bash shelltest.sh

This is shell test!

[root@localhost ~]# ./shelltest.sh

-bash: ./shelltest.sh: Permission denied

[root@localhost ~]# chmod 755 shelltest.sh

[root@localhost ~]# ls -l shelltest.sh

-rwxr-xr-x 1 root root 40 2009-07-15 07:24 shelltest.sh

[root@localhost ~]# ./shelltest.sh

This is shell test!

[root@localhost ~]#

Page 8: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

8 第 1 章 Linux shell 和基本指令

编写shell脚本时,需要根据顶端信息内容设置执行语言:Bourne shell时输入#!/bin/sh,Bash

shell时输入#!/bin/bash,Python时输入#!usr/bin/python,Perl时输入#!usr/bin/perl。偶尔会使用

#!/bin/env bash格式,这是为了自动检索Bash可执行文件。为了执行已创建的shell脚本,即使未获

得执行许可,也可直接指定shell以运行。但 正确的方法还是应该先赋予shell脚本执行权限许可。

[root@localhost ~]# which bash /bin/bash [root@localhost ~]# whereis bash bash: /bin/bapsh /usr/share/man/man1/bash.1.gz [root@localhost ~]# which python /usr/bin/python [root@localhost ~]# which perl /usr/bin/perl [root@localhost ~]#

在指定到环境变量的PATH变量路径中检索可执行文件名时,使用“which 可执行文件名”格

式。whereis命令用于检索可执行文件、源代码文件、帮助文件在文件系统中的位置等。也可如下

使用find命令。

[root@localhost ~]# find /bin -name bash -exec ls -l '{}' \; -rwxr-xr-x 1 root root 735004 Jan 22 10:14 /bin/bash [root@localhost ~]#

1.2 Linux 环境 1.2.1 Linux诞生

当年还是芬兰赫尔辛基大学学生的林纳斯·托瓦兹(Linus Torvalds)课余时间小试牛刀,结

果促成了Linux的诞生。①当时,托瓦兹对Unix的一个克隆版本Minix兴趣浓厚,为使其更便于使

用,他开始钻研开发。随着1991年0.02版本的正式发布,很多开发者都共同参与到开发工作当中,

于1994年发布了1.0版本。

图1-6 作者与托瓦兹(2002年)

—————————— ① 可参考由人民邮电出版社出版的《只是为了好玩:Linux之父林纳斯自传》一书。——编者注

Page 9: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.2 Linux 环境 9

1

2

3

4

5

8

6

7

Linux是开源的,全世界程序员都可以参与开发工作,现在也在陆续发布各类发行版本。

Redhat Enterprise Linux (http://www.redhat.com)

CentOS Linux (http://www.centos.org)

Fedora Linux (http://www.fedoraproject.org)

Debian Linux (http://www.debian.org)

Ubuntu Linux (http://www.ubuntu.com)

Mandriva Linux (http://www.mandriva.com)

Open Suse Linux (http://www.opensuse.org)

除以上这些具有代表性的例子之外,还有很多其他发行版本。如前所述,本书使用的是目前

应用 广的免费CentOS(Community Enterprise Operating System)Linux版本。

1.2.2 Linux的特征

1. 免费/自由 Linux是一款免费的操作系统,购买OS无需另外付费。购买Windows、商用Unix时还需要支

付OS本身的费用,但Linux用户就不用再支付了。若想获得有形媒介,只要支付此项成本即可;

若想享受维护等服务,可以找提供服务的企业。

另外,Linux在使用上还是自由的。用户可以任意下载其源代码,并根据自己的兴趣进行修改。

此外,Linux还具有许多自由软件编程语言和开发工具等应用程序,大部分软件均适用GNU

通用公共许可(GNU Public License, GPL)。 、

GNU不是UNIX

GNU程序不是完全免费的,程序员有权利为自己付出的努力获得报酬。因此,GNU程

序可以进行市场销售。不过,收费行为并不意味着要阻止无购买能力的人们使用,同时也允

许其他程序员使用时对原程序进行修改。

2. 类Unix 1964年,Bell LAB和MIT & GENERAL ELECTRICS合作开发了MULTICS(Multiplexed

Information and Computing System,多路信息与计算系统)OS发行版,但不是很成功。1969年,

Bell LAB职员肯·托马森(Ken Thompson)开发了载有汇编语言和几种实用工具的PDP - 7 Computer

OS,后来发展为Unix。但它的可移植性不够好,后来利用C语言重新进行编写(1970~1971年)。

Page 10: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

10 第 1 章 Linux shell 和基本指令

之后,Unix在大学里发布,得到学生和教授们的广泛应用,人气很高,并增加了新的特性和功能。

美国军队使用Unix统一网络,这个网络逐渐发展为今天的因特网(Internet)。

Unix是支持多用户、多任务处理的网络操作系统,Linux是一种类Unix的操作系统,具有如

下特征:

由C语言编写而成。

Linux是支持多用户、多任务处理系统的网络操作系统。

适合编程开发环境。

支持各种硬件平台。

Inter x86 processor(Celeron/PII/PIII/PIV/Old-Pentiums/80386/80486)

Macintosh PC

Cyrix processor

AMD processor

Sun Microsystems Sparc processor

Alpha Processor(Compaq)

3. 开源 Linux的开发基于GNU通用公共许可,是一种GPL,用Copyleft标记,以与普通的Copyright区分。

用GPL开发的源代码向所有人公开,但有限制条件:若通过GPL对已公开的程序源代码进行

更改,则必须向所有人公开源代码。(http://www.opensource.org)

Linux特征及用途总结

Linux是面向网络的操作系统,广泛用于服务器操作领域,具有如下特征。

稳定性(Stable)

坚固性(Robust)

安全性(Secure)

高性能(High Performance)

Linux应用范围如下。

台式电脑

Web服务器

软件开发工作平台

网络监控工作平台

工作组服务器

杀手级网络服务(DHCP、Masquerade、Firewall、Router、FTP、SSH、Mail、Proxy、

Proxy Cache server等)

Page 11: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.2 Linux 环境 11

1

2

3

4

5

8

6

7

1.2.3 vi(m)编辑器

Linux中有vi(m)、pico、nano、ed等多种文本编辑器,但默认使用vi(m)编辑器。表1-1整理了

vi(m)基础命令。第8章将详细说明vi(m)编辑器的高阶使用方法。

图1-7 vi/etc/init.d/sshd

表1-1 vi(m)基本命令 vi(m)命令用途 vi(m)Syntax

插入文本 <Esc> + i

保存文件 <Esc> + : + w

指定文件名并保存 <Esc> + : + w “文件名”

退出vi编辑器 <Esc> + : + q

退出编辑器,放弃保存 <Esc> + : + q!

保存修改并退出 <Esc> + : + wq

向前(向下)搜索字符 <Esc> +/字符

向下(向上)继续检索 n[N]

向后(向上)搜索字符 <Esc> + ?字符

在当前光标位置复制一行 <Esc> + yy

粘贴到当前光标处 <Esc> + p

删除光标所在行 <Esc> + dd

从光标所在位置起删除光标右侧的单词 <Esc> + dw

查找字符并替换 <Esc> + :%s/检索字符/替换字符/g

例):%s/linux/centos/g

查找字符并替换(确认操作) esc + :%s/检索字符/替换字符/cg

在vi(m)下执行cp、date等shell命令 esc + :!shell命令

例):!pwd

Page 12: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

12 第 1 章 Linux shell 和基本指令

1.2.4 Linux中的文件和文件系统

与Windows一般用C、D、E进行分区不同,Linux是根据目录分区的。

Linux顶端目录(根目录)用“/”表示,下一级用/root、/user、/etc、/boot、/tmp等划分。每

个目录也可由分区组成,一个分区就是一个目录。使用mount命令将分区映射到目录。目录中的

硬盘等设备相关文件位于/dev目录,可通过该目录确认各种设备已映射到设备文件。字符设备文

件是shell编程中不可或缺的一种设备文件。

例如,/dev/null设备文件是一个“黑洞”,所有写入它的字符都会清空(empty)。/dev/zero设

备文件包含无数个0,用0填充生成的新文件。

表1-2 /dev目录设备

设 备 名 用 途 /dev/tty 正在运行程序的终端窗口或控制台

/dev/dsp 在声卡上执行AU声音文件的界面

/dev/fd0 第一个软驱

/dev/hda1 IDE硬盘的第一个分区

/dev/sda1 SCSI、S-ATA硬盘的第一个分区

Linux的分区是/dev/hda1、/dev/hda2等格式,可在硬盘中组成多个分区,命名IDE硬盘时使用

/dev/hda、/dev/hdb、/dev/hdc等格式。SCSI、S-ATA硬盘使用/dev/sda、/dev/sdb、/dev/sdc等格式。

利用mount命令将/dev/hda1分区挂载到/backup目录的输入方法如下:

#mount -t ext3 /dev/hda1 /backup

shell中的$表示普通用户,#表示超级用户(root,管理员)。-t 选项指文件系统类型,Linux

中默认使用ext3型。

执行“mount--help”命令查看mount命令的帮助简介,根据下列操作显示帮助页面。在shell

中执行“man mount”或“info mount”命令,可以查看更详细的帮助页面。输入“q”字符退出

帮助页面、info页面。

[root@localhost ~]# mount --help

Usage: mount -V : print version

mount -h : print this help

mount : list mounted filesystems

mount -l : idem, including volume labels

So far the informational part. Next the mounting.

The command is 'mount [-t fstype] something somewhere'.

Details found in /etc/fstab may be omitted.

mount -a [-t|-O] ... : mount all stuff from /etc/fstab

mount device : mount device at the known place

Page 13: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.2 Linux 环境 13

1

2

3

4

5

8

6

7

mount directory : mount known device here

mount -t type dev dir : ordinary mount command

Note that one does not really mount a device, one mounts

a filesystem (of the given type) found on the device.

One can also mount an already visible directory tree elsewhere:

mount --bind olddir newdir

or move a subtree:

mount --move olddir newdir

One can change the type of mount containing the directory dir:

mount --make-shared dir

mount --make-slave dir

mount --make-private dir

mount --make-unbindable dir

One can change the type of all the mounts in a mount subtree

containing the directory dir:

mount --make-rshared dir

mount --make-rslave dir

mount --make-rprivate dir

mount --make-runbindable dir

A device can be given by name, say /dev/hda1 or /dev/cdrom,

or by label, using -L label or by uuid, using -U uuid .

Other options: [-nfFrsvw] [-o options] [-p passwdfd].

For many more details, say man 8 mount .

[root@localhost ~]#

Linux中文件常用扩展名如表1-3所示。

表1-3 Linux文件扩展名

文件扩展名 用 途 .sh Bourne shell、Bash shell脚本文件

.txt 普通文本文件

.log 日志文件

.html, .htm html静态网页源文件

.tgz, .tar.gz, .bz2 压缩文件

.php, .php3, .php4, .php5 php源文件

.h, .c, .cc, .cpp C/C++ 源文件(gcc/g++)

.py Python源文件

本书使用的扩展名是上表中的.sh格式,它是通过Bash shell脚本编写的文件,也就是说,扩

展名为.sh的文件称作Bash shell脚本文件。当然也可以亲自编写其他扩展名,或没有扩展名也无

妨,但在制作Bash shell脚本时 好统一命名为.sh文件 。

下面了解shell脚本编程基础知识。

Page 14: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

14 第 1 章 Linux shell 和基本指令

1.3 shell 脚本编程基础知识

1.3.1 简介

shell程序由OS执行用户从键盘输入的命令。

shell以前是只能用在初级Unix版本的用户界面,而现在具有了CLI(Command Line Interface,

命令行用户界面)和GUI(Graphical User Interface,图形用户界面)功能。

Linux系统默认使用Bash shell , 它是Steve Bourne开发的Bourne shell原始版sh的更新版本,用

于进行shell编程。此外,还有传统Linux下使用的ksh、tcsh、zsh等shell类型。

查看/etc/shells/文件就能确认Linux常用shell类型。

root@localhost ~]# cat /etc/shells

/bin/sh

/bin/bash

/sbin/nologin

/bin/tcsh

/bin/csh

/bin/ksh

/bin/zsh

[root@localhost ~]#

上述代码段中显示的每个shell特征如表1-4所示。

表1-4 shell的类型

shell类型 开发人员 开发机构 备 注

BASH(Bourne Again shell)

Brian Fox and Chet Ramey

自由软件基金会(FSF)/bin/bash

Linux系统默认配置的shell,为便于与sh Bourne

shell兼容,在大部分sh和Bash中都可以操作

CSH (C shell) Bill Joy UC Berkeley 大学(BSD

Unix System)/bin/sh

具有与C编程语言类似的shell语法(以管理员为

中心,是Unix的默认shell)

KSH(Korn shell) David Korn AT & T Bell Labs /bin/ksh 已获得具备Unix知识的用户认可,是(针对初

学者且适用于标准环境的)Bourne shell的超集

(以用户为中心)

TCSH Ken Greer $ man tcsh /bin/tcsh 普通C shell,以用户为中心,速度很快,与

Berkeley UNIX C shell兼容

下面了解当前使用的shell类型。执行如下命令就会返回当前使用的shell类型的结果值。

[root@localhost ~]# echo $SHELL

/bin/bash

Page 15: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.3 shell 脚本编程基础知识 15

1

2

3

4

5

8

6

7

[root@localhost ~]# ps $$

PID TTY STAT TIME COMMAND

2624 pts/1 S 0:00 -bash

[root@localhost ~]# echo $$

2624

[root@localhost ~]#

使用echo命令能够在屏幕上显示之后输入的字符串,在环境变量名前标注$符号就能显示

SHELL变量,也就是说,以参数形式输入$SHELL就能显示当前shell名称。$变量具有当前shell

的进程ID(PID)。

此处需要注意,Linux系统的环境变量均由大写字母构成。可以使用env或printenv命令显示环

境变量。

root@localhost ~]# env

HOSTNAME=localhost.localdomain

SHELL=/bin/bash

TERM=xterm

HISTSIZE=1000

USER=root

LS_COLORS=no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;

05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.btm=00;32:*.bat=00;32:*.sh=00;32:*.csh=00;32:

*.tar=00;31:*.tgz=00;31:*.arj=00;31:*.taz=00;31:*.lzh=00;31:*.zip=00;31:*.z=00;31:*.Z=00;31:*.gz=00;

31:*.bz2=00;31:*.bz=00;31:*.tz=00;31:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:

*.xbm=00;35:*.xpm=00;35:*.png=00;35:*.tif=00;35:

MAIL=/var/spool/mail/root

PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/r

oot/bin

INPUTRC=/etc/inputrc

PWD=/root

LANG=en_US.UTF-8

SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass

SHLVL=1

HOME=/root

LOGNAME=root

CVS_RSH=ssh

LESSOPEN=|/usr/bin/lesspipe.sh %s

G_BROKEN_FILENAMES=1

_=/bin/env

[root@localhost ~]#

Linux系统提供xterm、gnome-terminal、kconsole等终端,它们都是终端模拟器(terminal

emulator)。这些终端模拟器与shell连接,提供可执行shell编程的GUI,大部分Linux发行版本提供

Page 16: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

16 第 1 章 Linux shell 和基本指令

xterm、rxvt、kvt、gnome-terminal、nxterm、eterm等终端模拟器。Xwindow Manager通过以上终

端模拟器进入shell会话并执行shell编程。

表1-5 终端模拟器类型

Xwindow Manager类型 GUI菜单提供的终端

KDE kconsole

GNOME gnome-terminal

GUI环境下使用SHELL命令 terminal xterm eterm rxvt

将Linux用作服务器时通常需要进行远程操作,这时使用putty(开源软件)等ssh连接工具。

当然,也可以使用SecureCRT(商用)程序。

普通用户 先访问shell就显示$字符,表示“以名为multi的普通用户身份进入主机名为

localhost的shell”。下面shell中的~(tilde)字符表示multi用户的主目录——/home/multi目录。各用

户的主目录路径定义在 /etc/passwd中。使用su-命令以超级用户身份访问时,shell就显示#

(crosshatch/sharp)字符。

[multi@localhost ~]$ su -

密码:

[root@localhost ~]#

在以上shell中输入如下字符串后,按Enter键则显示“Error”。这是因为输入了不能在shell中

使用的(无法识别的)命令。

[multi@localhost ~]# ilikeyou

-bash: ilikeyou: command not found

[root@localhost ~]#

在当前状态按方向键up(↑)就显示之前执行的命令,因为shell保存历史(history)指令。

按up键后再按down(↓)键就显示原空行。此类历史指令在Linux shell键盘操作上起重要作用,

是shell操作的核心要素。

shell是命令行用户界面(CLI),但可以使用鼠标操作。在终端界面使用3键鼠标时,可以设

置功能,使按鼠标滚轮键也能复制/粘贴。但对Linux服务器进行远程管理时,为了连接远程服务

器ssh,要使用Windows中的putty应用程序。在putty默认设置状态下(图1-8),按鼠标左键拖动并

复制字符串,按鼠标右键粘贴,如图1-9所示。

Page 17: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.3 shell 脚本编程基础知识 17

1

2

3

4

5

8

6

7

图1-8 putty设置画面

图1-9 putty下的文本复制/粘贴

1. shell脚本构成要素

if~else和for、while等shell循环(loop)指令

grep、awk、cut等文本处理实用工具

w、who、free等二进制可执行程序

Page 18: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

18 第 1 章 Linux shell 和基本指令

2. shell脚本使用目的

接收用户或文件传来的指令并在屏幕上显示数据。

可自动重复执行相同操作。

节约时间。

创建自己的PowerTool和Power实用工具。

管理员工作个性化(Customizing)。

减少设置服务环境和添加用户等操作中产生的错误(Error)。

shell脚本实际用途如下。

Linux系统监控。

数据备份和创建快照(snapshot)。

针对Oracle、MySQL数据库备份的转储(dump)工作。

接收系统警告提示邮件。

搜索耗费系统资源的进程。

查询闲置内存和用量。

查询已登录的所有用户和当前操作内容。

查询网络服务是否正常。例如,Web服务器操作有误就给管理员发送邮件或短信。

查询所有登录失败信息。例如,从相同IP地址反复登录时,防火墙自动阻止IP连接。

根据安全政策管理用户。

BIND(DNS服务器)服务器环境下添加zone项。

如果需要高级编程操作,就使用gcc(C/C++)或Python语言替代shell脚本。

3. 禁止使用shell脚本(必须使用C/C++/Python等编程语言)

资源占用较大的操作,特别是对速度要求高的操作(排序、散列等)。

高级算数运算操作,特别是任意精度运算(arbitrary precision)或需要使用复数的情况(请

使用C++)。

平台间需要可移植性(请使用C语言)。

需要结构化编程的复杂的应用程序(需要检查变量类型或函数原型(prototype)时)

确实非常重要或能决定公司未来的应用程序。

为高度保证安全及系统完整性,需要防止外部入侵或破解、破坏等时。

具有紧密关系的众多组件组成的项目。

需要运算大量文件时(Bash shell允许访问受限的串联式文件,特别是仅允许访问不方便

的、不充分的行单位)。

需要多维数组时。

需要链表或树等数据结构时。

需要制作并修改图形图像或GUI时。

需要直接访问系统硬盘时。

Page 19: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.3 shell 脚本编程基础知识 19

1

2

3

4

5

8

6

7

需要端口或套接字 I/O时。

必须使用利用已写代码的目录或界面时。

必须开发独一无二、不公开源代码的应用程序时(shell脚本的源代码是开放的)。

4. Bash脚本关键字

! esac select }

case fi then [[

do for until ]]

done function while

elif if time

else in {

后面将详细讲解上述Bash shell脚本关键字。

1.3.2 帮助页面

Linux系统提供默认指令的用户手册,使用man命令查看帮助页面。

格 式 man[指令]

在shell页面使用“man man”命令查看man命令的帮助页面。

在屏幕上查看帮助页面的执行方法如下:

man [指令] | col -b | cat

之前为显示英文帮助页面,LANG环境变量值设置为en_US.UTF8。下面的中文帮助页面是在

LANG=zh+CN.UTF8环境下显示的,也就是说,在当前shell下设置LANG=zh_CN.UTF8就立即显

示中文帮助页面。关闭当前shell并重新登录就能返回默认设置状态。

man命令详解

[root@localhost ~]# man man | col –b | cat

man(1) man(1)

名称

man:对在线帮助页面进行模式化标记。

manpath:为帮助页面提供用户检索路径。

用法

man [ -acdfFhkKtwW] [ -m system] [-p string] [-C config_file] [ -M path]

[ -P paper] [ -S section_list] [section] name…

Page 20: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

20 第 1 章 Linux shell 和基本指令

说明

man命令能够对在线帮助页面进行模式化标记。此版本识别MANPATH和(MAN)PAGER环境变量。所以既可以创建私人页面集,也可以根据个人爱好

选择程序标记已模式化的页面。如果已指定节区,那么man命令只搜索该节区并显示帮助。通过命令行选项和环境变量可以指定节区检索顺序以及

源文件使用何种预处理器。如果name包括“/”字符,它就先被作为文件名处理。所以可以设置为man ./foo.5或man /cd/foo/bar . 1 .gz

格式。

选项

-C config_file

指定要使用的man.conf文件; 默认值是/etc/man.config(参考man.config(5))。

-M path

指定搜索帮助页面的目录列表。若未指定则使用环境变量MANPATH;如果未发现环境变量,则使用/etc/man.config的默认列表;如果MANPATH

是空字符串,则表示其就是默认列表。

-P pager

指定使用何种pager.man。本选项覆盖MANPAGER环境变量设定,也覆盖environment variable、 PAGER变量设定。默认使用

/usr/bin/less –is。

-S section_list

用冒号分隔检索页面节区的列表,此选项覆盖环境变量MANSECT。

-a

默认设置,man在标记出最早发现的帮助页面后终止运行,使用此选项会强迫man继续显示所有符合name的帮助页面。

-c

即使有最新的cat页也对源帮助页面重新模式化。若模式化的cat页对应于带有其他数的column函数的屏幕时,或此前模式化的页面被毁时,

本选项非常有意义。

-d

实际不标记帮助页面,显示调试信息块。

-D

同时显示标记和调试信息。

-f

功能同whatis。

-F or --preformat

只模式化,不标记。

-h

显示帮助消息后退出。

-k

功能同apropos。

-K

在"所有"帮助页面搜寻指定字符串。请注意,本功能响应速度极慢!最好指定节区(在我的电脑上搜寻500页大概花费1分钟)。

-m system

根据指定的系统名称搜寻,指定替代帮助页面集。

-p string

指定在nroff or troff前执行的预处理器顺序。全部安装都不具备预处理器的完整集合。用几个预处理器和字符指代:eqn (e)、grap (g)、

pic (p)、tbl (t)、vgrind (v)、refer (r)。此选项覆盖环境变量MANROFFSEQ。

-t

使用/user/bin/groff -Tps -mandoc帮助页面模式化,并将结果显示到stdout。在/usr/bin/groff -Tps –mandoc输出的结果可

能需要特定的过滤器才能列印。

Page 21: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.3 shell 脚本编程基础知识 21

1

2

3

4

5

8

6

7

-w or - -path

实际不显示帮助页面,显示模式化或标记的文件位置。若未指定参数,man就标记(标准输出)搜寻帮助页面的目录列表。如果manpath与man

连接,则"manpath"功能等于"man - -path"。

-W

与-w功能相似,但每行只标记1个列表,没有附加信息。更便于在下列shell命令中使用。man –aW man | xargs ls -l

CAT页

为了在需要时快速模式化已模式化的帮助页面,man命令具有自动保存记录的功能。过去,DIR/manX的模式化页面版本保存在DIR/catX上,

但可以将man dir映射到其他cat dir,在/etc/man.config上赋予其他值。如果没有cat目录就不保存cat页。

可以对man赋予用户man suid权限,如果cat目录所有者是man和模式0755(只能通过man写入),cat文件所有者是man和模式0644或0444

(只能通过man写入或全部只读),那么,普通用户就无权修改cat页,或不能将其他文件放置到cat目录。如果对man不设置suid权限,那么cat

目录模式就应该改为0777,表示所有用户能够将cat页保存在cat目录。即使存在最近使用过的cat页,也可以使用-c选项重新模式化页面。

环境

MANPATH

设置MANPATH变量,用作搜索帮助页面的路径。

MANROFFSEQ

用于设定nroff or troff执行前所需的预处理器。默认设置为在nroff之前通过预处理器。

MANSECT

决定man搜寻的页面节区。

MANWIDTH

用于设置显示的宽度,否则帮助页面全屏显示。

MANPAGER

决定帮助页面标记的工具,如果没有就使用PAGER。如果二者皆未设定值,则使用/user/bin/less -is。

LANG

设置LANG变量,决定man先搜寻的子目录名。因此,执行"LANG=dk man 1 foo"命令时 ,如果找不到该file,会使man 先搜寻…/man1/for.1。…

是搜寻路径的目录。

NLSPATH, LC_MESSAGES, LANG

环境变量NLSPATH与LC_MESSAGES ( 如果LC_MESSAGE未指定则使用LANG ) 用于指定消息目录位置。(英文消息是编译时指定的,故不需

目录 ) 请注意,man调用的程序(如col(1) )使用LC_CTYPE。

PATH

PATH用于构建帮助页面的默认搜索路径。

SYSTEM

SYSTEM使用系统名代替默认设置(与选项-m一起使用)。

相关项目

apropos(1) , whatis(1) , less(1) , groff(1).

Bug

选项-t只在安装了类似troff的程序时才有用。在不显示连字符,只显示\255或<AD>闪烁时,在环境下设置"LESSCHARSET=LATIN1"。

提示

将(global –set –key [(f1)] (lambda () (interactive) (manual –entry (cur –rent –word))))添加到.emacs文件,

按F1键从当前光标位置显示调用目录的帮助页面。

[root@localhost ~]# man(1)

Page 22: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

22 第 1 章 Linux shell 和基本指令

1.3.3 Linux默认指令格式

下面执行date命令查看Linux默认指令格式。

[root@localhost ~]# date

Web Jul 15 08:10:08 KST 2009

[root@localhost ~]#

输入date命令,显示当前日期和时间。注意,此时date是小写。如果输入大写DATE命令,则显

示无命令。Linux系统是区分大小写的,除环境变量外几乎所有指令都是小写,这与Windows不同。

[root@localhost ~]# DATE

-bash: DATE: command not found

[root@localhost ~]#

shell指令通常使用参数(argument)显示附加信息。要想仅显示当前小时和分,根据如下操

作在指令后添加参数即可。执行“date --help”查看date指令的参数或选项帮助。

[root@localhost ~]#date '+%H:%M'

08:11

[root@localhost ~]#

如果希望显示当前UTC时间,可以使用-u或--utc、--universal选项,输入顺序如下。

[root@localhost ~]# date -u

Tue Jul 14 23:11:50 UTC 2009

[root@localhost ~]# date --utc

Tue Jul 14 23:11:55 UTC 2009

[root@localhost ~]# date --universal

Tue Jul 14 23:12:00 UTC 2009

[root@localhost ~]#

--utc和--universal长选项与-u短选项功能一样,也显示相同结果。大部分指令提供--help、

--verbose、--version等长选项。

另外,指令 后添加#字符以显示注释。

[root@localhost ~]# date -u #显示UTC时间格式。

Tue Jul 14 23:12:41 UTC 2009

[root@localhost ~]#

1.3.4 shell的编辑模式

下面了解shell命令行编辑模式。Linux shell编辑模式有emacs模式和vi模式,默认设置为emacs

编辑模式。执行shopt -o emacs查看当前shell的编辑模式。

[root@localhost ~]# shopt -o emacs

emacs on

Page 23: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.3 shell 脚本编程基础知识 23

1

2

3

4

5

8

6

7

[root@localhost ~]# shopt -o vi

vi off

[root@localhost ~]#

输入shopt-os vi即可使用vi编辑模式,但vi编辑模式只能使用普通字符,不能使用特殊键。因

此, 好使用emacs编辑模式。(-s选项指set,在2种编辑模式下设置(on)其一,另一个就自动

转为off状态。)

[root@localhost ~]# shopt -os vi

[root@localhost ~]# shopt -o vi

vi on

[root@localhost ~]# shopt -o emacs

emacs off

[root@localhost ~]#

输入shopt-os emacs返回emacs编辑模式。emacs编辑模式和vi编辑模式可以切换,若指定使用

emacs编辑模式,vi编辑模式则自动转为off。

[root@localhost ~]# shopt -os emacs

[root@localhost ~]# shopt -o emacs

emacs on

[root@localhost ~]# shopt -o vi

vi off

[root@localhost ~]#

shopt选项的-u选项(unset)用于关闭编辑模式。输入shopt-ou vi就关闭(off)vi编辑模式。

但-u选项不能像-s选项那样切换。

无论何种shell编辑模式都默认可用的键如表1-6所示。

表 1-6

left← 向左移动光标,不删除字符,只移动1个字符

right→ 向右移动光标,移动1个字符

up↑ 显示历史命令(.history)的上一个指令

down↓ 显示历史命令(.history)的下一个指令

shell的emacs模式下可用的键如表1-7所示。

表 1-7

Ctrl+b 向左移动光标,不删除字符,只移动1个字符

Ctrl+f 向右移动光标,移动1个字符

Ctrl+p 显示历史命令(.history)的上一个指令

Ctrl+n 显示历史命令(.history)的下一个指令

Tab Key 只输入一部分命令字符串后,按Tab键自动搜寻并打印符合文件名的字符串

Page 24: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

24 第 1 章 Linux shell 和基本指令

输入“dat”后按Tab键测试示例。

[root@localhost ~]# dat

此时再按Tab键就能结束date命令。再按1次Tab键,以date开始的命令就显示到shell。

[root@localhost ~]# date

date dateconfig

下表是shell的vi编辑模式可用键,可以执行vi编辑器命令模式下使用的 i( insert)、a

(append)、x(delete)等选项,输入dd删除命令行所有字符串。按Enter键执行命令,同时退出

vi编辑模式。

Esc 进入编辑模式

h 向左移动光标,不删除字符,只移动1个字符

l 向右移动光标,移动1个字符

k 显示历史命令(.history)的上一个指令

j 显示历史命令(.history)的下一个指令

Linux系统安装时默认为emacs编辑模式,因此,如果不是为了测试,请勿使用vi编辑模式,

选择默认emacs编辑模式。shell编程部分会详解shopt设置的相关内容。

[root@localhost ~]# shopt -os emacs

[root@localhost ~]# shopt -o emacs

emacs on

[root@localhost ~]#

1.3.5 指定变量和消息输出(printf、echo)

下面简单介绍如何指定变量和输出消息。输入如下代码指定变量,向变量后添加文本时 好

使用双引号(""),因为字符串之间有空格就会发生错误 。

[root@localhost ~]# FILENAME=test. txt

-bash: txt: command not found

[root@localhost ~]# FILENAME="test.txt"

[root@localhost ~]#

用标准格式编写printf命令,显示上面操作中已指定的FLIENAME变量。功能类似于C语言的

printf函数。

[root@localhost ~]# printf "%s\n" $FILENAME

test.txt

[root@localhost ~]#

当然,也能以注释形式将$变量名格式与echo命令一起输入。

Page 25: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.3 shell 脚本编程基础知识 25

1

2

3

4

5

8

6

7

[root@localhost ~]# echo $FILENAME

test.txt

[root@localhost ~]#

printf命令向标准格式(%s指字符串格式)使用新行(newline(\n))显示内容,而echo命令默

认适用新行,无需另外指定新行格式。

[root@localhost ~]# printf "Study Bash shell script programming.\n"

Study Bash shell script programming.

[root@localhost ~]# echo "Study Bash shell script programming."

Study Bash shell script programming.

[root@localhost ~]#

使用指令或$(指令)格式将shell命令的输出结果赋值于变量。下列示例中,赋予变量DATE的

值是执行date命令时输出的值,所以不声明DATE变量的值是固定值。然而,退出当前shell,变量

就会消失。

[root@localhost ~]# DATE=`date`

[root@localhost ~]# printf "%s\n" "$DATE"

Wed Jul 15 08:22:35 KST 2009

[root@localhost ~]# echo $DATE

Wed Jul 15 08:22:35 KST 2009

[root@localhost ~]# DATE=$(date)

[root@localhost ~]# printf "%s\n" "$DATE"

Wed Jul 15 08:22:53 KST 2009

[root@localhost ~]# logout

[multi@localhost ~]$ su -

密码:

[root@localhost ~]# echo $DATE

[root@localhost ~]#

执行logout、exit命令或Ctrl+D快捷键退出当前shell。上述示例退出root用户shell后返回multi

用户shell,然后执行su-命令进入超级用户shell。但之前shell中定义的DATE变量值不适用于新

shell。

1.3.6 使用多重指令(;、&&、||) 在一行中想要连续执行多个命令时,使用分隔符(;)表示1个命令的结束。记住,即使第一

个命令执行失败,也会依旧执行第二个命令。从下列第二个示例可以看出,虽然因linux命令不存

在而发生了错误,但第二个date命令依旧正常执行。

[root@localhost ~]# printf "first command\n"; printf "second command\n"

first command

second command

Page 26: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

26 第 1 章 Linux shell 和基本指令

[root@localhost ~]# linux;date

-bash: linux: command not found

Wed Jul 15 08:26:49 KST 2009

[root@localhost ~]#

如果在指令之间输入“&&”符号,那就只能在第一个命令正常执行的情况下才执行第二个

命令。也就是说,第一个命令执行失败时无法执行下一命令。下列示例中,因为date 'test'命令有

误,故未执行第二个printf命令。

[root@localhost ~]# date 'test' && printf "second command\n"

date: invalid date `test'

[root@localhost ~]# date && printf "second command\n"

Wed Jul 15 08:27:54 KST 2009

second command

[root@localhost ~]#

使用“||”表示当第一个命令执行失败时,才执行后一个命令 。

[root@localhost ~]# date 'test' || printf "second command\n"

date: invalid date `test'

second command

[root@localhost ~]#

当然,也可以在1个命令行中连续使用上述3种命令。

[root@localhost ~]# date 'test' || printf "first failed\n" && printf "second command\n"

date: invalid date `test'

first failed

second command

[root@localhost ~]#

1.3.7 历史命令(.history、↓、↑、!) Bash shell自动保存 近执行的命令。使用UP(↑)方向键查询上一个历史命令,使用DOWN

(↓)方向键查询下一个历史命令。使用感叹号(!)重新执行 近执行的命令。在“!”后面输入

需要查询命令的首字符或字符串, 就能搜寻出符合该字符(串)的 近执行的命令。

[root@localhost ~]# ls

anaconda-ks.cfg install.log.syslog scsrun.log

install.log script.txt shelltest.sh

[root@localhost ~]# date

Wed Jul 15 08:30:54 KST 2009

[root@localhost ~]# !d

date

Wed Jul 15 08:30:57 KST 2009

[root@localhost ~]# !l

Page 27: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.3 shell 脚本编程基础知识 27

1

2

3

4

5

8

6

7

ls

anaconda-ks.cfg install.log.syslog scsrun.log

install.log script.txt shelltest.sh

[root@localhost ~]#

如果无法在历史命令中找到“!”后面输入的字符,就如下显示查询失败。

[root@localhost ~]# !x

-bash: !x: event not found

[root@localhost ~]#

使用“!!”符号重新执行 后执行的命令。

[root@localhost ~]# ls

anaconda-ks.cfg install.log.syslog scsrun.log

install.log script.txt shelltest.sh

[root@localhost ~]# !!

ls

anaconda-ks.cfg install.log.syslog scsrun.log

install.log script.txt shelltest.sh

[root@localhost ~]#

也可以指定负数。“!-1”与“!!”功能相同,后面的数字表示 近执行的命令顺序,输入“!-1”

就显示 后执行的命令,如果输入“!-2”表示执行倒数第二个已执行命令。

[root@localhost ~]# ls

anaconda-ks.cfg install.log.syslog scsrun.log

install.log script.txt shelltest.sh

[root@localhost ~]# printf "printf test\n"

printf test

[root@localhost ~]# date

Wed Jul 15 08:32:44 KST 2009

[root@localhost ~]# !-2

printf "printf test\n"

printf test

[root@localhost ~]# !-4

ls

anaconda-ks.cfg install.log.syslog scsrun.log

install.log script.txt shelltest.sh

[root@localhost ~]#

输入“!#”可以执行2次命令。下列示例中,执行date命令后等待2秒再次执行date命令。

[root@localhost ~]# date; sleep 2; !#

date; sleep 2; date; sleep 2;

Wed Jul 15 08:33:41 KST 2009

Wed Jul 15 08:33:43 KST 2009

[root@localhost ~]#

Page 28: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

28 第 1 章 Linux shell 和基本指令

1.4 Linux 目录操作

Linux目录操作常用命令如下。

pwd:显示当前工作目录位置(print working directory)。

ls:显示文件和目录内容(list files and directories)。

cd:切换或移动当前shell目录(change directory)。

less、more、cat:浏览文本文件。

file:显示文件类型。

首先介绍Linux系统下文件系统目录结构。我使用的Linux系统是CentOS 5.3,显示如下树形

结构目录,大部分Linux发行版本也都具有相似的目录结构。

tree命令用于显示目录的树形结构,命令后面输入“-a”显示目录下所有内容;“-d”只显示

目录,“-f”只显示文件。使用“-L”选项显示目录级别(depth)。下列示例中使用“tree-L 1/”

命令显示根目录(/)下一级目录和文件。

[root@localhost ~]# tree -L 1 /

/

|-- bin

|-- boot

|-- dev

|-- etc

|-- home

|-- lib

|-- lost+found

|-- media

|-- misc

|-- mnt

|-- net

|-- opt

|-- proc

|-- root

|-- sbin

|-- selinux

|-- srv

|-- sys

|-- tmp

|-- usr

`-- var

21 directories, 0 files

[root@localhost ~]#

Page 29: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.4 Linux 目录操作 29

1

2

3

4

5

8

6

7

图1-10 tree命令

Linux目录结构的顶端目录是根目录(/),根目录下能存放无数个目录和文件。执行“tree-L 3/”

命令可显示更多树形结构目录, 多能显示根目录下三级目录。

1.4.1 pwd:显示当前工作目录位置

shell中使用pwd命令显示当前工作目录位置。(cd命令用于切换当前shell目录,“su -”命令用

于转为超级用户。)

[multi@localhost ~]$ su -

密码:

[root@localhost ~]# pwd

/root

[root@localhost /]# cd /usr

[root@localhost usr]# pwd

/usr

[root@localhost usr]# cd /usr/local

[root@localhost local]# pwd

/usr/local

[root@localhost ~]# pwd --help

-bash: pwd: --: invalid option

pwd: usage: pwd [-LP]

[root@localhost ~]#

作为系统管理员的超级用户,通常不会直接进行远程登录,而是先执行普通用户登录,然后

使用“su -”命令转为超级用户,输入超级用户的密码。

作为系统管理员首次登录shell,就会处于自己的主目录/root目录下,执行pwd命令就会显示

/root,这是为了确认root的当前工作目录位置。也就是说,当前工作shell处于/root目录下。每个

Page 30: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

30 第 1 章 Linux shell 和基本指令

用户的主目录指定在/etc/passwd文件中。使用“man pwd”命令显示pwd命令的帮助页面。(man

命令是manual的缩写。)

pwd命令帮助页面

[root@localhost ~]# man pwd

PWD(1L) PWD(1L)

名称

pwd:显示当前/工作目录名。

概要

pwd

pwd{--help,--version}

说明

此帮助页面支持GNU版本的pwd,pwd用于查看当前目录的完整路径名称。显示名称的每个结构就是实际目录,而非符号链接。

大部分Unix shell都内置pwd命令,并具有相似的功能。因此,大部分pwd命令都在内部执行。

选项

--help

通过标准输出显示在线帮助,正常退出。

--version

通过标准输出显示版本信息,正常退出。

FSF GNU shell实用工具 PWD(1L)

1.4.2 ls:显示当前文件和目录内容

ls命令用于显示当前文件和目录内容。

格 式 ls –[选项] [目录名]

[root@localhost ~]# ls

anaconda-ks.cfg install.log.syslog scsrun.log

install.log script.txt shelltest.sh

[root@localhost ~]#

ls命令中可使用几种选项:使用-a选项显示所有隐藏文件;使用-l(长格式)选项显示文

件详细信息。还可以同时使用这两个选项,-al选项用于显示所有文件的详细信息,包括隐藏

文件 。

Page 31: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.4 Linux 目录操作 31

1

2

3

4

5

8

6

7

表1-8 ls指令示例

ls指令示例

命 令 结 果 ls 显示当前文件和目录内容

ls /usr 显示/user目录下的文件目录

ls -l 显示工作目录的详细文件目录

ls -l /etc /usr 显示/user目录和/user目录下的详细文件目录

ls -al 显示工作目录下所有文件的详细路径,包括文件名以“.”开始的隐藏文件

使用ls -l命令显示各种类型文件目录信息,其含义如下。

[root@localhost ~]# ls -l

total 76

-rw------- 1 root root 1142 2009-05-23 05:08 anaconda-ks.cfg

-rw-r--r-- 1 root root 32811 2009-05-23 05:08 install.log

-rw-r--r-- 1 root root 4730 2009-05-23 05:07 install.log.syslog

-rw-r--r-- 1 root root 89 2009-07-15 07:10 script.txt

-rw-r--r-- 1 root root 199 2009-05-23 05:13 scsrun.log

-rwxr-xr-x 1 root root 40 2009-07-15 07:24 shelltest.sh

[root@localhost ~]#

本书开始部分对ls命令赋予别名(alias)并添加了“--time-style=long-iso”选项,所以时间显

示为xxxx-xx-xx格式。各位也可以在shell中直接设置选项。如果想用安装时的格式显示时间,则

使用“--time-style=local”选项;使用“--time-style=full-iso”选项显示 详细的时间信息。

[root@localhost ˜]# ls -l --time-style=locale

total 76

-rw------- 1 root root 1142 May 23 05:08 anaconda-ks.cfg

-rw-r--r-- 1 root root 32811 May 23 05:08 install.log

-rw-r--r-- 1 root root 4730 May 23 05:07 install.log.syslog

-rw-r--r-- 1 root root 89 Jul 15 07:10 script.txt

-rw-r--r-- 1 root root 199 May 23 05:13 scsrun.log

-rwxr-xr-x 1 root root 40 Jul 15 07:24 shelltest.sh

[root@localhost ~]# ls -l --time-style=iso

total 76

-rw------- 1 root root 1142 05-23 05:08 anaconda-ks.cfg

-rw-r--r-- 1 root root 32811 05-23 05:08 install.log

-rw-r--r-- 1 root root 4730 05-23 05:07 install.log.syslog

-rw-r--r-- 1 root root 89 07-15 07:10 script.txt

-rw-r--r-- 1 root root 199 05-23 05:13 scsrun.log

-rwxr-xr-x 1 root root 40 07-15 07:24 shelltest.sh

[root@localhost ~]# ls -l --time-style=full-iso

total 76

-rw------- 1 root root 1142 2009-05-23 05:08:31.000000000 +0900 anaconda-ks.cfg

Page 32: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

32 第 1 章 Linux shell 和基本指令

-rw-r--r-- 1 root root 32811 2009-05-23 05:08:24.000000000 +0900 install.log

-rw-r--r-- 1 root root 4730 2009-05-23 05:07:13.000000000 +0900 install.log.syslog

-rw-r--r-- 1 root root 89 2009-07-15 07:10:08.000000000 +0900 script.txt

-rw-r--r-- 1 root root 199 2009-05-23 05:13:31.000000000 +0900 scsrun.log

-rwxr-xr-x 1 root root 40 2009-07-15 07:24:10.000000000 +0900 shelltest.sh

[root@localhost ~]#

使用-i选项显示每个文件的索引节点信息。下列示例中 左端数字栏就是索引节点序号。

[root@localhost ~]# ls -li

total 76

131073 -rw------- 1 root root 1142 2009-05-23 05:08 anaconda-ks.cfg

1638402 -rw-r--r-- 1 root root 32811 2009-05-23 05:08 install.log

1638403 -rw-r--r-- 1 root root 4730 2009-05-23 05:07 install.log.syslog

1638423 -rw-r--r-- 1 root root 89 2009-07-15 07:10 script.txt

131086 -rw-r--r-- 1 root root 199 2009-05-23 05:13 scsrun.log

1638425 -rwxr-xr-x 1 root root 40 2009-07-15 07:24 shelltest.sh

[root@localhost ~]#

使用ls-l命令显示的各栏(column)含义如下:

[文件/目录许可][硬链接数][所有者][组][文件大小][修改时间][文件名]

1. 文件/目录许可 文件许可用于设置文件访问权限,“-”字符表示普通文件,“d”字符表示目录,“c”表示字

符设备,“b”表示块设备,“l”表示符号链接文件,“s”表示套接字文件。每个文件或目录的访

问权限都有3组,每组用3位表示,分别为文件所有者(owner/user)的读、写和执行权限,与所

有者同组(group)的用户的读、写和执行权限,系统中其他用户(others)的读、写和执行权限。

换言之,用ls -l命令显示文件或目录的详细信息时, 左列为文件的访问权限。以上内容将在“许

可”部分仔细讲解。

2. 硬链接文件数 文件通过操作显示硬链接文件数。硬链接指Linux中在同一文件系统内分区上具有同一索引

节点信息的文件。如果在一个文件上使用“ln原文件 硬链接文件名”命令创建另一个硬链接文件,

那么原文件和硬链接文件具有同一索引节点信息;如果对其中一个文件进行修改,则二者修改为

相同内容和大小。与此不同,符号链接使用“ln -s原文件符号链接文件名”命令创建符号链接文

件,此文件只链接原文件名。与硬链接不同,即使不在同一分区内也可建立符号链接。如果删除

符号链接文件的原文件,那么符号链接文件也会因为无法找到指向的文件而变为无效文件。

3. 所有者 表示文件所有者的ID。

Page 33: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.4 Linux 目录操作 33

1

2

3

4

5

8

6

7

4. 组 文件不仅包括所有者,也包括组许可。

5. 文件大小 表示文件的大小,默认单位是字节。

6. 修改时间(mtime) 表示 后修改文件的时间。如果修改日超过6个月就显示日期和年份,近6个月之内修改的就

只显示日期和时间。

7. 文件名 表示文件名或目录名。

ls指令帮助页面

[root@localhost ~]# man ls

LS(1) LS(1)

名称

罗列ls、dir、vdir -路径内容。

概要

ls [-abcdfgiklmnpqrstuxABCFGLNQRSUX1] [-w cols] [-T cols] [-I pattern][--all] [--escape] [--directory]

[--inode] [--kilobytes] [--numeric-uid-gid] [--no-group] [--hide-control-chars] [--reverse] [--size]

[--width=cols] [--tabsize=cols] [--almost-all] [--ignore-backups] [--classify] [--file-type] [--full-time]

[--ignore=pattern] [--derefer-ence] [--literal] [--quote-name] [--recursive] [--sort={none,time,size,extension}]

[--format={long,verbose,com-mas,across,vertical,single-column}] [--time={atime,access,use, ctime,status}]

[--help] [--version] [--color[={yes,no,tty}]] [--colour[={yes,no,tty}]] [name...]

说明

本帮助页面的内容不是最新版本,有些部分可能有误缺失。如需完整版帮助页面,请参考Texinfo文档。

本帮助页面支持GNU版本ls命令。dir和vdir命令是将ls命令的符号链接结果以不同格式显示出来的编程命令。使用参数表示文件名和路径名。

路径内容初始值按字母顺序排列。ls命令使用标准输出(终端画面),输出结果从纵向变为横向。如果通过其他方式输出,则逐行显示结果。dir

命令初始值与ls命令相同,但输出结果纵向排序、横向输出。(其他输出方式也一样)vdir命令用初始值列出详细目录。

选项

-a, --all

列出目录下所有文件,包括以"."开始的文件。

-b, --escape

把文件名中不可输出的字符用反斜杠(\)加字符编号(与C语言一样)的形式列出。

-c, --time=ctime, --time=status

根据文件最近修改时间排序并显示,使用(-l)选项显示文件最近的修改时间。

-d, --directory

只显示路径名称,不显示路径内容。(在shell脚本中非常有用)

Page 34: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

34 第 1 章 Linux shell 和基本指令

-f

对输出的文件不排序,根据硬盘保存顺序显示。功能与-a和-U选项相同,与-l、-s、-t相反。

--full-time

显示完整的时间,不省略。

-g

忽略:用于Unix兼容。

-i, --inode

文件左侧显示索引序号。

-k, --kilobytes

以KB单位表示文件大小,忽略POSIXLY_CORRECT环境变量。

-l, --fomat=long, --format=verbose

列出文件的详细信息,如文件类型、使用权限、硬链接号、所有者名称、组名、文件大小、时间(默认创建文件的时间)等。如保存时间超过6

个月,则只显示文件保存年份。

-m, --format=commas

最大限度横向输出文件名。

-n, --numeric-uid-gid

显示时用UID、GID序号代替名称。

-p

在每个文件名后附上1个字符表示该文件类型。

-q: --hide-control-chars

用"?"代替不可输出的字符。

-r, --reverse

降序排列目录。

-s, --size

以1KB为单位显示文件大小,设置POSIXLY_CORRECT环境变量,自动显示512B单位。

-t, --sort=time

以时间排序,最近保存的文件列为第一个。

-u, --time=atime, --time=access, --time=use

以文件使用时间排序,输出详细信息时显示使用时间,而非创建时间。

-x, --format=across, --format=horizontal

横向排序。

-A, --almost-all

显示除"."、".."外的目录下所有文件。

-B, --ignore-backups

不显示以"~"结尾的备份文件。

-C, --fomat=vertical

纵向排序。

-F, --clssify

文件后面添加字符以显示文件类型,在可执行文件后添加"*",路径后添加"/",符号链接后添加"@",FIFO后添加"|",套接字后添加"=",

普通文件不标注。

-G, --no-group

显示目录中除组信息外的所有内容。

-L, --dereference

将符号链接文件输出为普通文件格式。

-N, --literal

Page 35: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.4 Linux 目录操作 35

1

2

3

4

5

8

6

7

非英文名时,不显示C语言中使用的反斜杠"\"标记符号,直接输出名称。

-Q, --quote-name

功能与-N选项相反。

-R, --recursive

列出所有子目录下的文件。

-S, --sort=size

按文件大小降序排列。

-U, --sort=none

显示时不排序,按文件保存顺序罗列。此选项不能使用-f选项,Unix版本ls –f可以使用-a选项,不能使用-l、-s、-t 选项。

-X, --sort=extension

以文件的扩展名排序,首先列出没有扩展名的文件。

-1, --format=single-column

每行只显示1个文件。

-w, --width cols

自行指定屏幕宽度,默认为1个屏幕宽度值。可以通过设置COLUMNS环境变量值指定。初始值为80。

-T,--tabsize cols

使用Tab键指定cols值,默认值是8。若设置为0,则Tab键无效。

--I, --ignore pattern

将指定为pattern模式的文件从目录中除去,在命令行指定该文件才能列出。

--color, --colour, --color=yes, --colour=yes

文件类型不同,显示颜色就不同。详细内容请参考DISPLAY COLORIZATION部分

--color=tty,--colour=tty

功能与--color选项相同,但只在标准输出下执行。此选项在shell脚本或命令行的使用上非常有用,因为二者使用的显示程序不支持颜色控

制代码。

--color=no, --colour=no

默认不显示颜色,如果已经赋予颜色命令,则该初始值无效。

--help

显示帮助页面并退出。

--version

显示版本信息并退出。

DISPLAY COLORIZATION

使用--color选项时,该版本ls命令根据文件名或文件类型,以文件颜色分别列出输出结果。此选项初始值根据文件类型确定,使用的代码是

ISO 6429(ANSI)。

可通过指定LS_COLORS(或LS_COLOURS)环境变量改变初始颜色设置。此变量类型是termcap(5)格式。每个项目使用":"、"xx=字符串"。

xx输出2个字符,可用字符如下。

no 0 非文件名的普通文本

fi 0 普通文件

di 32 路径

ln 36 符号链接

pi 31 FIFO(管道)

so 33 套接字

bd 44;37 块设备

cd 44;37 字符设备

ex 35 科执行文件

mi 无 丢失文件(初始值fi)

Page 36: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

36 第 1 章 Linux shell 和基本指令

or 无 无符号链接对象的文件(初始值ln)

lc \e[ 左侧代码

rc m 右侧代码

ec 无 结束代码(用lc+no+rc转换)

想更换颜色只要更改该变量即可。

可以根据文件扩展名指定文件名颜色。只要包括在LS_COLORS环境变量内就可以执行,使用方法同上。语法格式是"*ext=字符串"。例如,输

入"*.c=34",C源文件就设置为蓝色。

控制字符像C语言一样可选择"\"字符开始,或像stty一样选择"^"字符开始,C语言下\e表示Esc,\_表示空格字符,\?表示删除。另外,\

escape字符可用于覆盖\、^、:、=的初始处理方式。

每个文件都指定为<lc><颜色值><rc><文件名><ec>格式。如果不支持<ec>代码,就由<lc><no><rc>代替。以上方法虽然变化很多但并不常

用。左侧、右侧、最后代码是不支持普通ISO 6429代码的终端专用值,非特殊情况不使用。

ISO 6429代码中的可用代码值如下。(除lc、rc、ec输出值)

0 返回初始颜色。

1 强调色

4 下划线

5 闪烁文字

30 黑色全景

31 红色全景

32 绿色全景

33 黄色(或褐色)全景

34 蓝色全景

35 紫色全景

36 青绿色全景

37 白色(或灰色)全景

40 黑色背景

41 红色背景

42 绿色背景

43 黄色(或褐色)背景

44 蓝色背景

45 紫色背景

46 青绿色背景

47 白色(或灰色)背景

不可能所有命令都在全部系统和显示设备中顺利执行。

几个终端可能无法识别最后一个代码(ec),如果使用了颜色,就应该将no、fi值设为0,返回到初始值。

BUG

BSD系统中常常出现这种现象:使用-s选项从HP-UX系统挂载的NFS文件只显示一半大小。相反,在HP-UX系统上,从BSD系统挂载的NFS文件

大小显示为原来的2倍。HP-Ux ls程序也出现过上述现象。

使用英语字符集时不会出现任何问题,但像中文这种1个字占据2个字节的情况下,为了显示母语文件名,需要指定特殊选项——"-N

--color=tty"。

FSF GNU File Utilities LS(1)

Page 37: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.4 Linux 目录操作 37

1

2

3

4

5

8

6

7

1.4.3 cd:切换工作目录 使用cd(change directory)命令切换工作目录。

格 式 cd [目录路径名]

目录路径名的写法有两种:第一是使用绝对路径,写下从根目录(/)到要切换的目录的所

有路径;第二是以当前工作目录为准,写入相对路径名。

如果当前工作目录是/root,可以使用绝对路径和相对路径方法转到/user/local目录,操作方法如下。

使用绝对路径

[root@localhost ~]# cd /usr/local

[root@localhost local]# pwd

/usr/local

[root@localhost local]#

使用相对路径:下面是使用“cd -”命令转到上一级目录的方法

[root@localhost local]# cd -

/root

[root@localhost ~]# cd ../usr/local

[root@localhost local]# pwd

/usr/local

[root@localhost local]# cd ..

[root@localhost usr]# pwd

/usr

[root@localhost usr]# cd ./local

[root@localhost local]# pwd

/usr/local

[root@localhost local]#

使用绝对路径时,写入从根目录(/)起的所有路径名;使用相对路径时,为了从当前工作

目录转到/user/local目录,先使用“..”字符串找到根目录(/)。该字符串的含义是“跳到当前工

作目录的上一级目录”,所以使用后就会先转到根目录(/),再转到/user/local目录。使用“./目录

名”转到当前工作目录的下一级目录,此处“.”字符表示当前工作目录,接着只输入目录名即

可转到下一级目录。

[root@localhost local]# pwd

/usr/local

[root@localhost local]# cd bin

[root@localhost bin]# pwd

/usr/local/bin

[root@localhost bin]#

Page 38: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

38 第 1 章 Linux shell 和基本指令

使用“cd ~”命令,或不使用选项直接输入“cd”命令即可转到shell登录用户的个人主目录。

使用“cd/”命令转到顶端根目录(/)。

[root@localhost bin]# pwd

/usr/local/bin

[root@localhost bin]# cd ~

[root@localhost ~]# pwd

/root

[root@localhost ~]# cd /

[root@localhost /]# pwd

/

[root@localhost /]# cd

[root@localhost ~]# pwd

/root

[root@localhost ~]#

使用“cd - ”命令回到刚才访问的工作目录。

[root@localhost ~]# pwd

/root

[root@localhost ~]# cd ..

[root@localhost /]# pwd

/

[root@localhost /]# cd -

/root

[root@localhost ~]# pwd

/root

[root@localhost ~]#

如前所述,Linux系统下输入长目录或长命令时不需要输入全部内容。仅输入前面几个字符,

然后按Tab键即可自动输入。(shell的emacs编辑模式)如果有效运用Tab键,可以缩短操作时间。

需要注意的是,通过Tab键自动输入的命令只适用于指定在PATH环境变量内的目录路径下一级命

令或文件。

cd指令帮助页面

[root@localhost ~]# man cd

BASH_BUILTINS(1) BASH_BUILTINS(1)

名称

bash, :, ., alias, bg, bind, break, builtin, case, cd, command, con-tinue, declare, dirs, disown, bash-echo,

enable, eval, exec, exit, bash-export, fc, fg, for, getopts, hash, help, history, if, jobs, bash-kill, let,

local, logout, popd, pushd, bash-pwd, read, readonly, return, set, shift, shopt, source, suspend, bash-test,

times, trap, type, typeset, ulimit, umask, unalias, unset, until, wait, while - bash built-in指令,请参考bash(1)

Page 39: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.4 Linux 目录操作 39

1

2

3

4

5

8

6

7

BASH内置指令

相关项

bash(1), sh(1)

GNU 1996 March 20

BASH_BUILTINS(1)

查看cd命令的帮助页面后显示“参考Bash指令”信息。Bash命令帮助页面的内容太多,故省

略。请在shell中输入“man bash”命令查看相关内容。

1.4.4 less、more、cat:浏览文本文件

less命令用于在屏幕上显示文本文件,文件内容通过vim编辑器实现。使用“q”命令就能退

出,并返回到shell刚执行过命令的下一行。

more命令也用于在屏幕上显示文本文件,如果显示内容超过一屏,就使用vim编辑器。使用

“q”命令退出后,无法回到原来使用的shell的位置,这是它与less命令的差别。

cat命令也用于在屏幕上显示文本文件,通过标准输出将文本内容显示在屏幕上。在最后显示

内容的下一行返回shell提示符。

less [text_file]

格 式 more [text_file]

cat [text_file]

执行less命令后,在viewer上使用的键盘命令如表1-9所示。

表1-9 less中使用的键盘命令

less中使用的键盘命令

Page Up、b 转到下一页

Page Down、Space 转到上一页

G 移动到文本文件最后一页

1G 移动到文本文件首页

/字符串 在整个文本文件中查找字符串

n 向下一级再次检索

N 向上一级再次检索

q 退出less

Page 40: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

40 第 1 章 Linux shell 和基本指令

less、more、cat命令帮助页面

[root@localhost ~]# man less

[root@localhost ~]# man more

[root@localhost ~]# man cat

使用less命令读取文本文件后退出,就会移转到执行命令的下一行(如图1-11、图1-12、图1-13

所示);而使用more命令读取文本文件后退出,就会转到 后一行。cat命令只能通过标准输出(显

示器)实现,所以读取文件和输出结束后就返回文件末尾。因此,读取文本文件时普遍使用less

命令,利用重定向(>)保存文件时使用cat命令。稍后会详细讲解重定向。

图1-11 使用less指令读取文件的操作

图1-12 使用less指令读取文件

图1-13 使用less命令显示文本文件后退出并返回shell

从图1-14和图1-15中可以看到,more命令下shelltest.sh文件的行数不超过屏幕一页,因此与cat

命令输出结果同样直接显示在当前shell上。如果行数超过shell屏幕一页,则以页为单位显示。

Page 41: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.4 Linux 目录操作 41

1

2

3

4

5

8

6

7

图1-14 cat shelltest.sh、more shelltest.sh

图1-15 less shelltest.sh

1.4.5 file:显示文件类型

file命令用于检测文件类型。

格 式 file [text_file]

下面使用cat命令读取文本文件并显示到屏幕,我已使用vim编辑器创建了html和txt扩展名文件。

[root@localhost ~]# ls

anaconda-ks.cfg install.log.syslog scsrun.log test0.txt

html0.html mc-4.6.1a-35.el5.i386.rpm shelltest.sh test1.txt

install.log script.txt tarfile.tgz test2.txt

[root@localhost ~]# cat test0.txt

[root@localhost ~]# cat test1.txt

English only

[root@localhost ~]# cat test2.txt

输入中文

[root@localhost ~]# cat html0.html

<html>

</html>

Page 42: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

42 第 1 章 Linux shell 和基本指令

[root@localhost ~]# file test0.txt

test0.txt: empty

[root@localhost ~]# file test1.txt

test1.txt: ASCII text

[root@localhost ~]# file test2.txt

test2.txt: UTF-8 Unicode text

[root@localhost ~]# file html0.html

html0.html: HTML document text

[root@localhost ~]# file install.log

install.log: UTF-8 Unicode text

[root@localhost ~]# file mc-4.6.1a-35.el5.i386.rpm

mc-4.6.1a-35.el5.i386.rpm: RPM v3 bin i386 mc-4.6.1a-35.el5

[root@localhost ~]# file tarfile.tgz

tarfile.tgz: gzip compressed data, from Unix, last modified: Wed Jul 15 09:56:39 2009

[root@localhost ~]# tar tvf tarfile.tgz

-rw-r--r-- root/root 0 2009-07-15 09:54:10 test0.txt

-rw-r--r-- root/root 13 2009-07-15 09:54:39 test1.txt

-rw-r--r-- root/root 31 2009-07-15 09:54:54 test2.txt

[root@localhost ~]# file /etc/rc.d/init.d/sshd

/etc/rc.d/init.d/sshd: Bourne-Again shell script text executable

[root@localhost ~]# file /usr/bin/gcc

/usr/bin/gcc: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9,

dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped

[root@localhost ~]# file /usr/lib/libstdc++.so.6.0.8

/usr/lib/libstdc++.so.6.0.8: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), stripped

[root@localhost ~]#

表1-10 Linux的文件类型

文件类型 说 明 是否读取文本 ASCII text ASCII文本文件 是

UTF-8 Unicode text vim上设置中文就自动保存为UTF-8形式 是

Bourne-Again shell script text Bash shell脚本 是

ELF 32-bit LSB core file 核心转储文件(发生crash时创建) 否

ELF 32-bit LSB-executable 可执行文件 否

ELF 32-bit LSB shared object 共享对象(共享库) 否

GNU tar archive tar压缩文件 使用tar tvf命令可以读取内部文件目录

gzip compressed data gzip压缩文件 否

HTML document text 网页 是

JPEG image data 压缩jpeg图片文件 否

PostScript document text PostScript文件 是

RPM Redhat Package Management文件 使用rpm -qlp命令可以读取rpm文件目录

Zip archive data zip压缩文件 否

Page 43: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.4 Linux 目录操作 43

1

2

3

4

5

8

6

7

file指令帮助页面

[root@localhost ~]# man file

1.4.6 Linux的默认目录结构

Linux的默认目录结构如表1-11所示。

表1-11 Linux的默认目录结构

目 录 说 明 / 文件系统的根目录(/),根目录下有多个子目录

/boot 存放Linux内核和启动加载项的目录。内核是vmlinuz-*文件

/etc 存放操作系统环境设置文件的目录,大部分是文本文件 /etc/passwd:保存各项用户信息的文件 /etc/shadow:保存用户加密保存的文件 /etc/fstab:保存系统启动时需要自动挂载的设备表的文件 /etc/hosts:保存网络托管名和IP地址的文件 etc/rc.d/init.d或/etc/init.d:保存启动时所需的各种系统服务脚本的目录 /etc/reslov.conf:保存系统进行外部登录时指定域名服务器的文件 /etc/sysconfig/i18n:保存启动时设置语言集(LANG=zh_CN.UTF-8或zh_CN.EUC-CN)变

量和font变量(SYSFONT)的文件 /etc/sysconfig/iptables:保存Linux防火墙iptables环境设置的文件 /etc/sysconfig/network:启动时决定是否支持网络并设置托管名的文件 /etc/sysconfig/network-scripts/ifcfg-eth0:保存启动时使用的第一个以太网卡信息的文件

/bin、/usr/bin 保存可执行程序的目录,/bin目录存放默认可执行程序,/user/bin目录存放用户要用的可

执行程序

/sbin、/usr/sbin /sbin目录存放系统管理员专用程序,大部分只有超级用户才能执行

/usr 存放支持用户应用程序的多种文件 /usr/share/X11:X Windows系统支持文件 /usr/share/dict:拼写检查字典文件 /usr/share/doc:各种格式文本文件 /usr/share/man:Linux帮助页面manpage文件 /usr/src:存放源代码文件,用于查看内核源码包

/usr/local /usr/local和子目录下存放软件安装时或本地机器中要用的文件,下载的文件通过默认选项

编译后,默认安装到/usr/local目录,此时执行文件位于/usr/local/bin目录

/var 存放检测系统执行过程变化的各种日志文件 /var/log:存放日志文件,监控此目录下的日志文

件就能掌握系统当前状况 /var/spool:用于排列邮件信息和打印工作等进程队列,使用Sendmail MTA时,本地系统收到用户邮件就自动保存到/var/spool/mail目录相应用户名的文件

/lib 存放共享库(shared library)文件(Windows下的dll文件等共享库文件)

/home 存放不同用户主目录中的个人主目录,useradd(adduser)命令用于创建用户,以“/home/用户名”格式创建用户主目录。创建的文件默认存放于/etc/skel/目录

/root 超级用户(系统管理员)的主目录

/tmp 存放临时文件的目录

/dev 存放Linux系统的设备文件,使用此文件执行设备文件的读写工作,如/dev/fd0表示第一个

软盘驱动,/dev/sda(/dev/hda)表示能够进入第一个SCSI或SATA(IDE)硬盘的设备驱动

Page 44: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

44 第 1 章 Linux shell 和基本指令

(续)

目 录 说 明 /proc 此目录不包括文件,实际上不存在,是虚拟文件系统,/proc目录下存放包含内核信息的

文件,包括当前运行的系统所有进程编号的组,如调出/proc/cpuinfo文件显示当前系统的

CPU信息,调出/proc/meminfo文件显示内存信息

[root@localhost ~]# cat/proc/cpuinfo

[root@localhost ~]# cat/proc/meminfo

/media、/mnt 此目录为挂载点而设,是挂载各种物理存储设备(HDD、CDROM)的目录,挂载与进程

相连,以使用设备

启动时读取/etc/fstab文件,在指定目录上挂载设备文件,但floppy、cdrom等可移动存储设

备使用/media或/mnt目录(/media/floppy、/media/cdrom)

如下输入mount命令即可显示当前已挂载的目录

[root@localhost ~]# mount

/dev/hda1 on /type ext3 (rw)

proc on /proc/type proc (rw)

sysfs on /sys type sysfs (rw)

devpts on /dev/pts /type devpts (rw,gid=5,mode=620)

tmpfs on /dev/shm type tmpfs (rw)

none on /proc/sys/fs/binfmt_misc type binfmt_misc(rw)

sunrpc on /var/lib/nfs/rpc/nfs/rpc_pipefs type rpc_pipefs (rw)

root@localhost ~]#

1.4.7 文件和目录操作

cp:复制文件和目录(copy files and directories)。

mv:移动/重命名文件和目录(move/rename files)。

rm:删除文件和目录(remove files or direcrtories)。

mkdir:创建目录(make directories)。

rmdir:删除目录(remove empty directories)。

以上指令是Linux常用命令。像Windows系统一样,Linux的GUI模式中也能利用鼠标对文件

进行复制、重命名和粘贴。但进行远程操作时,只能在CLI模式下使用shell命令。当然,可以通

过VNC、FreeNX等使用远程桌面的GUI模式进行管理,可网速等问题会导致工作效率明显下降。

因此,我们选择ssh远程连接工具putty,在文本模式下操作。

下面利用mkdir命令创建dest目录,然后在dest目录内复制所有扩展名为.txt的文件。

[root@localhost ~]# ls

anaconda-ks.cfg install.log.syslog scsrun.log test0.txt

html0.html mc-4.6.1a-35.el5.i386.rpm shelltest.sh test1.txt

install.log script.txt tarfile.tgz test2.txt

[root@localhost ~]# ls *.txt

script.txt test0.txt test1.txt test2.txt

Page 45: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.4 Linux 目录操作 45

1

2

3

4

5

8

6

7

[root@localhost ~]# mkdir dest

[root@localhost ~]# ls -l|grep ^d

drwxr-xr-x 2 root root 4096 2009-07-16 14:59 dest

[root@localhost ~]# cp *.txt dest

[root@localhost ~]# ls -l dest

total 12

-rw-r--r-- 1 root root 89 2009-07-16 14:59 script.txt

-rw-r--r-- 1 root root 0 2009-07-16 14:59 test0.txt

-rw-r--r-- 1 root root 13 2009-07-16 14:59 test1.txt

-rw-r--r-- 1 root root 31 2009-07-16 14:59 test2.txt

[root@localhost ~]#

以上命令中使用了“ls –l|grep^d”命令,该命令使用管道符号(|),通过grep命令输入“ls -l”

命令的输出结果,其含义是“通过正则表达式中使用的‘^’字符搜寻起始字符为‘d’的行”。

目的在于使显示文件目录时只显示目录内容。从结果中可以看出,只显示已创建的dest目录信息。

如上使用“*”(asterisk通配符)表示所有字符文件。

通配符种类及示例如表1-12和表1-13所示。

表1-12 通配符

通 配 符 说 明 * 匹配的所有字符

? 匹配的1个字符

[characters] 匹配下列字符

[:alnum:] 字母和数字

[:alpha:] 字母和字符

[:digit:] 数字编号

[:upper:] 大写字母

[:lower:] 小写字母

[!characters] [characters]定义的字符串以外的字符

表1-13 通配符示例

模 式 匹 配

当前目录的文件状态

[root@lacalhost ~]# ls

anaconda-ks.cfg install.log.syslog shelltest.sh test2.txt

dest mc-4.6.1a-35.el5.i386.rpm tarfile.tgz

html0.html script.txt test0.txt

install.log scsrun.log test1.txt

[root@lacalhost ~]# .

* 所有文件

Page 46: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

46 第 1 章 Linux shell 和基本指令

(续)

模 式 匹 配 t* 以“ t”开始的所有文件 [root@localhost ~]# ls t* tarfile.tgz test0.txt test1.txt test2.txt

[root@localhost ~]#

t*.txt “t”开头的所有文件中扩展名为.txt的文件 [root@localhost ~]# ls t*.txt test0.txt test1.txt test2.txt [root@localhost ~]#

te??????? 以“te”开始的文件中,后面再加7个字符的所有文件,即文件名为9个字符 [root@localhost ~]# ls te??????? test0.txt test1.txt test2.txt [root@localhost ~]#

[ts]* 以“t”或“s”开始的所有文件 [root@localhost ~]# ls [ts]* script.txt shelltest.sh test0.txt test2.txt scsrun.log tarfile.tgz test1.txt [root@localhost ~]#

[[:upper:]]* 以大写字母开始的所有文件 下列示例当前目录下不存在大写字母开始的文件,所以显示错

误消息 [root@localhost ~]# ls [[:upper:]]* ls:[[:upper:]]*:No such file or directory [root@localhost ~]#

*[![:upper:]].* 文件名不以大写字母结束,即以小写字母结束的所有文件 [root@localhost ~]# ls *[![:upper:]]* anaconda-ks.cfg install.log.syslog scsrun.log test0.txt html0.html mc-4.6.1a-35.el15.i386.rpm shelltest.sh test.txt insatll.log script.txt tarfile.tgz test2.txt [root@localhost ~]#

以上是ls命令的通配符使用示例,同样适用于cp、mv命令。

1.4.7.1 cp:复制文件和目录 使用cp命令可以将file1复制为file2。

格 式 cp[file1] [file2]

复制文件时使用-i选项询问是否覆盖已存在的file2文件。(--interaction)

cp -i [file1] [file2]

在目录上复制file1、file2、file3文件时,格式为:

cp [file1] [file2] [file3] directory

此命令必须在创建directory目录名之后才能使用,因此,没有目标目录就会发生错误。此时

可以使用-R或-r选项(--recursive)创建目标目录,同时复制源目录下所有文件。

cp -R [source directory] [destination directory]

[root@localhost ~]# ls dest

script.txt test0.txt test1.txt test2.txt

[root@localhost ~]# cp dest/*.txt backup

cp: target `backup' is not a directory

[root@localhost ~]# cp src backup

Page 47: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.4 Linux 目录操作 47

1

2

3

4

5

8

6

7

cp: cannot stat `src': No such file or directory

[root@localhost ~]# cp -R dest backup

[root@localhost ~]# ls backup

script.txt test0.txt test1.txt test2.txt

[root@localhost ~]#

如果使用-R(-r)选项时已存在目标目录,则在目标目录下一级复制源目录及所有文件。下

列示例重新复制了目录,因之前已经创建了backup目录,故将dest目录和文件复制到该目录。

[root@localhost ~]# cp -r dest backup

[root@localhost ~]# ls backup

dest script.txt test0.txt test1.txt test2.txt

[root@localhost ~]# ls backup/dest

script.txt test0.txt test1.txt test2.txt

[root@localhost ~]#

cp指令帮助页面

[root@localhost ~]# man cp

CP(1) CP(1)

名称

cp:复制文件

概要

cp [options] source dest

cp [options] source... directory

Options:

[-abdfilprsuvxPR] [-S backup-suffix] [-V {numbered,existing,simple}]

[--backup] [--no-dereference] [--force] [--interactive] [--one-file-

system] [--preserve] [--recursive] [--update] [--verbose] [--suf-

fix=backup-suffix] [--version-control={numbered,existing,simple}]

[--archive] [--parents] [--link] [--symbolic-link] [--help] [--version]

说明

本帮助页面内容非最新版本,有些部分可能有误或缺失。如果需要完整版手册,请参考Texinfo文档。

此帮助页面支持cp命令的GNU版本。如果命令行参数是路径名,cp命令就将指定的源文件复制到路径内。而且,命令行参数使用2个文件名时,

将第一个文件复制为第二个文件。最后一个命令行参数并非路径,指定多个文件时出现错误信息。初始值不复制路径。

选项

-a、--archive

保留并复制原文件的属性、链接信息,功能等于-dpR选项。

-b、--backup

Page 48: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

48 第 1 章 Linux shell 和基本指令

复制的文件已存在时,为防止覆盖或删除而创建备份。

-d、--no-dereference

如果要复制的原文件为符号链接文件,则使用cp命令复制成为该符号链接对象的文件。直接复制符号链接文件和符号链接信息时使用该选项。

-f、--force

复制时如果对象已存在就先删除。

-i、--interactive

如果复制对象已存在,覆盖该文件前弹出提示符询问如何处理。

-l、--link

复制时使用硬链接格式,故无法复制路径。

-P、--parents

同时指定原文件和路径时,直接复制路径。此时可使用的对象是路径格式。例如,使用"cp --parents a/b/c existing_dir"命令的输出

结果是"existing_dir/a/b/c"格式。

-p、--preserve

复制时保留指定的文件所有者、组、权限、时间等信息。

-r

直接复制普通文件,如果指定文件为路径,则复制路径内的所有下一级路径及文件。

-s、--symbolic-link

使用符号链接格式复制非路径的普通文件。此时,要复制的原文件名必须是绝对路径格式(由"/"开始的路径)。不支持符号链接的情况下使用

该选项会出现错误信息。

-u、--update

复制的对象文件已存在,与该文件的修改日期相同或更晚则不复制。

-v、--verbose

详细显示复制进行的步骤。

-x、--one-file-system

原文件和复制对象文件的文件系统不一致时不复制。

-R、--recursive

复制路径时,对路径内包括的所有下一级路径和文件进行复制。

--help

显示帮助信息并退出。

--version

显示版本信息并退出。

-S、--suffix backup-suffix

如果已存在复制的对象而需要备份时,在备份文件中指定使用于文件名末尾的字符。执行这项操作会忽略SIMPLE_BACKUP_SUFFIX环境变量。

如果未设定该环境变量且未使用该选项,则初始值使用emacs等"~"字符。

-V、--version-control {numbered,existing,simple}

该选项用于指定备份方法,忽略已设置的VERSION_CONTROL环境变量。如果未指定该环境变量且未使用该选项,则初始值为"existing"。此

处使用的备份方法等于GNU emacs的"version-control"值。也可使用如下这些简短的提示词进行备份。

't'或'numbered'

创建有编号的备份。

'nil'or'existing'

只在对象文件存在时创建备份。

'never'or'simple'

创建简单的备份。

FSF GNU File Utilities CP(1)

Page 49: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.4 Linux 目录操作 49

1

2

3

4

5

8

6

7

1.4.7.2 mv:移动/重命名文件和目录 mv命令的用途根据使用方法分为2种:第一是可以将文件移动至其他目录,第二是可修改文

件名或目录名。

修改文件名的命令格式为:

格 式 mv [filename1] [filename2]

如果已存在filename2,就使用-i选项(--interactive)显示“是否覆盖”提示信息。

格 式 mv –i [filename1] [filename2]

将文件移动到目录的命令格式为:

格 式 mv [filename1] [filename2] [filename3] directory

移动目录内所有文件的命令格式为:

格 式 mv directory1 directory2

以上命令格式中,如果已存在directory2,那么direcitory1就移动到directory2目录的下一级

目录。

[root@localhost ~]# ls

anaconda-ks.cfg install.log scsrun.log test1.txt

backup install.log.syslog shelltest.sh test2.txt

dest mc-4.6.1a-35.el5.i386.rpm tarfile.tgz

html0.html script.txt test0.txt

[root@localhost ~]# mv dest backup2

[root@localhost ~]# ls backup2

script.txt test0.txt test1.txt test2.txt

[root@localhost ~]# ls

anaconda-ks.cfg install.log scsrun.log test1.txt

backup install.log.syslog shelltest.sh test2.txt

backup2 mc-4.6.1a-35.el5.i386.rpm tarfile.tgz

html0.html script.txt test0.txt

[root@localhost ~]#

以上示例将dest目录名改为backup2目录名。

Page 50: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

50 第 1 章 Linux shell 和基本指令

mv指令帮助页面

[root@localhost ~]# man mv

MV(1) MV(1)

名称

mv:移动文件

概要

mv [options] source dest

mv [options] source... directory

Options:

[-bfiuv] [-S backup-suffix] [-V {numbered,existing,simple}] [--backup]

[--force] [--interactive] [--update] [--verbose] [--suffix=backup-suffix]

[--version-control={numbered,existing,simple}] [--help] [--version]

说明

本手册内容并非最新版本,有些部分可能有误或缺失。如果需要完整版手册,请参考Texinfo文档。

此帮助页面支持GNU版本的mv命令。如果最后一个参数使用了路径名,就不更改原文件名,直接复制到该路径。反之,若最后一个参数使用了文

件名则进行更改。最后一个参数不是路径名,或原文件和对象文件都不是文件名的情况下显示错误信息。只有文件系统赋予访问许可时才能使用

mv命令。(除赋予读权限的文件外,普通用户在DOS分区的文件系统和个人主目录内无法执行其他任何文件,在这种文件系统上移动文件就会收

到mv命令发送的错误消息。)

如果文件模式设定为只读,标准输入是tty,未指定-f或--force选项,mv命令就显示"是否删除所选文件"。此时,输入"y"或"Y"才能移动

该文件。

选项

-b、--backup

如果已存在目标文件,覆盖前先备份以防文件被删除。

-f、--force

即使已存在目标文件也不询问,直接覆盖。

-i、--interactive

覆盖前先询问用户。 此时输入"y"或"Y"才能移动该文件。(初始值)

-U、--update

移动或更改文件名时,若目标文件已存在,且其修改时间(modification time)比原文件晚,则不覆盖。

-v、-verbose

详细显示复制步骤。

--help

显示帮助信息并退出。

--version

显示版本信息并退出。

S、--suffix backup-suffix

如果已存在复制的目标文件而需要备份时,在备份文件中指定用于文件名的末尾字符。该选项忽略SIMPLE_BACKUP_SUFFIX环境变量。如果未

设定该环境变量且未使用该选项,则初始值为emacs等"~"字符。

-V、--version-control {numbered,existing,simple}

Page 51: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.4 Linux 目录操作 51

1

2

3

4

5

8

6

7

该选项指定备份方法,忽略已设置的VERSION_CONTROL环境变量。如果未设定该环境变量且未使用该选项,则默认使用"existing"。此处使

用的备份方法等于GNU emacs的"version-control"值。可使用如下这些简短的提示词进行备份。

"t"或"numbered"

创建有编号的备份。

"nil"or"existing"

只在存在目标文件时创建备份。

"never"or"simple"

创建简单的备份。

FSF GNU File Utilities mv(1)

1.4.7.3 r m:删除文件和目录 rm命令用于删除文件和目录。

文件删除格式为:rm[filename] 格 式

目录删除格式为:rm –r directory

rm命令选项中的常用选项是-r和-f选项。-r选项用于直接删除普通文件,如果是路径则一次

性删除所有下一级路径和文件。-f选项不显示询问而直接强制删除。shell脚本中经常使用这些

选项。

Linux系统上没有undelete,即撤销删除(回收站)命令。也就是说,rm命令会永久删除文件,

所以要慎用。

当然,文件被删除后也容易恢复,但必须使用ext3文件系统和ext3grep实用工具。以上内容

属于系统管理范畴,本书不会涉及。各位可以参考我在韩国LUG网站上编写的内容。

(http://www.lug.or.kr/home/bbs/board.php?bo_table=centos_book&wr_id=498)

(实用工具网站:http://code.google.com/p/ext3grep/)

[root@localhost ~]# echo "remove" > remove.txt

[root@localhost ~]# ls

anaconda-ks.cfg install.log script.txt test0.txt

backup install.log.syslog scsrun.log test1.txt

backup2 mc-4.6.1a-35.el5.i386.rpm shelltest.sh test2.txt

html0.html remove.txt tarfile.tgz

[root@localhost ~]# rm remove.txt

rm: remove regular file `remove.txt'? y

[root@localhost ~]# ls

anaconda-ks.cfg install.log scsrun.log test1.txt

backup install.log.syslog shelltest.sh test2.txt

backup2 mc-4.6.1a-35.el5.i386.rpm tarfile.tgz

html0.html script.txt test0.txt

[root@localhost ~]#

Page 52: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

52 第 1 章 Linux shell 和基本指令

rm指令帮助页面

[root@localhost ~]# man rm

RM(1) RM(1)

名称

rm:删除文件

概要

rm [-dfirvR] [--directory] [--force] [--interactive] [--recursive]

[--help] [--version] [--verbose] name...

说明

本帮助页面内容并非最新版本,有些部分可能有误或缺失。如果需要完整版手册,请参考Texinfo文档。

此帮助页面支持rm命令的GNU版本。rm命令用于删除指定的文件,初始值不删除路径。

如果文件模式为只读,标准输入是tty,未指定-f或--force选项时,使用rm命令显示"是否删除所选文件"。此时,输入"y"或"Y"才能移动

该文件。

与GNU rm命令共同使用getopt(3)函数的所有程序中,"?"选项之后输入的内容不能识别为选项。也就是说,要想删除文件名为"-f"的文件,

可以选择"rm -- -f"或"rm ./-f"

这些功能的开发是考虑到Unix rm命令中以"-"字符开始的选项。

选项

-d、--directory

取代"rmdir"命令,与"unlink"结合并删除路径。进行unlink前不会确认是否为空路径,直接操作。因此,删除的路径内如果有文件,可能

出现文件归属问题。(无法访问或丢失)

使用该选项后请利用fsck(8)检查文件系统。只有系统管理员才有权使用该选项。

-f、--force

如果没有删除的文件就不会显示任何提示消息,直接删除文件或目录。该选项在shell脚本中很有用。

-i、--interactive

逐个删除文件时先询问用户,此时输入"y"或"Y"才能删除。

-r、-R、--recursive

直接删除普通文件,如果是路径就会一次性删除下一级路径和文件。

-v、--verbose

详细显示每个文件的删除过程。

--help

显示帮助并退出。

--version

显示版本信息并退出。

FSF GNU File Utilities RM(1)

Page 53: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.4 Linux 目录操作 53

1

2

3

4

5

8

6

7

1.4.7.4 mkdir:创建目录 mkdir命令用于创建目录。

格 式 mkdir directory

[root@localhost ~]# ls

anaconda-ks.cfg install.log scsrun.log test1.txt

backup install.log.syslog shelltest.sh test2.txt

backup2 mc-4.6.1a-35.el5.i386.rpm tarfile.tgz

html0.html script.txt test0.txt

[root@localhost ~]# mkdir make_directory

[root@localhost ~]# ls

anaconda-ks.cfg install.log script.txt test0.txt

backup install.log.syslog scsrun.log test1.txt

backup2 make_directory shelltest.sh test2.txt

html0.html mc-4.6.1a-35.el5.i386.rpm tarfile.tgz

[root@localhost ~]#

mkdir指令帮助页面

[root@localhost ~]#man mkdir

MKDIR(1) MKDIR(1)

名称

mkdir:创建路径

概要

mkdir [-p] [-m mode] [--parents] [--mode=mode] [--help] [--version]

dir...

说明

本帮助页面的内容并非最新版本,有些部分可能有误或缺失。如果需要完整版手册,请参考Texinfo文档。

此帮助页面支持mkdir命令的GNU版本。mkdir命令利用已有名称创建路径。默认创建的路径模式为0777。

选项

-m、--mode mode

将用作mode的是chmod(1)的符号格式或数字格式,该值忽略默认模式。

-p、--parents

需要时创建上层目录。使用"mkdir~/dest/dir1"命令时,如果不存在"~/dest"路径就发送错误消息。但使用该选项就能创建"~/dest"路

径,在该路径内创建"dir1"路径。创建的上层路径的模式值为"u+wx"。

--help

Page 54: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

54 第 1 章 Linux shell 和基本指令

显示帮助并退出。

--version

显示版本信息并退出。

FSF GNU File Utilities MKDIR(1)

1.4.7.5 fmdir:删除空目录 rmdir命令用于删除空目录。

格 式 rmdir directory

rmdir指令并不常用,通常使用rm-rf命令删除目录。使用rmdir命令删除目录的前提是,被删

除的目录内不能放置文件,即只能删除空目录。

[root@localhost ~]# ls

anaconda-ks.cfg install.log script.txt test0.txt

backup install.log.syslog scsrun.log test1.txt

backup2 make_directory shelltest.sh test2.txt

html0.html mc-4.6.1a-35.el5.i386.rpm tarfile.tgz

[root@localhost ~]# echo "test file" > make_directory/rmdir.txt # 文件生成

[root@localhost ~]# ls make_directory

rmdir.txt

[root@localhost ~]# rmdir make_directory

rmdir: make_directory: Directory not empty

[root@localhost ~]# rm -r make_directory

rm: descend into directory 'make_directory'? y

rm: remove regular file 'make_directory/rmdir.txt'? y

rm: remove directory 'make_directory'? y

[root@localhost ~]# ls

anaconda-ks.cfg install.log scsrun.log test1.txt

backup install.log.syslog shelltest.sh test2.txt

backup2 mc-4.6.1a-35.el5.i386.rpm tarfile.tgz

html0.html script.txt test0.txt

[root@localhost ~]#

我们之前使用mkdir命令创建了make_directory的目录。在该目录内创建1个rmdir.txt文件后,

使用rmdir命令不能删除该目录。先使用rm-r命令删除整个目录,此时,先进入目录内删除文件,

然后删除空目录。使用rm-rf命令可以不显示询问而直接强制删除。

rmdir指令帮助页面

[root@localhost ~]# man rmdir

RMDIR(1) RMDIR(1)

Page 55: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.5 I/O 重定向和管道 55

1

2

3

4

5

8

6

7

名称

rmdir:删除空目录

概要

rmdir [-p] [--parents] [--help] [--version] dir…

说明

本帮助页面内容并非最新版本,有些部分可能有误或缺失。如果需要完整版手册,请参考Texinfo文档。

此帮助页面支持rmdir命令的GNU版本。rmdir命令删除空目录。如果不使用任何选项则返回错误编号并退出。

选项

-p、--parents

删除上层目录。必须在上层目录为空的情况下执行。

--help

显示帮助并退出。

--version

显示版本信息并退出。

若非空路径,则使用rm -r选项删除该路径及其包含的所有文件和下一级路径。

FSF GNU File Utilities RMDIR(1)

1.5 I/O 重定向和管道

我们已经学过能够在屏幕上显示文件目录的ls命令。Linux系统的命令可以在屏幕上显示命令结

果,也能将该结果保存为文件,并可以将文件内容指定为命令的输入。(I/O重定向,如图1-16所示)

图1-16 标准I/O

1.5.1 标准输出

大部分命令行程序都能在屏幕上显示输出结果,这就是标准输出(Standard Output),它的文

件描述符的数值是1。Linux系统的标准输出用于在屏幕上显示内容,可以利用标准输出重定向将

该命令结果保存为文件,此时使用“>”字符(大于号或右尖括号)。也就是说,“>”字符用于输

出重定向。

Page 56: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

56 第 1 章 Linux shell 和基本指令

格 式 ls > [要输出的文件名]

[root@localhost ~]# ls

anaconda-ks.cfg install.log scsrun.log test1.txt

backup install.log.syslog shelltest.sh test2.txt

backup2 mc-4.6.1a-35.el5.i386.rpm tarfile.tgz

html0.html script.txt test0.txt

[root@localhost ~]# ls > ls.txt

[root@localhost ~]# cat ls.txt

anaconda-ks.cfg

backup

backup2

html0.html

install.log

install.log.syslog

ls.txt

mc-4.6.1a-35.el5.i386.rpm

script.txt

scsrun.log

shelltest.sh

tarfile.tgz

test0.txt

test1.txt

test2.txt

[root@localhost ~]#

上述示例中,使用cat命令的目的在于读取文本文件并显示在屏幕上。从以上操作可以看出,

将ls命令的输出值通过重定向以ls.txt文件格式输出(保存)。 使用cat命令查看ls.txt文件,即可显

示保存了ls命令的输出值。换言之,显示命令时指定为文本文件并保存。(ls命令的结果不显示在

屏幕上,直接保存为ls.txt文件。)

那么,需要向ls.txt文件添加(append)内容时该如何处理?再次写入输出重定向字符即可(使

用“>>”字符)。

[root@localhost ~]# ls

anaconda-ks.cfg install.log script.txt test0.txt

backup install.log.syslog scsrun.log test1.txt

backup2 ls.txt shelltest.sh test2.txt

html0.html mc-4.6.1a-35.el5.i386.rpm tarfile.tgz

[root@localhost ~]# cat test1.txt

English only

[root@localhost ~]# cat test1.txt >> ls.txt

[root@localhost ~]# cat ls.txt

Page 57: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.5 I/O 重定向和管道 57

1

2

3

4

5

8

6

7

anaconda-ks.cfg

backup

backup2

html0.html

install.log

install.log.syslog

ls.txt

mc-4.6.1a-35.el5.i386.rpm

script.txt

scsrun.log

shelltest.sh

tarfile.tgz

test0.txt

test1.txt

test2.txt

English only

[root@localhost ~]# cat test1.txt >> lsls.txt

[root@localhost ~]# cat lsls.txt

English only

[root@localhost ~]#

使用cat命令显示当前test1.txt文件内容,可以看出其中保存了“English only”字符串。在ls.txt

文件的 后一行添加该字符串时使用以上命令。先使用cat命令显示test1.txt文件,然后使用 “>>”

字符将内容重定向至ls.txt,这样就能使test1.txt文件内容添加到ls.txt文件的 后一行。如果不存在

需要重定向的文件,就会同lsls.txt文件一样创建指定的新文件。

要想删除文本文件的所有内容并创建空文件,就使用cat命令读取/dev/null设备文件内容,然

后对该文件进行重定向即可。当然也可以使用echo“”>lsls.txt文件。

[root@localhost ~]# cat /dev/null > lsls.txt

[root@localhost ~]# ls -l lsls.txt

-rw-r--r-- 1 root root 0 2009-07-16 16:48 lsls.txt

[root@localhost ~]#

与Linux系统的标准I/O、标准错误对应的文件描述符数字如表1-14所示。

表1-14 标准I/O文件描述符

标准I/O 文件描述符数字

标准输入(stdin):键盘 0

标准输出(stdout):显示器 1

标准错误(stderr):显示器 2

2>&1表示将标准错误(2)也传递到标准输出(1)传递的位置。通常使用“执行命令”>/dev/null

Page 58: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

58 第 1 章 Linux shell 和基本指令

2>&1格式将标准错误信息传递到/dev/null设备上,该重定向示例删除了所有执行命令相关的标准

错误和标准输出信息。

2>&1 &表示将标准错误传递到标准输出传递的位置, 后使用 “&”字符,表示在后台执

行当前命令。

# 不存在linuxer.txt文件时执行标准输出,屏幕上显示标准错误信息。

[root@localhost ~]# cat linuxer.txt

cat: linuxer.txt: No such file or directory

# 用cat命令输出不存在的linuxer.txt文件就会显示标准错误信息。此时,由于通过/dev/null设备只重定向了标准输出内容,所以屏幕上

只显示标准错误信息。

[root@localhost ~]# cat linuxer.txt > /dev/null

cat: linuxer.txt: No such file or directory

# 2>&1表示将标准错误(2)也传递到标准输出(1)传递的位置,为了显示不存在的文件而使用cat命令,其发出的错误信息也会传递到

/dev/null/设备。因此,屏幕上不会显示任何信息,所有标准输出和标准错误最终都会消失。

[root@localhost ~]# cat linuxer.txt > /dev/null 2>&1

# 删除不存在的linuxer.txt文件时屏幕上会显示错误信息。

[root@localhost ~]# rm linuxer.txt

rm: cannot lstat `linuxer.txt': No such file or directory

# rm命令的运行结果会保存到rm_error.txt文件,此时将rm运行结果的标准错误(2)重定向至标准输出(1)。因此,错误信息将保存到

rm_error.txt文件,但不会显示在屏幕上。

[root@localhost ~]# rm linuxer.txt > rm_error.txt 2>&1

[root@localhost ~]# cat rm_error.txt

rm: cannot lstat `linuxer.txt': No such file or directory

[root@localhost ~]#

1.5.2 标准输入

大部分Linux指令都通过标准输入(Standard Input)执行输入工作。

标准输入是指通过键盘输入数据。也可以不使用键盘,而通过文件输入,此时需要使用“<”

字符(小于号或左尖括号)。它的文件描述符的数值是0。

格 式 sort < [要输入的文件名]

Page 59: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.5 I/O 重定向和管道 59

1

2

3

4

5

8

6

7

例如,要使用sort命令对输入文件的内容进行排序并显示在屏幕上时,使用“<”字符从文件

中获取数据,写下要输入的文件名即可完成操作。将之前已经通过输出重定向创建的ls.txt文件用

作sort命令的输入文件,然后进行排序,显示以文件名的第一个字符为准升序排列的结果。

[root@localhost ~]# sort < ls.txt

anaconda-ks.cfg

backup

backup2

English only

html0.html

install.log

install.log.syslog

ls.txt

mc-4.6.1a-35.el5.i386.rpm

script.txt

scsrun.log

shelltest.sh

tarfile.tgz

test0.txt

test1.txt

test2.txt

[root@localhost ~]#

以下示例使用sort命令,将排序的文件内容进行“>”输出重定向,然后保存为其他文件。

[root@localhost ~]# sort < ls.txt > sorted_ls.txt

[root@localhost ~]# cat sorted_ls.txt

anaconda-ks.cfg

backup

backup2

English only

html0.html

install.log

install.log.syslog

ls.txt

mc-4.6.1a-35.el5.i386.rpm

script.txt

scsrun.log

shelltest.sh

tarfile.tgz

test0.txt

test1.txt

test2.txt

[root@localhost ~]#

Page 60: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

60 第 1 章 Linux shell 和基本指令

从以上示例可以看出,ls.txt文件的排序结果保存为sorted_ls.txt文件,使用cat命令显示该文件

即可查看已保存的排序结果。命令行中所有命令默认按照从左到右的顺序执行,因此先执行左侧

的输入重定向,之后通过输出重定向将该结果保存为sorted_ls.txt文件。

1.5.3 管道

Linux shell中经常通过组合指令、连续使用指令的方法执行多个指令。此时,使用“|”字符

(vertical bar,位于键盘中“\”字符上方)连接2个指令,表示前一命令的结果值将成为之后写入

的指令的输入。这就是管道(pipe)。也就是说,一个由管道连接的标准输出成为另外一个命令

的标准输入。

格 式 ls -l | less

以上格式的用途如下:使用ls-l命令在屏幕上显示文件目录,此时文件目录的输出行超过屏

幕一页,使用该命令实现逐行查看。此处“|”字符表示管道,意为“将ls-l命令的结果用作less

命令的输入”。如图1-17和图1-18显示短屏幕时,该命令就非常有用。

图1-17 ls-l--color=never | less 管道[1]

图1-18 ls-l--color=never | less 管道[2]

图1-17和图1-18中按上/下方向键就能上下移动。Linux控制台操作中经常使用管道。

Page 61: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.5 I/O 重定向和管道 61

1

2

3

4

5

8

6

7

表1-15 管道示例

管道示例 说 明 ls -lt | head 文件目录中以时间单位显示最近执行的文件时,写入head仅能显示10行

du -h | sort -nr du命令用于表示当前目录和下一级目录的文件大小,使用-h选项可以用K、M、G单位表示,

使用sort命令对该输出结果进行排序。sort命令中使用的-nr选项在排序时以数值为准,reserve是指逆向(降序)排序,因此,输出结果从最大的数值项目开始排列。(默认升序排列)

以下示例使用了du命令的“--max-depth 1”选项,表示显示从当前目录开始倒数一个目录。

使用“--max-depth 0”选项可以不显示目录而显示当前目录的整体大小。 # du -h --max-depth 1 | sort -nr # du -h --max-depth 0

find .type f - print | wc -l find命令用于检索,目录中使用“.”表示在当前目录中检索,使用-type f选项的同时对文件执

行-print选项,将文件显示在屏幕上,其目的在于显示当前目录和下一级目录中的所有文件。

然后使用wc -l命令对输出行计数之后显示在屏幕上,这就是管道使用示例。以下示例中使用

find命令显示的行数是46,也表示文件数为46个。还可以把“.”字符改为“/etc”以查询/etc目录下的文件数。不难看出,我当前使用的系统中,/etc目录下存放的文件总数是1341个。 # find /etc -type f -print | wc -l

1.5.4 过滤器

管道(|)可以使用各种过滤器(filter),过滤器通过标准输入接收数据,运算后再发送到标

准输出。过滤器的种类如表1-16所示。

Page 62: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

62 第 1 章 Linux shell 和基本指令

表1-16 过滤器的种类

过滤器程序 说 明

sort 对标准输入排序,通过标准输出显示排序结果

uniq 通过标准输入接收已排序的数据,删除重复项目后输出

grep 通过标准输入接收以“行”为单位的数据,搜寻其中指定字符模式的行并输出

fmt 通过标准输入读取文本,通过标准输出显示已格式化的文本

pr 通过标准输入写入文本,以页为单位显示数据

head 显示输入文件的前10行

tail 显示输入文件的后10行,在显示日志文件的最新日志时非常有用

tr 可以更改(大/小写字母)、重复、删除输入的字符并显示结果。例如:将用于DOS的文本文件转换

为UNIX的文本文件

sed 流编辑器,能够比tr命令对字符进行更多更改操作。该内容会在后面章节详细讲解

awk 功能强大的过滤器,可以说是一种编程语言。该内容会在后面章节详细讲解

管道过滤示例

cat test.txt | fmt | pr | lpr

将通过标准输入接收的数据发送到lpr程序,即可在命令行shell中执行打印。但上面的字符

串表示,接收test.txt文件后通过fmt进行格式化,然后通过pr分页,使用lpr打印机执行打印。

cat unsorted_list.txt | sort | uniq | pr | lpr

使用sort命令对无序文件进行升序排列,通过uniq删除重复项目,通过pr分页,使用lpr打

印机执行打印。

tar –tvzf tarfile.tgz | less

使用-tvzf选项查看tar和gzip压缩文件的目录,将该结果用作less命令的输入并显示,如图

1-19所示。

[root@localhost ~]# tar -tvzf tarfile.tgz | less

图 1-19

1.6 文件访问权限

Linux等支持多任务处理和多用户的类UNIX系统中,对文件和目录赋予的访问权限称为文件

访问权限(perimission)。

Page 63: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.6 文件访问权限 63

1

2

3

4

5

8

6

7

由于多用户在一个系统上进行操作,每个用户都需要拥有私人区域和私人文件。如果他人未

经许可而直接删除或修改文件,就会导致自己无法控制操作系统。为防止发生上述情况,Linux

系统对文件和目录设置了访问权限,这就有了“文件访问权限”的概念。

文件访问权限相关指令如下。

chmod:修改文件/目录访问权限的命令。

su:临时转为超级用户或其他用户的命令。

chown:修改文件/目录所有者的命令。

chgrp:修改文件/目录的组所有者的命令。

1.6.1 文件/目录许可

文件许可分为read、write、execute,分别表示读、写、执行权限。请看如下示例。

[root@localhost ~]# ls -l /bin/bash

-rwxr-xr-x 1 root root 735004 2009-01-22 10:14 /bin/bash

[root@localhost ~]#

可以从上面的/bin/bash文件看出, 前面使用了-rwxr-xr-x格式标记。这表示对文件赋予了许

可, 前端标记的字符表示文件类型:“d”字符表示目录,“-”字符表示普通文件,“c”字符表

示字符设备,“b”字符表示块设备,“l”(小写字母l)字符表示符号链接文件,“s”字符表示网

络套接字文件。 表1-17 根据许可的首字符区分文件类型

许可的首字符 含 义 d 目录

- 文本文件、shell脚本文件、可执行文件

c 字符设备

b 块设备(存储设备)

l(小写字母l) 符号链接文件

s 网络套接字文件

图1-20标记的9位数字符串中,每3位分别表示用户、组、所有人的访问权限。也就是说,“rwx”

表示文件所有者root具有读、写、执行功能,“r-x”表示指定在文件内的root组所属用户具有读和

执行功能,“r-x”表示剩下的3位数字符串向所有用户赋予读和执行功能。

此“root root”格式中,前面的root表示文件所有者,后面的root表示文件所属组名。

Page 64: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

64 第 1 章 Linux shell 和基本指令

图 1-20

1.6.2 chmod

chmod命令用于修改文件/目录许可。

“rwx”这3个字符用二进制数表示并被识别为2n的形式。也就是说,首字符r是22,第二个字

符w是21,第三个字符x是20。因此,rwx可以用二进制数111或十进制数7表示。

wx rwx rwx = 111 111 111 = 777

rw- rw- rw- = 110 110 110 = 666

rwx --- --- = 111 000 000 = 700

rwx = 111 , binary = 7

rw- = 110 , binary = 6

r-x = 101 , binary = 5

r-- = 100 , binary = 4

许可默认由4位八进制数组成。 前端表示的意义如表1-18所示,如果首位数是0则可以省略。

表1-18 许可示例

八进制数 说 明 模式设置 模式设置说明 4700 设置为用户名状态 -rws------ 位于用户位置故设为setuid

2700 设置为组名状态 -rwxrws------ 位于组位置故设为setgid

1777 设置为粘滞位(sticky bit) -rwxrwxrwt 粘滞位

0400 对用户的读许可 -r-------- 只允许用户的读许可

前端的值由4/2/1组成,以-rws/rws/rwt格式进入。以4开头成为4755之后,s就会设置到用户

的执行许可,成为setuid,显示许可4755-rwsr-xr-x格式。也就是说,设置为setuid的可执行文件在执

行时赋予所有者权限。当然,设置为setgid的可执行文件在执行时赋予组权限。

下面利用touch命令创建perm.txt空文件并查看许可,接着对许可进行修改。修改许可时可以

用之前学过的二进制数指定,u字符为用户、g字符为组、o字符为所有人,之后通过+或-运算添

Page 65: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.6 文件访问权限 65

1

2

3

4

5

8

6

7

加或删除r、w、x。

[root@localhost ~]# touch perm.txt

[root@localhost ~]# ls -l perm.txt

-rw-r--r-- 1 root root 0 2009-07-17 00:51 perm.txt

[root@localhost ~]# chmod 777 perm.txt

[root@localhost ~]# ls -l perm.txt

-rwxrwxrwx 1 root root 0 2009-07-17 00:51 perm.txt

[root@localhost ~]# chmod o-rwx perm.txt

[root@localhost ~]# ls -l perm.txt

-rwxrwx--- 1 root root 0 2009-07-17 00:51 perm.txt

[root@localhost ~]# chmod g-x perm.txt

[root@localhost ~]# ls -l perm.txt

-rwxrw---- 1 root root 0 2009-07-17 00:51 perm.txt

[root@localhost ~]# chmod o+r perm.txt

[root@localhost ~]# ls -l perm.txt

-rwxrw-r-- 1 root root 0 2009-07-17 00:51 perm.txt

[root@localhost ~]# chmod 770 perm.txt

[root@localhost ~]# ls -l perm.txt

-rwxrwx--- 1 root root 0 2009-07-17 00:51 perm.txt

[root@localhost ~]#

Linux中使用touch或vim创建文件后,许可默认设置为644(rw-r--r--)。Linux的许可默认设置

为umask,它设置在/etc/bashrc中。

[root@localhost ~]# 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.

alias ls='ls --color=auto --time-style=long-iso'

if [ $UID -gt 99 ] && [ "`id -gn`" = "`id -un`" ]; then

umask 002

else

umask 022

fi

...中略...

用户登录shell时自动读取/etc/bashrc文件并设置环境,上述/etc/bashrc文件中有if语句。此时,

UID值大于99,umask设置为002;小于99,umask设置为022。

Page 66: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

66 第 1 章 Linux shell 和基本指令

[root@localhost ~]# id

uid=0(root) gid=0(root)

groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

[root@localhost ~]#

上述root用户的uid值为0,因此,root创建的文件被设置为umask 022。

umask是八进制数的补码(complement),也是适用于文件/目录的掩码,Linux系统中默认创

建文件时不能赋予执行权限(x)。对目录而言,执行权限就是该目录的访问权限,因此,创建目

录的同时赋予执行权限。

通过umask值创建的文件许可从默认值666中减去umask值,目录创建许可从默认值777中减

去umask值。超级用户登录时,umask值自动设置为022。根据以上方法,666022=644就是在644

(-rw-r--r--)许可下创建文件;目录是777022=755(drwxr-xr-x),在该许可下生成目录。

普通用户的uid值大于500,所以umask值设置为002。那么默认文件创建许可是666002=664,

目录创建许可是777002=775。

表1-19 UID和umask值决定的文件/目录创建许可

划分UID umask值 文件创建许可(666 -umask) 目录创建许可(777-umask)

UID>99(普通用户) 002 666-002=664 777-002=775

UID<99(超级用户) 022 666-022=644 777-022=755

从下列示例可以看出,超级用户创建的perm2.txt文件许可是644,perm2目录创建许可是755。

[root@localhost ~]# touch perm2.txt

[root@localhost ~]# mkdir perm2

[root@localhost ~]# ls -l | grep perm2

drwxr-xr-x 2 root root 4096 2009-07-17 02:05 perm2

-rw-r--r-- 1 root root 0 2009-07-17 02:04 perm2.txt

[root@localhost ~]#

执行umask指令查看当前设置的umask值。可以使用umask指令修改默认设置的umask值,但

重新登录时会自动读取/etc/basnrc文件,所以超级用户的umask值会自动设置为022 。(使用umask

命令显示为八进制数4位数值。)

[root@localhost ~]# umask

0022

[root@localhost ~]# umask 002

[root@localhost ~]# umask

0002

[root@localhost ~]# umask 022

[root@localhost ~]# umask

0022

[root@localhost ~]#

Page 67: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.6 文件访问权限 67

1

2

3

4

5

8

6

7

Linux系统下使用useradd命令创建用户,对创建的用户从500起赋予uid值。对普通用户multi

进行用户转换。因multi用户的UID值大于99,所以可知umask值是002,文件创建时从666减去umask

002就设置为664(rw-rw-r--)。(使用umask命令显示为八进制数4位数值。)

[root@localhost ~]# su - multi

[multi@localhost ~]$ id

uid=500(multi) gid=500(multi) groups=500(multi)

[multi@localhost ~]$ umask

0002

[multi@localhost ~]$ touch perm2.txt

[multi@localhost ~]$ mkdir perm2

[multi@localhost ~]$ ls -l | grep perm2

drwxrwxr-x 2 multi multi 4096 2009-07-17 02:07 perm2

-rw-rw-r-- 1 multi multi 0 2009-07-17 02:07 perm2.txt

[multi@localhost ~]$ exit

下面简单介绍find命令。要想在/etc目录文件中搜寻包含umask的行,可以使用命令:

[root@localhost ~]# find /etc | xargs grep umask

上面使用的xargs命令通过标准输入将被输入的行用作xargs命令的下一个命令执行参数

(argument)。也就是说,使用find命令搜寻的所有文件名(按行分类)通过管道后,该行的文件

名成为下一个grep命令的参数,然后在每个文件中搜寻包含umask字符串的行, 后输出结果。

表1-20 文件的chmod值

chmod值 说 明 777 (-rwxrwxrwx)

不限制所有访问权限,任何人均享有读、写、执行权限

755 (-rwxr-xr-x)

文件所有者具有读、写、执行权限,文件指定的组和个人都享有读、执行权限

700 (-rwx------)

仅文件所有者具有读、写、执行权限,其余任何人不能访问,系统管理员执行的程序或安全系统上才

设置该模式

666 (-rw-rw-rw-)

所有用户均享有读、写、执行权限。

644 (-rw-r--r--)

文件所有者可以读/写,其他用户只读,只有文件所有者才能修改文件内容

600 (-rw-------)

只有文件所有者才能读/写,其他用户不能访问

下面了解目录许可。chmod命令不仅可以使用在文件上,也能修改目录许可。

root@localhost ~]# mkdir dir

[root@localhost ~]# cd dir

Page 68: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

68 第 1 章 Linux shell 和基本指令

[root@localhost dir]# pwd

/root/dir

[root@localhost dir]# mkdir testdir

[root@localhost dir]# ls -l

total 4

drwxr-xr-x 2 root root 4096 2009-07-17 02:30 testdir

[root@localhost dir]# chmod 777 testdir

[root@localhost dir]# ls -l

total 4

drwxrwxrwx 2 root root 4096 2009-07-17 02:30 testdir

[root@localhost dir]# chmod o-rwx testdir

[root@localhost dir]# ls -l

total 4

drwxrwx--- 2 root root 4096 2009-07-17 02:30 testdir

[root@localhost dir]#

表1-21 目录的chmod值

chmod值 说 明 777 (drwxrwxrwx)

任何人都具有读、写、执行权限, 一般设置在网络编程的匿名文件更新目录上

755 (drwxr-xr-x)

目录所有者享有读、写、执行权限,其他用户只有读和执行权限,所以不能在目录内创建文件

700 (drwx------)

目录所有者享有读、写、执行权限,其他用户不能访问,所以该目录下只能创建目录所有者的私人文件

另外,使用 su -命令可将普通用户转为超级用户,操作结束后又能返回原来的普通用户页面。

如前所述, 高管理员超级用户具有文件/目录访问权限,普通用户也能临时转为超级用户。根

据以下操作使用su -命令后再输入超级用户密码即可。

[multi@localhost ~]$ id

uid=500(multi) gid=500(multi) groups=500(multi)

[multi@localhost ~]$ su -

密码:

[root@localhost ~]# id

uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

[root@localhost ~]# exit

logout

[multi@localhost ~]$

以上示例中,id命令用于显示当前登录shell的用户信息,可查看当前shell登录用户的uid、gid等。

结束root操作后,使用exit或logout命令、或Ctrl-D快捷键退出root shell,返回普通用户shell。

需要记住,不使用“-”选项而直接使用su命令会保持转换前的环境变量;使用su-命令就会

Page 69: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.6 文件访问权限 69

1

2

3

4

5

8

6

7

适用转换的新用户的环境变量,所以转换为超级用户时必须使用su-命令。

1.6.3 chown、chgrp

本节讲解能够修改文件/目录所有者和组的chown命令(change file owner and group)。仅看指

令本身就能猜到,chown是change owner的缩写,只有超级用户才能使用chown命令。

格 式 chown [所有者] [.或:] [组] [文件名或目录名]

[multi@localhost ~]$ su -

密码:

[root@localhost ~]# ls -l perm.txt

-rwxrwx--- 1 root root 0 2009-07-17 02:03 perm.txt

[root@localhost ~]# chown multi.multi perm.txt

[root@localhost ~]# ls -l perm.txt

-rwxrwx--- 1 multi multi 0 2009-07-17 02:03 perm.txt

[root@localhost ~]# chown root:root perm.txt

[root@localhost ~]# ls -l perm.txt

-rwxrwx--- 1 root root 0 2009-07-17 02:03 perm.txt

[root@localhost ~]#

使用chgrp命令仅对文件的组进行修改。

格 式 chgrp [组名] [文件名或目录名]

[root@localhost ~]# ls -l perm.txt

-rwxrwx--- 1 root root 0 2009-07-17 02:03 perm.txt

[root@localhost ~]# chgrp multi perm.txt

[root@localhost ~]# ls -l perm.txt

-rwxrwx--- 1 root multi 0 2009-07-17 02:03 perm.txt

[root@localhost ~]#

1.6.4 lsattr、chattr

Linux系统对普通许可和文件都赋予特定属性(attribution)。使用lsattr命令显示文件属性,使

用chattr命令修改文件属性。

[root@localhost ~]# mkdir attribute

[root@localhost ~]# cd attribute

[root@localhost attribute]# pwd

/root/attribute

Page 70: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

70 第 1 章 Linux shell 和基本指令

[root@localhost attribute]# echo "file attribution" > attribution.txt

[root@localhost attribute]# ls -l

total 4

-rw-r--r-- 1 root root 17 2009-07-17 03:29 attribution.txt

[root@localhost attribute]# lsattr

------------- ./attribution.txt

[root@localhost attribute]#

根据以上操作,创建文件后使用lsattr命令就会发现未赋予任何属性。下面使用chattr命令向

attribution.txt文件添加i属性。使用+运算符添加属性,使用-运算符删除属性。(chattr +i [文件名])

[root@localhost attribute]# chattr +i attribution.txt

[root@localhost attribute]# lsattr

----i-------- ./attribution.txt

[root@localhost attribute]#

向attribution.txt文件添加i属性后,使用lsattr命令查看,显示已添加。

i属性(immutable)成功添加到文件后,即使是超级用户也不能修改、或删除文件。还可以

添加a属性(append only),添加a属性后可以添加文件内容,但即使是超级用户也不能删除文件。

表1-22 添加/删除文件属性

文件属性添加/删除命令 说 明 chattr +i / chattr -i 在文件属性中添加/删除i属性 即使是超级用户也不能修改或删除文件(immutable)

chattr +a / chattr -a 在文件属性中添加/删除a属性。 可以添加文件内容,但即使是超级用户也不能删除

文件(append only)

从下列示例中可以看出,不能删除赋予i属性的attribution.txt文件。此时先用lsattr命令查看当

前文件的属性,删除i或a属性之后再删除文件。也就是说,先使用chattr -i命令删除i属性后再删除

文件。

[root@localhost attribute]# lsattr

----i-------- ./attribution.txt

[root@localhost attribute]# rm -f attribution.txt

rm: cannot remove `attribution.txt': Operation not permitted

[root@localhost attribute]# chattr -i attribution.txt

[root@localhost attribute]# lsattr

------------- ./attribution.txt

[root@localhost attribute]# rm -f attribution.txt

[root@localhost attribute]# ls -l

total 0

[root@localhost attribute]#

Page 71: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.7 作业控制 71

1

2

3

4

5

8

6

7

下面介绍a属性示例。

[root@localhost attribute]# echo "a attribution" > attribution2.txt

[root@localhost attribute]# cat attribution2.txt

a attribution

[root@localhost attribute]# chattr +a attribution2.txt

[root@localhost attribute]# lsattr

-----a------- ./attribution2.txt

[root@localhost attribute]# echo "append test" >> attribution2.txt

[root@localhost attribute]# cat attribution2.txt

a attribution

append test

[root@localhost attribute]# rm -f attribution2.txt

rm: cannot remove `attribution2.txt': Operation not permitted

[root@localhost attribute]# chattr -a attribution2.txt

[root@localhost attribute]# lsattr

------------- ./attribution2.txt

[root@localhost attribute]# rm -f attribution2.txt

[root@localhost attribute]# ls -l

total 0

[root@localhost attribute]#

从以上示例可以看出,文件属性中a属性表示append only,只能添加文件内容,即使是超级

用户也无法删除文件。当然,可以使用chattr -a [文件名]格式删除a属性后再删除文件。

使用rm -f命令无法删除文件时

如果正在运行的Linux系统上出现了连超级用户也无法删除的文件,则先使用lsattr命令

查看文件属性,再使用chattr命令删除文件属性,然后删除文件。

1.7 作业控制

我们已经学习了在Linux多用户系统上对文件和目录设置访问权限的方法。本节学习Linux多

任务(Job)处理。

Linux多任务处理是指同时使用多个作业,即多个进程。实际上,具有1个处理器的电脑每次

只能运行1个进程。但Linux内核能够同时管理每个进程的运行,它通过以下指令控制和管理进程。

ps:显示系统中正在运行的进程目录。

kill:向一个或多个进程传送kill信号(kill [进程编号])。

Page 72: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

72 第 1 章 Linux shell 和基本指令

jobs:在当前shell中显示自己的进程目录。

bg:向后台传送进程(background)。

fg:向前台传送进程(foreground)。

1.7.1 bg

在Xwindow GUI上打开1个终端,然后在shell中输入“xload &”,运行显示系统路线的GUI

程序。在指令后添加“&”字符表示后台运行。

[multi@localhost ~]$ xload &

[1] 3084

[multi@localhost ~]$ ls

Desktop

[multi@localhost ~]$

在后台运行xload程序,同时展示图1-21中的GUI画面,终端上显示执行xload程序时OS赋予

的进程编号。也就是说,xload程序的进程编号是3084 。

图1-21 xload

由此看来,后台执行程序时在1个shell中可以额外使用其他命令。通常在前台执行时只输入

指令(不输入&字符),该shell就能执行附加操作。

如果已在前台运行xload程序,还想在同一个shell上执行其他操作,此时可以使用Ctrl-Z快捷

键暂停xload程序。此处的“停止”不是指进程完全结束,而是“idle状态”。暂停后执行需要的

命令,然后使用bg命令在后台继续运行xload程序。这样既可以再次执行xload程序,也能继续使

用其他命令。

[multi@localhost ~]$ xload

[1]+ Stopped xload

[multi@localhost ~]$ ls

Desktop

[multi@localhost ~]$ bg

[1]+ xload &

[multi@localhost ~]$

Page 73: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.7 作业控制 73

1

2

3

4

5

8

6

7

1.7.2 jobs、ps、kill

上一小节我们运行了xload程序,下面使用jobs命令显示当前后台运行的shell进程。

[multi@localhost ~]$ jobs

[1]+ Running xload &

[multi@localhost ~]$

ps命令比jobs命令更强大,使用ps命令显示进程ID(PID)。ps命令的常用选项是ps aux或ps -ef

选项,ps aux --forest格式用于显示进程目录的树形结构。使用pstree命令则仅显示进程的树形结构。

[multi@localhost ~]$ ps

PID TTY TIME CMD

3044 pts/2 00:00:00 bash

3104 pts/2 00:00:00 xload

3154 pts/2 00:00:00 ps

[multi@localhost ~]$

下面使用kill命令结束(退出)xload进程。

使用“kill %[编号]”退出jobs中的进程,如果要退出ps命令进程,可以使用PID执行"kill [PID

编号]"。

[jobs,kill]

[multi@localhost ~]$ jobs

[1]+ Running xload &

[multi@localhost ~]$ kill %1

[multi@localhost ~]$ ps

PID TTY TIME CMD

3044 pts/2 00:00:00 bash

3163 pts/2 00:00:00 ps

[1]+ 结束 xload

[multi@localhost ~]$

[ps,kill]

[multi@localhost ~]$ xload &

[1] 3166

[multi@localhost ~]$ ps

PID TTY TIME CMD

3044 pts/2 00:00:00 bash

3166 pts/2 00:00:00 xload

3167 pts/2 00:00:00 ps

[multi@localhost ~]$ kill 3166

[multi@localhost ~]$ ps

Page 74: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

74 第 1 章 Linux shell 和基本指令

PID TTY TIME CMD

3044 pts/2 00:00:00 bash

3168 pts/2 00:00:00 ps

[1]+ 结束 xload

[multi@localhost ~]$

使用kill命令向进程发送信号,OS接收信号后执行与信号匹配的任务。

[kill指令帮助页面]

[root@localhost ~]# man kill

KILL(1) Linux Programmer's Manual KILL(1)

名称

kill:结束进程

概要

kill [ -s signal | -p ] [ -a ] pid ...

kill -l [ signal ]

说明

kill命令向指定进程发送信号。没有指定信号则默认发送TERM信号,该信号用于结束进程。若使用TERM信号不能结束进程,也可以发送

KILL(9)信号。

目前大部分shell具有内置kill函数。(因此一般不常用该命令,它用于强制结束进程。)

选项

pid...

需要结束的进程ID或进程名。

-s 指定需要特殊发送的信号,此处出现信号名称或编号。

-p 指定进程ID时,实际上不向进程发送信号,而发送该进程名。

-l 显示能充当信号的信号名。可以在/usr/include/linux/signal.h文件中获得。

相关项目

bash(1), tcsh(1), kill(2), sigvec(2)

作者

Taken from BSD 4.4. The ability to translate process names to process

ids was added by Salvatore Valente <[email protected]>.

Linux Utilities 14 October 1994 KILL(1)

信号是提供异步事件处理机制的软中断(software interrupt)。这些事件第一,发生在系统外

部,指用户主要创建Ctrl-C快捷键等中断字符的情况;第二,发生在程序内部操作过程中,指进

程执行“除0”(divide by zero)操作;第三,作为进程间通信(InterProcess Communication, IPC)

Page 75: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.7 作业控制 75

1

2

3

4

5

8

6

7

的默认形态,使不同进程之间也能互相发送信号。此书目的并非讲解编程,故只涉及使用kill命

令向相应进程发送信号的内容。

使用kill-l命令显示向OS发送的信号类型,共64种信号。显示内容不仅包括信号字符串,也

指定信号编号。

[multi@localhost ~]$ kill -l

1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL

5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE

9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2

13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT

17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP

21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU

25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH

29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN

35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4

39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8

43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12

47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14

51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10

55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6

59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2

63) SIGRTMAX-1 64) SIGRTMAX

[multi@localhost ~]$

/usr/include/asm/signal.h头文件中默认定义了信号。

[multi@localhost ~]$ cat /usr/include/asm/signal.h

#define NSIG 32

typedef unsigned long sigset_t;

#define SIGHUP 1

#define SIGINT 2

#define SIGQUIT 3

#define SIGILL 4

#define SIGTRAP 5

#define SIGABRT 6

#define SIGIOT 6

#define SIGBUS 7

#define SIGFPE 8

#define SIGKILL 9

#define SIGUSR1 10

#define SIGSEGV 11

#define SIGUSR2 12

#define SIGPIPE 13

Page 76: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

76 第 1 章 Linux shell 和基本指令

#define SIGALRM 14

#define SIGTERM 15

#define SIGSTKFLT 16

#define SIGCHLD 17

#define SIGCONT 18

#define SIGSTOP 19

#define SIGTSTP 20

#define SIGTTIN 21

#define SIGTTOU 22

#define SIGURG 23

#define SIGXCPU 24

#define SIGXFSZ 25

#define SIGVTALRM 26

#define SIGPROF 27

#define SIGWINCH 28

#define SIGIO 29

#define SIGPOLL SIGIO

/*

#define SIGLOST 29

*/

#define SIGPWR 30

#define SIGSYS 31

#define SIGUNUSED 31

/* These should not be considered constants from userland. */

#define SIGRTMIN 32

#define SIGRTMAX _NSIG

...中略...

表1-23 常与kill共同使用的信号

信号编号 信号名 说 明 1 SIGHUP hangup

退出系统或断开连接时发送此信号,修改用于特殊进程的配置文件,并马上适用该内容。

例如,执行阿帕奇网络服务器服务时,发生了“不得不修改httpd.conf文件并重启服务”

的情况。此时,使用killall -HUP httpd命令可以重启阿帕奇服务

2 SIGINT interrupt

用于结束当前运行的进程。一般发生于按Ctrl-C快捷键时,同时终止程序运行

3 SIGQUIT quit

与SIGINT一样,用户在终端按退出键(quit)时,通过内核发送信号,默认值为“Ctrl-\”。因该信号会导致结束异常,所以创建核心文件并终止。此时生成的核心文件是能通过

gdb等调试器进行分析的进程映像文件

9 SIGKILL kill

强制结束正在运行的进程。这是最常用的信号,可强制结束任一进程。可以使用该信

号强制终止TERM信号无法终止的进程

Page 77: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.7 作业控制 77

1

2

3

4

5

8

6

7

(续)

信号编号 信号名 说 明 11 SIGSEGV segmentation violation

发生于内存访问有误时,即进程因指针误用而侵入指定范围以外的内存区域时

15 SIGTERM terminate

通过正常终止进程中定义的正常终止方法完成终止。若kill命令未特别指定信号,则使用

该信号结束进程。若使用该信号无法终止某个进程,则使用KILL信号强制终止

下面是SIGTERM和SIGKILL相关示例。

[SIGTERM]

[multi@localhost ~]$ jobs

[SIGTERM]

[multi@localhost ~]$ firefox &

[1] 22849

[multi@localhost ~]$ ps

PID TTY TIME CMD

3044 pts/2 00:00:00 bash

22849 pts/2 00:00:00 firefox

22863 pts/2 00:00:00 run-mozilla.sh

22868 pts/2 00:00:01 firefox-bin

22874 pts/2 00:00:00 ps

[multi@localhost ~]$ kill -SIGTERM 22868

[multi@localhost ~]$ ps

PID TTY TIME CMD

3044 pts/2 00:00:00 bash

22875 pts/2 00:00:00 ps

[1]+ Exit 143 firefox

[multi@localhost ~]$

[SIGKILL]

[SIGKILL]

[multi@localhost ~]$ firefox &

[1] 22877

[multi@localhost ~]$ ps

PID TTY TIME CMD

3044 pts/2 00:00:00 bash

22877 pts/2 00:00:00 firefox

22891 pts/2 00:00:00 run-mozilla.sh

22896 pts/2 00:00:01 firefox-bin

22901 pts/2 00:00:00 ps

[multi@localhost ~]$ kill -SIGKILL 22896

[multi@localhost ~]$ ps

Page 78: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

78 第 1 章 Linux shell 和基本指令

PID TTY TIME CMD

3044 pts/2 00:00:00 bash

22902 pts/2 00:00:00 ps

[1]+ Exit 137 firefox

[multi@localhost ~]$

可以如上述示例所示结束进程,也可以仅输入kill [进程ID]终止。当然,还可以使用kill-9 [进

程ID]强制终止进程。

SIGTERM → kill 22868

SIGKILL → kill 22896

1.8 系统管理员指令总结

Linux系统提供很多指令,但篇幅有限,不能全部介绍,可以使用man命令查看详细内容。

格 式 # man [指令]

可在网页上搜索并查看Linux命令的帮助页面。(http://www.linuxmanpages.com &http://linux.

die.net/man)

1.8.1 用户和组

1.8.1.1 users 该命令用于显示当前登录的用户。此功能等于who -q命令。

[root@localhost ~]# users

linux multi

[root@localhost ˜]# who -q

multi linux

# users=2

[root@localhost ~]# who

multi pts/1 2009-07-17 11:55 (192.168.1.10)

linux pts/2 2009-07-17 11:58 (192.168.1.10)

[root@localhost ~]#

1.8.1.2 groups 该命令用于显示访问当前shell的用户所属组信息。输出值等于GROUPS环境变量值。只是

GROUPS环境变量具有组号而非组名。

[root@localhost ~]# groups

root bin daemon sys adm disk wheel

Page 79: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.8 系统管理员指令总结 79

1

2

3

4

5

8

6

7

[root@localhost ~]# echo $GROUPS

0

[root@localhost ~]#

[linux@localhost ~]$ groups

linux

[linux@localhost ~]$ echo $GROUPS

501

[linux@localhost ~]$

1.8.1.3 chown、chgrp 简单整理一下前面的内容。chown命令用于修改文件/目录的所有者,chgrp命令用于修改文

件所属组。

[root@localhost ~]# ls -l install.log

-rw-r--r-- 1 root root 32811 2009-05-23 05:08 install.log

[root@localhost ~]# chown linux.linux install.log

[root@localhost ~]# ls -l install.log

-rw-r--r-- 1 linux linux 32811 2009-05-23 05:08 install.log

[root@localhost ~]# chgrp multi install.log

[root@localhost ~]# ls -l install.log

-rw-r--r-- 1 linux multi 32811 2009-05-23 05:08 install.log

[root@localhost ~]#

1.8.1.4 useradd、userdel useradd命令用于添加用户,userdel命令用于删除用户。adduser命令也可用于添加用户,它是

useradd命令的符号链接。通常先添加用户,然后使用passwd[用户名]命令指定密码。

[root@localhost ~]# useradd centos

[root@localhost ~]# passwd centos

Changing password for user centos.

New UNIX password:

Retype new UNIX password:

passwd: all authentication tokens updated successfully.

[root@localhost ~]# cat /etc/passwd|grep ^centos

centos:x:502:502::/home/centos:/bin/bash

[root@localhost ~]# which adduser | xargs ls -l

lrwxrwxrwx 1 root root 7 May 23 04:49 /usr/sbin/adduser -> useradd

[root@localhost ~]# userdel centos

[root@localhost ~]# cat /etc/passwd|grep centos

[root@localhost ~]# ls -al /home/centos

total 32

drwx------ 3 502 502 4096 2009-07-17 12:04 .

drwxr-xr-x 5 root root 4096 2009-07-17 12:04 ..

Page 80: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

80 第 1 章 Linux shell 和基本指令

-rw-r--r-- 1 502 502 33 2009-07-17 12:04 .bash_logout

-rw-r--r-- 1 502 502 176 2009-07-17 12:04 .bash_profile

-rw-r--r-- 1 502 502 124 2009-07-17 12:04 .bashrc

drwxr-xr-x 4 502 502 4096 2009-07-17 12:04 .mozilla

-rw-r--r-- 1 502 502 658 2009-07-17 12:04 .zshrc

[root@localhost ~]#

上面示例先创建centos用户,然后使用userdel命令删除,但centos用户的主目录下仍然存留文

件。也就是说,如果不使用任何选项而直接使用userdel命令,就不能删除该用户目录。使用-r选

项删除用户主目录。使用userdel -r centos命令就能删除centos用户主目录。换言之,删除了创建用

户时默认生成的/home/centos主目录。

[root@localhost ~]# userdel -r centos

[root@localhost ~]# ls -l /home/centos

ls: /home/centos: No such file or directory

[root@localhost ~]#

1.8.1.5 usermod、groupmod usermod命令用于修改用户的各种信息,groupmod命令用于修改组名或组ID。

[root@localhost ~]# usermod -g multi linux

[root@localhost ~]# groups linux

linux : multi

[root@localhost ~]# groupmod -n shellscript multi

[root@localhost ~]# groups linux

linux : shellscript

[root@localhost ~]# groupmod -n multi shellscript

[root@localhost ~]# groups linux

linux : multi

[root@localhost ~]#

在groupmod命令的-n选项后指定新组名,再指定需要修改的当前组名即可完成修改。

1.8.1.6 id id命令用于显示用户ID、组ID、所属组名等。显示Bash shell的UID、EUID、GROUPS环境变

量值。

[root@localhost ~]# id

uid=0(root) gid=0(root)

groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

[root@localhost ~]# echo $UID

0

[root@localhost ~]# echo $EUID

0

[root@localhost ~]# echo $GROUPS

Page 81: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.8 系统管理员指令总结 81

1

2

3

4

5

8

6

7

0

[root@localhost ~]# id multi

uid=500(multi) gid=500(multi) groups=500(multi)

[root@localhost ~]#

1.8.1.7 lid lid命令指list id,用于显示用户所属组。

[root@localhost ~]# lid multi

multi(gid=500)

[root@localhost ~]# lid daemon

bin(gid=1)

daemon(gid=2)

adm(gid=4)

lp(gid=7)

[root@localhost ~]#

1.8.1.8 who who命令用于显示当前登录的用户目录。使用-m选项显示登录当前shell的用户访问信息。使

用whoami命令显示当前使用shell的用户ID。下列示例以root用户身份登录shell,但使用who -m命

令却显示multi, 这是因为先以multi用户身份进行了远程登录,然后使用su-命令进行超级用户访

问,所以当前shell是multi用户在shell创建的子shell。whoami命令只用于显示当前shell登录用户名,

该功能等于id -un命令。

[root@localhost ~]# who

multi pts/1 2009-07-17 11:55 (192.168.1.10)

linux pts/2 2009-07-17 11:58 (192.168.1.10)

[root@localhost ~]# who -m

multi pts/1 2009-07-17 11:55 (192.168.1.10)

[root@localhost ~]# whoami

root

[root@localhost ~]# id -un

root

[root@localhost ~]#

1.8.1.9 w w命令用于显示所有登录当前系统的用户信息。它是who命令的扩展命令,通常与grep命令

和管道相结合,检索当前登录用户的执行命令。

[root@localhost ~]# w

12:13:00 up 26 min, 2 users, load average: 0.00, 0.00, 0.00

USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT

multi pts/1 192.168.1.10 11:55 0.00s 0.32s 0.05s sshd: multi [pr

linux pts/2 192.168.1.10 11:58 12:19 0.05s 0.05s -bash

Page 82: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

82 第 1 章 Linux shell 和基本指令

[root@localhost ~]# w|grep sshd

multi pts/1 192.168.1.10 11:55 0.00s 0.31s 0.05s sshd: multi [pr

[root@localhost ~]#

1.8.1.10 logname 使用logname命令显示当前用户的登录名,可以在/var/run/utmp文件中查到。utmp文件是二进

制数据文件。

[multi@localhost ~]$ logname

multi

[multi@localhost ~]$ whoami

multi

[multi@localhost ~]$ su -

密码:

[root@localhost ~]# logname

multi

[root@localhost ~]# whoami

root

[root@localhost ~]# file /var/run/utmp

/var/run/utmp: data

[root@localhost ~]#

使用su - 命令以超级用户身份登录,然后使用logname命令,shell就显示root,但由于初始登录

名为multi,结果值就显示为multi。whoami命令用于显示使用当前shell的进程用户,所以显示为root。

1.8.1.11 su su(substitute)命令用于临时切换用户,通过实际用户ID和组ID运行shell。若没有用户,则

默认设置为超级用户root。可以从用户密码目录中找到运行的shell,若查询失败就执行/bin/sh。

若用户已设置密码,那么在实际使用者ID非0(超级用户)的前提下,使用su命令询问要切换的

用户密码。

[multi@localhost ~]$ pwd

/home/multi

[multi@localhost ~]$ su

密码:

[root@localhost multi]# pwd

/home/multi

[root@localhost multi]#

不使用选项而直接使用su命令则不修改当前目录,保留之前用户的环境变量。也就是说,结

果并非新登录的shell。

[multi@localhost ~]$ pwd

/home/multi

Page 83: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.8 系统管理员指令总结 83

1

2

3

4

5

8

6

7

[multi@localhost ~]$ su -

密码:

[root@localhost ~]# pwd

/root

[root@localhost ~]#

使用su -命令将shell转为登录shell,适用已切换的超级用户环境变量,再转到root的主目录。

1.8.1.12 sudo 以超级用户或其他用户的身份执行命令。

/etc/sudoers文件中定义了sodu配置内容 。

## Sudoers allows particular users to run various commands as

## the root user, without needing the root password.

下面使用sudo命令读取/root目录的文件目录,此时询问密码,输入自己的密码而并非root密

码。但由于当前multi用户未在/etc/sudoers文件中指定sudo用户,故发生错误。

[multi@localhost ~]$ sudo ls /root

密码:

multi is not in the sudoers file. This incident will be reported.

[multi@localhost ~]$

下面使用vim编辑器打开/etc/sudoers文件,加粗部分表示添加multi用户登录设置并保存。

[root@localhost ~]# vim /etc/sudoers

...

## Allow root to run any commands anywhere

root ALL=(ALL) ALL

multi ALL=(ALL) ALL

...

[root@localhost ~]#

然后以multi用户身份登录,使用sudo命令显示密码询问,此时输入multi用户自己的密码就能

顺利执行sudo命令。使用sudo命令就处于以root用户权限执行ls命令的状态,故显示/root目录的

目录。

[multi@localhost ~]$ sudo ls /root

密码:

anaconda-ks.cfg install.log perm2 sorted_ls.txt

attribute install.log.syslog perm2.txt tarfile.tgz

backup ls.txt rm_error.txt test0.txt

backup2 lsls.txt script.txt test1.txt

dir mc-4.6.1a-35.el5.i386.rpm scsrun.log test2.txt

html0.html perm.txt shelltest.sh

[multi@localhost ~]$

Page 84: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

84 第 1 章 Linux shell 和基本指令

下面使用-u选项将root用户转为普通用户以执行命令。因multi用户默认无法访问root用户的目

录/root目录,下列示例就显示拒绝访问。

[root@localhost ~]# sudo -u multi ls /root

ls: /root: 拒绝访问

[root@localhost ~]#

1.8.1.13 passwd passwd命令用于创建/修改用户密码。

[root@localhost ~]# passwd

Changing password for user root.

New UNIX password:

Retype new UNIX password:

passwd: all authentication tokens updated successfully.

[root@localhost ~]#

1.8.1.14 ac 使用ac命令从/var/log/wtmp文件中查询用户的登录时间,并以小时(hour)为单位显示。

[root@localhost ~]# ac

total 23.38

[root@localhost ~]# ac -d

May 23 total 1.05

Jul 16 total 0.79

Jul 15 total 2.00

Jul 16 total 13.18

Today total 6.37

[root@localhost ~]#

1.8.1.15 last 使用last命令从/var/log/wtmp文件中查询所有用户的 后登录时间并显示。不使用参数就显示

所有用户,使用reboot参数显示重启后的日期和时间。将multi用作参数就显示muliti用户的登录

时间。

[root@localhost ~]# last | head -n 5

multi pts/3 192.168.1.10 Fri Jul 17 12:33 - 12:58 (00:25)

multi pts/3 192.168.1.10 Fri Jul 17 12:31 - 12:31 (00:00)

multi pts/3 192.168.1.10 Fri Jul 17 12:25 - 12:30 (00:04)

linux pts/2 192.168.1.10 Fri Jul 17 11:58 still logged in

multi pts/1 192.168.1.10 Fri Jul 17 11:55 still logged in

[root@localhost ~]# last reboot | head -n 5

reboot system boot 2.6.18-128.el5 Fri Jul 17 11:47 (01:13)

reboot system boot 2.6.18-128.el5 Fri Jul 17 11:27 (00:18)

Page 85: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.8 系统管理员指令总结 85

1

2

3

4

5

8

6

7

reboot system boot 2.6.18-128.el5 Fri Jul 17 00:25 (11:19)

reboot system boot 2.6.18-128.el5 Thu Jul 16 21:48 (13:57)

reboot system boot 2.6.18-128.el5 Thu Jul 16 14:33 (06:53)

[root@localhost ~]#

1.8.1.16 newgrp newgrp命令用于修改/添加自己所属群组,退出当前shell则返回初始化状态。

[root@localhost ~]# id

uid=0(root) gid=0(root)

groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

[root@localhost ~]# newgrp multi

[root@localhost ~]# id

uid=0(root) gid=500(multi)

groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),500(multi)

[root@localhost ~]# groups

multi root bin daemon sys adm disk wheel

[root@localhost ~]# exit

exit

[root@localhost ~]# id

uid=0(root) gid=0(root)

groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

[root@localhost ~]#

1.8.2 终端

1.8.2.1 tty tty命令用于显示当前用户终端。

[root@localhost ~]# w

13:03:40 up 1:17, 2 users, load average: 0.00, 0.00, 0.00

USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT

multi pts/1 192.168.1.10 11:55 0.00s 0.42s 0.06s sshd: multi [pr

linux pts/2 192.168.1.10 11:58 18:40 0.10s 0.10s -bash

[root@localhost ~]# tty

/dev/pts/1

[root@localhost ~]#

1.8.2.2 stty stty命令用于显示或修改终端设置。

[root@localhost ~]# stty

speed 38400 baud; line = 0;

-brkint -imaxbel

[root@localhost ~]# stty -a

Page 86: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

86 第 1 章 Linux shell 和基本指令

speed 38400 baud; rows 24; columns 80; line = 0;

intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;

eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;

werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;

-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts -cdtrdsr

-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff

-iuclc -ixany -imaxbel -iutf8

opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0

isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt

echoctl echoke

[root@localhost ~]#

从上面的结果值中能获得每个键的设置内容。依照下列示例进行操作可以得出,按Ctrl-U快

捷键就能删除之前输入的全部内容,只显示末尾的“hello centos”字符串。再按Enter键,然后按

Ctrl-D快捷键移动至文件的末尾并终止文件。

[root@localhost ~]# cat > filex

linu<Ctrl-W>x<Ctrl-H>foo bar<Ctrl-U>hello centos<ENTER>

<Ctrl-D>

[root@localhost ~]# cat filex

hello centos

[root@localhost ~]# wc -c < filex

13

[root@localhost ~]#

使用wc -c命令显示该文件的字节数(byte count)。

1.8.2.3 setterm setterm命令用于修改终端的配置值。如下使用cursor选项设置为off,就不显示光标;设置为

on则显示光标。

图1-22 setterm -cursor off

图1-23 setterm -cursor on

Page 87: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.8 系统管理员指令总结 87

1

2

3

4

5

8

6

7

1.8.2.4 test test命令用于初始化终端设置及显示终端类型。

[root@localhost ~]# tset -r

Terminal type is xterm.

[root@localhost ~]#

1.8.2.5 setserial setserial命令用于设置和显示序列端口参数。只有root有权执行该命令,可以在系统设置脚本

中查看。

1.8.2.6 getty、agetty 使用getty或agetty命令初始化终端的进程,此时,打开tty端口和提示符以调用登录名和

/bin/login命令。通常由init调用,不能用于用户的shell脚本。

1.8.2.7 mesg mesg命令阻止其他用户访问自己的终端,通常控制自己的终端中是否显示write命令结果。

mesg y:允许写入自己的终端,默认设置。

mesg n:不允许写入自己的终端。

没有选项则显示当前消息接收状态。

[root@localhost ~]# mesg

is y

[root@localhost ~]#

1.8.2.8 wall、write wall命令用于向所有在线用户发送消息。通常在重启或关机前提醒。

图1-24是发送消息的画面,图1-25是在Linux用户的shell中显示消息的画面。

图1-24 wall

图1-25 linux用户画面 - wall

Page 88: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

88 第 1 章 Linux shell 和基本指令

使用write命令指定用户并发送消息。

格 式 write [用户名]

图1-26 write linux

图1-27 Linux用户画面 - write

按Ctrl-C快捷键终止发送。

1.8.3 信息与统计

1.8.3.1 uname uname命令用于显示内核信息等系统信息。

[root@localhost ~]# uname --help

Usage: uname [OPTION]...

Print certain system information. With no OPTION, same as -s.

-a, --all print all information, in the following order,

except omit -p and -i if unknown:

-s, --kernel-name print the kernel name

-n, --nodename print the network node hostname

-r, --kernel-release print the kernel release

-v, --kernel-version print the kernel version

-m, --machine print the machine hardware name

-p, --processor print the processor type or "unknown"

-i, --hardware-platform print the hardware platform or "unknown"

-o, --operating-system print the operating system

--help display this help and exit

--version output version information and exit

Page 89: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.8 系统管理员指令总结 89

1

2

3

4

5

8

6

7

Report bugs to <[email protected]>.

[root@localhost ~]# uname

Linux

[root@localhost ~]# uname -a

Linux localhost 2.6.18-128.1.16.el5 #1 SMP Tue Jun 30 06:10:28 EDT 2009 i686 i686 i386 GNU/Linux

[root@localhost ~]#

1.8.3.2 arch arch命令用于显示系统结构,功能等于uname -m命令。

[root@localhost ~]# arch

i686

[root@localhost ~]# uname -m

i686

[root@localhost ~]#

1.8.3.3 lastlog lastlog命令浏览/var/log/lstlog文件,并显示所有用户的 后登录时间。

[root@localhost ~]# lastlog | head -n 5

Username Port From Latest

root tty2 Sat May 23 14:43:23 +0900 2009

bin **Never logged in**

daemon **Never logged in**

adm **Never logged in**

[root@localhost ~]# lastlog|grep multi

multi pts/3 192.168.1.10 Fri Jul 17 13:18:32 +0900 2009

[root@localhost ~]#

1.8.3.4 lsof lsof命令用于显示已打开的文件目录。使用-i选项显示已打开的网络套接字文件。

[root@localhost ~]# lsof | head -n 5

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

init 1 root cwd DIR 3,1 4096 2 /

init 1 root rtd DIR 3,1 4096 2 /

init 1 root txt REG 3,1 38652 720993 /sbin/init

init 1 root mem REG 3,1 93508 262356 /lib/libselinux.so.1

[root@localhost ~]# lsof -an -i tcp|grep IPv4

portmap 1798 rpc 4u IPv4 4921 TCP *:sunrpc (LISTEN)

rpc.statd 1831 root 7u IPv4 5030 TCP *:netgw (LISTEN)

hpiod 2070 root 0u IPv4 5586 TCP 127.0.0.1:2208 (LISTEN)

python 2075 root 4u IPv4 5604 TCP 127.0.0.1:2207 (LISTEN)

cupsd 2101 root 4u IPv4 5677 TCP 127.0.0.1:ipp (LISTEN)

sendmail 2121 root 4u IPv4 5755 TCP 127.0.0.1:smtp (LISTEN)

[root@localhost ~]#

Page 90: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

90 第 1 章 Linux shell 和基本指令

1.8.3.5 strace strace命令用于跟踪命令执行时调用的系统调用和信号。

[root@localhost ~]# strace df

execve("/bin/df", ["df"], [/* 19 vars */]) = 0

brk(0) = 0x865e000

access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)

open("/etc/ld.so.cache", O_RDONLY) = 3

...中略...

exit_group(0) = ?

[root@localhost ~]#

1.8.3.6 ltrace ltrace命令用于跟踪命令执行时调用的库调用。

[root@localhost ~]# ltrace df

__libc_start_main(0x804a7a0, 1, 0xbfdfe914, 0x804fb80, 0x804fb70 <unfinished ...>

setlocale(6, "") = "en_US.UTF8"

bindtextdomain("coreutils", "/usr/share/locale") = "/usr/share/locale"

...中略...

fclose(0xcb24c0) = 0

+++ exited (status 0) +++

[root@localhost ~]#

1.8.3.7 nc nc命令用于显示TCP/UDP端口连接和监听。将托管名和端口编号用作参数并连接端口,指定

-z选项和端口编号范围就能查到能否进行端口连接,要检索的端口范围使用1-80格式,表示从1

号至80号端口中进行检索。也就是说,使用nc命令可以进行端口扫描。

[root@localhost ~]# nc localhost 25

220 localhost.localdomain ESMTP Sendmail 8.13.8/8.13.8; Fri, 17 Jul 2009 13:53:20 +0900

<Ctrl-C>

[root@localhost ~]# nc -z localhost 1-80

Connection to localhost 22 port [tcp/ssh] succeeded!

Connection to localhost 25 port [tcp/smtp] succeeded!

[root@localhost ~]#

1.8.3.8 free 以字节为单位显示内存和缓存用量。

[root@localhost ~]# free

total used free shared buffers cached

Mem: 255552 219096 36456 0 30924 120132

-/+ buffers/cache: 68040 187512

Swap: 1052248 156 1052092

[root@localhost ~]#

Page 91: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.8 系统管理员指令总结 91

1

2

3

4

5

8

6

7

下面使用awk命令与管道连接,即可显示当前不使用的、空闲的内存。第6章将详细讲解awk

命令。

[root@localhost ~]# free | grep Mem | awk '{ print $4 }'

36500

[root@localhost ~]#

1.8.3.9 procinfo 用于显示/proc文件系统相关信息。

若procinfo命令不存在,安装时就使用yum远程安装命令。

[root@localhost ~]# procinfo

-bash: procinfo: command not found

[root@localhost ~]# yum install procinfo -y

[root@localhost ~]# procinfo

Linux 2.6.18-128.el5 (mockbuild@builder16) (gcc 4.1.2 20080704 ) #1 1CPU [localhost]

Memory: Total Used Free Shared Buffers

Mem: 255556 219972 35584 0 15884

Swap: 1052248 0 1052248

Bootup: Fri Jul 17 11:46:27 2009 Load average: 0.07 0.03 0.00 1/92 3543

user : 0:00:24.64 0.3% page in : 0

nice : 0:00:05.11 0.1% page out: 0

system: 0:02:19.73 1.8% swap in : 0

idle : 2:08:49.71 97.8% swap out: 0

steal : 0:00:00.00 0.0%

uptime: 2:11:41.82 context : 324457

irq 0: 7856567 timer irq 9: 1 acpi, ahci, Intel 82

irq 1: 11 i8042 irq 10: 4 vboxadd

irq 2: 0 cascade [4] irq 11: 20782 ehci_hcd:usb1, eth0

irq 5: 0 ohci_hcd:usb2 irq 12: 124 i8042

irq 6: 4 floppy [2] irq 14: 19341 ide0

irq 8: 1 rtc irq 15: 78341 ide1

[root@localhost ~]#

1.8.3.10 lsdev lsdev命令用于显示已安装的设备目录。

[root@localhost ~]# lsdev

Device DMA IRQ I/O Ports

------------------------------------------------

Page 92: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

92 第 1 章 Linux shell 和基本指令

0000:00:01.1 d000-d00f

0000:00:03.0 d020-d03f

0000:00:04.0 d040-d05f

0000:00:05.0 d100-d1ff d200-d23f

0000:00:0d.0 d240-d247 d250-d257 d260-d26f

82801AA-ICH 9

ACPI 4000-4003 4004-4005 4008-400b 4020-4021

cascade 4 2

dma 0080-008f

dma1 0000-001f

dma2 00c0-00df

eth0 11

floppy 2 6 03f2-03f5 03f7-03f7

fpu 00f0-00ff

i8042 1 12

ide0 14 01f0-01f7 03f6-03f6 d000-d007

ide1 15 0170-0177 0376-0376 d008-d00f

Intel d100-d1ff d200-d23f

keyboard 0060-0060 0064-0064

ohci_hcd:usb2 5

PCI 0cf8-0cff

pcnet32_probe_pci d020-d03f

pic1 0020-0021

pic2 00a0-00a1

rtc 8 0070-0077

timer 0

timer0 0040-0043

timer1 0050-0053

vboxadd 10

vga+ 03c0-03df

[root@localhost ~]#

1.8.3.11 du du命令用于显示磁盘的文件使用情况。以递归方式显示也能指定特定目录。使用-h选项以KB

为单位显示,使用-sh选项显示当前目录下的全部使用容量。

[root@localhost ~]# du -h

4.0K ./.gnome2_private

4.0K ./attribute

8.0K ./.gconfd

4.0K ./dir/testdir

8.0K ./dir

12K ./.mc/cedit

44K ./.mc

16K ./backup2

Page 93: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.8 系统管理员指令总结 93

1

2

3

4

5

8

6

7

4.0K ./perm2

8.0K ./.lftp

8.0K ./.gnome2/accels

12K ./.gnome2

16K ./backup/dest

32K ./backup

16K ./.gconf/apps/gnome-session/options

28K ./.gconf/apps/gnome-session

40K ./.gconf/apps

48K ./.gconf

2.5M .

[root@localhost ~]#

1.8.3.12 df df命令用于显示文件系统的分区使用量。使用-h选项以M(megabyte,兆字节)、G(gigabyte,

十亿字节)为单位显示。

[root@localhost ~]# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/hda1 6.8G 3.2G 3.3G 50% /

tmpfs 125M 0 125M 0% /dev/shm

[root@localhost ~]#

1.8.3.13 dmesg dmesg命令用于显示开机时控制台上显示的信息。

[root@localhost ~]# dmesg | grep hda

ide0: BM-DMA at 0xd000-0xd007, BIOS settings: hda:DMA, hdb:pio

hda: VBOX HARDDISK, ATA DISK drive

hda: max request size: 128KiB

hda: 16777216 sectors (8589 MB) w/256KiB Cache, CHS=16644/16/63, UDMA(33)

hda: cache flushes supported

hda: hda1 hda2

EXT3 FS on hda1, internal journal

Adding 1052248k swap on /dev/hda2. Priority:-1 extents:1 across:1052248k

[root@localhost ~]#

1.8.3.14 stat stat命令用于显示给出的文件的各种信息(块、索引节点等)

[root@localhost ~]# stat install.log

File: `install.log'

Size: 32811 Blocks: 80 IO Block: 4096 regular file

Device: 301h/769d Inode: 1638402 Links: 1

Access: (0644/-rw-r--r--) Uid: ( 501/ linux) Gid: ( 500/ multi)

Page 94: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

94 第 1 章 Linux shell 和基本指令

Access: 2009-07-15 09:59:01.000000000 +0900

Modify: 2009-05-23 05:08:24.000000000 +0900

Change: 2009-07-17 12:03:22.000000000 +0900

[root@localhost ~]# ls -l install.log

-rw-r--r-- 1 linux multi 32811 2009-05-23 05:08 install.log

[root@localhost ~]#

对ls-l命令显示的install.log文件的时间和stat命令显示的时间进行比较,可以看出使用ls-l命令

显示的时间是文件的修改(Modify)时间。Linux系统的文件具有atime(access)、mtime(modify)、

ctime(change)。

将文件作为参数输入后,若文件不存在,则显示如下信息。

[root@localhost ~]# stat nonexist.file

stat: cannot stat `nonexist.file': No such file or directory

[root@localhost ~]#

1.8.3.15 vmstat vmstat命令用于显示虚拟内存的统计结果。

[root@localhost ~]# vmstat

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------

r b swpd free buff cache si so bi bo in cs us sy id wa st

0 0 0 34324 16184 151848 0 0 21 8 1009 41 0 2 98 0 0

[root@localhost ~]#

1.8.3.16 netstat netstat命令用于显示当前网络统计和信息。使用-lptu选项显示当前打开的端口目录。

[root@localhost ~]# netstat -lptu Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 localhost.localdomain:2208 *:* LISTEN 2070/hpiod tcp 0 0 *:netgw *:* LISTEN 1831/rpc.statd tcp 0 0 *:sunrpc *:* LISTEN 1798/portmap tcp 0 0 localhost.localdomain:ipp *:* LISTEN 2101/cupsd tcp 0 0 localhost.localdomain:smtp *:* LISTEN 2121/sendmail: acce tcp 0 0 localhost.localdomain:2207 *:* LISTEN 2075/python tcp 0 0 *:ssh *:* LISTEN 2090/sshd udp 0 0 *:39701 *:* 2235/avahi-daemon: udp 0 0 *:735 *:* 1831/rpc.statd udp 0 0 *:738 *:* 1831/rpc.statd udp 0 0 *:mdns *:* 2235/avahi-daemon: udp 0 0 *:sunrpc *:* 1798/portmap udp 0 0 *:ipp *:* 2101/cupsd udp 0 0 *:49609 *:* 2235/avahi-daemon: udp 0 0 *:mdns *:* 2235/avahi-daemon: [root@localhost ~]#

Page 95: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.8 系统管理员指令总结 95

1

2

3

4

5

8

6

7

1.8.3.17 uptime uptime命令用于显示当前运行的时间、系统不终止或重启的情况下继续运行的时间、当前登

录人数、平均负载等。若平均负载显示大于3,系统性能就会明显下降。

[root@localhost ~]# uptime

14:10:19 up 2:23, 2 users, load average: 0.00, 0.00, 0.00

[root@localhost ~]#

1.8.3.18 hostname hostname命令用于显示系统托管名。HOSTNAME变量值指定在/etc/sysconfig/network文件内,

所以启动时自动设置。

[root@localhost ~]# hostname

localhost.localdomain

[root@localhost ~]# uname -n

localhost.localdomain

[root@localhost ~]# echo $HOSTNAME

localhost.localdomain

[root@localhost ~]# cat /etc/sysconfig/network

NETWORKING=yes

NETWORKING_IPV6=no

HOSTNAME=localhost.localdomain

[root@localhost ~]#

1.8.3.19 hostid 使用hostid命令将托管机器显示为32位16进制数的识别符。

[root@localhost ~]# hostid

007f0100

[root@localhost ~]# cat /etc/hosts

# Do not remove the following line, or various programs

# that require network functionality will fail.

127.0.0.1 localhost.localdomain localhost

::1 localhost6.localdomain6 localhost6

[root@localhost ~]#

1.8.3.20 readelf readelf命令用于显示elf二进制文件的信息。

[root@localhost ~]# readelf -h /bin/bash

ELF Header:

Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00

Class: ELF32

Data: 2's complement, little endian

Version: 1 (current)

Page 96: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

96 第 1 章 Linux shell 和基本指令

OS/ABI: UNIX - System V

ABI Version: 0

Type: EXEC (Executable file)

Machine: Intel 80386

Version: 0x1

Entry point address: 0x805c7c0

Start of program headers: 52 (bytes into file)

Start of section headers: 733764 (bytes into file)

Flags: 0x0

Size of this header: 52 (bytes)

Size of program headers: 32 (bytes)

Number of program headers: 8

Size of section headers: 40 (bytes)

Number of section headers: 31

Section header string table index: 30

[root@localhost ~]#

1.8.3.21 size size命令用于显示二进制执行文件或存档文件的段大小。

[root@localhost ~]# size /bin/bash

text data bss dec hex filename

708096 19380 19452 746928 b65b0 /bin/bash

[root@localhost ~]#

1.8.4 系统日志

1.8.4.1 logger logger命令用于记录系统日志,日志保存在/var/log/messages系统日志记录文件中。

格 式 logger [ -is ] [ -f file ] [ -p pri ] [ -t tag ] [ message... ]

选项

-i:在每行记录logger的进程ID。

-s:与系统日志一起,在标准错误设备内记录信息。

-f file:指定记录文件。

-p pri:指定具有优先权的信息。pri可以是数字格式,或“facility.level”格式。例如:使用

“-p local3.info”选项,依照local3 facility的informational水平记录信息。初始值为“user.notice”。

-t tag:每行记录tag。

message:记录message。若既未指定也未使用-f选项,则通过标准输入写入内容。

Page 97: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.8 系统管理员指令总结 97

1

2

3

4

5

8

6

7

顺利结束logger程序就会返回0,发生错误则返回大于0的数值。

[root@localhost ~]# logger

日志文件测试 #输入左侧字符串后按Enter键,按Ctrl-D快捷键结束。

[root@localhost ~]# tail -n 3 /var/log/messages

Jul 17 13:19:42 localhost yum: net-tools-1.60-78.el5.i386: ts_done state is net-tools-1.60-78.el5.i386 20 should

be erase net-tools

Jul 17 13:58:05 localhost yum: Installed: procinfo-18-19.i386

Jul 17 14:14:36 localhost multi: 日志文件测试 #输入左侧字符串后按Enter键,按Ctrl-D快捷键结束。

[root@localhost ~]#

上述示例中只执行logger命令就能输入内容。此时输入要写入的字符串,再按Ctrl-D快捷键终

止,然后显示/var/log/messages文件,从结果可以看出, 后一行已添加了刚输入的字符串。

另外,在tail命令中使用-n 3选项仅显示 后3行。

1.8.4.2 logrotate logrotate命令用于管理系统日志文件,可使用旋转、压缩、删除、发送邮件等功能。通常使

用cron定期执行logrotate以管理日志。将/etc/logrotate.conf文件用作环境设置文件。

[root@localhost ~]# cat /etc/logrotate.conf

# see "man logrotate" for details

# rotate log files weekly

# 以1周为单位分隔并保管日志。

weekly

# keep 4 weeks worth of backlogs

# 仅保管1周单位的4个日志。

rotate 4

# create new (empty) log files after rotating old ones

# 旋转上一个日志文件,并创建新的日志文件。

create

# uncomment this if you want your log files compressed

# 设置是否压缩日志文件。

#compress

# RPM packages drop log rotation information into this directory

# 指定日志旋转设置文件的位置,并保存至当前文件。

include /etc/logrotate.d

# no packages own wtmp -- we'll rotate them here

# 以1个月为单位旋转时最少容量指定为1M。

# 日志文件大小未超过1M就不旋转。

# 创建日志文件时许可是0644,指定为root用户和utmp组所有。

Page 98: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

98 第 1 章 Linux shell 和基本指令

# 另外,以1个月为单位仅保管并维护1个文件。

/var/log/wtmp {

monthly

minsize 1M

create 0664 root utmp

rotate 1

}

# system-specific logs may be also be configured here.

[root@localhost ~]#

1.8.5 作业控制

1.8.5.1 ps 下面简单介绍一下之前学过的ps命令。ps命令用于显示当前运行进程的统计信息(PID、进

程运行时间、运行用户等)。ps命令具有各种选项,请参考帮助页面进行查看,使用--forest选项

显示树形结构。

[root@localhost ~]# ps -ef|grep sshd

root 2090 1 0 11:47 ? 00:00:00 /usr/sbin/sshd

root 2490 2090 0 11:55 ? 00:00:00 sshd: multi [priv]

multi 2492 2490 0 11:55 ? 00:00:06 sshd: multi@pts/1

root 2562 2090 0 11:58 ? 00:00:00 sshd: linux [priv]

linux 2564 2562 0 11:58 ? 00:00:00 sshd: linux@pts/2

root 3630 3325 0 14:18 pts/1 00:00:00 grep sshd

[root@localhost ~]#

1.8.5.2 pgrep、pkill 该命令使用名称或其他属性检索信号进程。

[root@localhost ~]# pgrep sshd

2090

2490

2492

2562

2564

[root@localhost ~]# ps -ef | grep sshd

root 2090 1 0 11:47 ? 00:00:00 /usr/sbin/sshd

root 2490 2090 0 11:55 ? 00:00:00 sshd: multi [priv]

multi 2492 2490 0 11:55 ? 00:00:06 sshd: multi@pts/1

root 2562 2090 0 11:58 ? 00:00:00 sshd: linux [priv]

linux 2564 2562 0 11:58 ? 00:00:00 sshd: linux@pts/2

root 3635 3325 0 14:18 pts/1 00:00:00 grep sshd

[root@localhost ~]#

Page 99: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.8 系统管理员指令总结 99

1

2

3

4

5

8

6

7

root如何检索正在运行的httpd守护进程的进程ID?

pgrep -u root httpd

进程执行用户如何检索root或守护进程ID?

pgrep -u root, daemon

如何重启syslog守护进程?(如何重新读取环境设置文件?)

pkill -HUP syslogd

1.8.5.3 pstree pstree命令用于显示树形结构的进程目录。-p选项用于显示进程ID,如图1-28所示。

图1-28 pstree -p

1.8.5.4 top top命令用于显示系统的整体状况,每3秒重复闪烁默认值,如图1-29所示。

图1-29 top

Page 100: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

100 第 1 章 Linux shell 和基本指令

1.8.5.5 nice nice命令用于调整优先权调度并执行程序。

如无任何选项,nice就会显示已赋予的当前优先权调度;若添加选项,就会以调整的优先权

调度执行命令。若省略调整数值,则该命令的nice值就变为10。 超级用户可以赋予负的调整数值,

调整范围为20( 高优先权)~19( 低优先权)。

还可以使用renice命令变更正在运行进程的优先权,使用skill、snice命令发送信号或报告进

程情况。

格 式 nice[-n调整数值][-adjustment][--adjustment=调整数值][--help][--version][command [arg...]]

另外,ps命令用于显示进程目录,此时也可使用l(小写字母l)选项显示NI,就是nice值。

[root@localhost ~]# nice telnet

telnet>

如无选项则直接使用nice telnet命令,打开新终端就会发现,执行进程的NI值设置为10。

[root@localhost ~]# ps axl|grep telnet

0 0 3318 3152 26 10 3796 948 - SN+ pts/2 0:00 telnet

0 0 3350 3320 18 0 5016 664 - R+ pts/3 0:00 grep telnet

[root@localhost ~]#

使用-n选项将nice值设置为20后执行命令,可以看出执行时使用顶端的优先权。也就是说,

顶端优先权使其比其他进程获得更多CPU资源分配,可实现快速处理。

[root@localhost ~]# nice -n -20 telnet

telnet>

[root@localhost ~]# ps axl|grep telnet

4 0 3351 3152 0 -20 3796 948 - S<+ pts/2 0:00 telnet

0 0 3357 3320 18 0 5016 668 - R+ pts/3 0:00 grep telnet

[root@localhost ~]#

1.8.5.6 nohup nohup命令用于执行指定为参数的命令,忽略所有“挂断”(Hangup)信号。若标准输出为tty,

则 该 命 令 的 标 准 输 出 和 标 准 错 误 就 添 加 到 “ nohup.out ” 文 件 。 若 无 法 输 入 , 就 添 加 到

“$HOME/nohup.out”文件。若不能执行此项操作就无法执行该命令。

nohup创建“nohup.out”或“$HOME/nohup.out”文件,不向组/其他人赋予访问权限。若已

赋予权限,就不会改变之前的许可权,将显示内容添加(append)至nohup.out文件。

nohup不会将已执行的命令自动传送至后台,因此,执行命令时在其后输入“&”字符,或

直接在后台执行。

Page 101: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.8 系统管理员指令总结 101

1

2

3

4

5

8

6

7

[root@localhost ~]# nohup find / -name sshd &

[1] 4162

[root@localhost ~]# nohup: appending output to 'nohup.out'

[1]+ Done nohup find / -name sshd

[root@localhost ~]# ls -l nohup.out

-rw------- 1 root root 133 2009-07-17 15:46 nohup.out

[root@localhost ~]# cat nohup.out

/etc/rc.d/init.d/sshd

/etc/pam.d/sshd

/usr/sbin/sshd

/usr/share/logwatch/scripts/services/sshd

/var/lock/subsys/sshd

/var/empty/sshd

[root@localhost ~]# nohup find / -name bash &

[1] 4165

[root@localhost ~]# nohup: appending output to `nohup.out'

[1]+ Done nohup find / -name bash

[root@localhost ~]# cat nohup.out

/etc/rc.d/init.d/sshd

/etc/pam.d/sshd

/usr/sbin/sshd

/usr/share/logwatch/scripts/services/sshd

/var/lock/subsys/sshd

/var/empty/sshd

/bin/bash

[root@localhost ~]#

目前Linux系统的Bash shell中,即使执行文件的终端链接断开也会继续执行,这是由于默认

设置了该功能选项。因此,即使在后台执行(&)可执行文件后关闭当前shell,也不会终止文件

执行。

[root@localhost ~]# shopt | grep huponexit

huponexit off

[root@localhost ~]#

Bash shell选项的huponexit退出当前shell时向所有作业发送SIGHUP信号(停止信号),由于该

选项的默认值为off,所以即使退出当前shell,后台运行的进程也不会终止,而是继续执行。因此,

如果不使用nohup命令而直接在后台执行(&)文件,那么即使用户退出系统、跳出shell,也能在

后台继续执行。

1.8.5.7 pidof pidof命令用于检索和显示正在执行的进程ID。

Page 102: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

102 第 1 章 Linux shell 和基本指令

[root@localhost ~]# pidof sshd

4006 4004 2564 2562 2492 2490 2090

[root@localhost ~]#

1.8.5.8 fuser fuser命令用于显示使用文件或套接字的进程(PID/USER等)。

[root@localhost ~]# pidof sshd

4006 4004 2564 2562 2492 2490 2090

[root@localhost ~]# which sshd

/usr/sbin/sshd

[root@localhost ~]# fuser -u /usr/sbin/sshd

/usr/sbin/sshd: 2090e(root) 2490e(root) 2492e(multi) 2562e(root) 2564e(linux) 4004e(root) 4006e(multi)

[root@localhost ~]# fuser -u /dev/null

/dev/null: 369(root) 1744(root) 1746(root) 1798(rpc) 1831(root) 1872(root) 1891(dbus) 1902(root)

1913(root) 1966(root) 1986(root) 2001(root) 2047(root) 2059(root) 2075(root) 2090(root) 2121(root)

2129(smmsp) 2152(root) 2187(xfs) 2208(root) 2235(avahi) 2236(avahi) 2247(haldaemon) 2248(root)

2255(haldaemon) 2259(haldaemon) 2270(root) 2338(root) 2360(root) 2446(root) 2448(root) 2463(root) 2465(root)

2475(gdm) 2490(root) 2492(multi) 2562(root) 2564(linux) 4004(root) 4006(multi)

[root@localhost ~]#

卸载CD驱动等设备时,有时会提示“device is busy”消息,这是其他用户或进程正在使用

CD驱动造成的。此时可以使用fuser -um/dev/[设备名]命令搜寻进程ID,然后使用kill -9 [PID] 命令

强制终止进程,使用umount/dev/[设备名]卸载。

还可以使用fuser命令的 -n选项指定端口,然后进行检索。

[root@localhost ~]# fuser -un tcp 25

25/tcp: 2121(root)

[root@localhost ~]# ps ax | grep 2121 | grep -v grep

2121 ? Ss 0:00 sendmail: accepting connections

[root@localhost ~]#

1.8.5.9 cron corn命令用于超级用户/普通用户的调度,普通用户也可以使用自己的cron调度程序。Linux

系统通常使用crond守护进程进行综合管理,每个用户可利用crontab -e命令使用自己的调度程序。

crond 设 置 文 件 是 指 /etc/crontab 文 件 , 每 个 设 置 的 执 行 文 件 分 别 位 于 /etc/cron.hourly、

/etc/cron.daily、/etc/crod.weekly、/etc/cron.monthly目录,创建需要按每小时、每天、每周、每月

定期执行的shell脚本文件,并存放至每个目录。

[root@localhost ~]# ls -l /etc | grep cron*

-rw-r--r-- 1 root root 298 2007-03-28 14:47 anacrontab

drwx------ 2 root root 4096 2009-05-23 04:52 cron.d

drwxr-xr-x 2 root root 4096 2009-05-23 04:57 cron.daily

-rw-r--r-- 1 root root 0 2009-05-23 04:51 cron.deny

Page 103: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.8 系统管理员指令总结 103

1

2

3

4

5

8

6

7

drwxr-xr-x 2 root root 4096 2007-01-06 22:13 cron.hourly

drwxr-xr-x 2 root root 4096 2009-05-23 04:48 cron.monthly

-rw-r--r-- 1 root root 255 2007-01-06 22:13 crontab

drwxr-xr-x 2 root root 4096 2009-05-23 04:50 cron.weekly

-rw-r--r-- 1 root root 103 2007-03-15 08:53 scrollkeeper.conf

[root@localhost ~]#

1.8.6 进程管理和启动

1.8.6.1 init init进程是所有进程的父进程(PID 1号),启动时决定设置在/etc/inittab文件的运行级别。执

行时指定init命令和运行级别,通过该运行级别切换系统。这也适用于由init命令的符号链接组成

的telinit命令,只有超级用户有权使用init命令(参见图1-30)。

图1-30 pstree -p命令下的init进程编号

运行级别共有7个,0号表示终止系统,1号表示单用户模式,2号表示除网络之外的多用户模

式,3号表示完全多用户模式,4号一般不用,5号表示Xwindow GUI模式,使用6号进入重启模式。

如下显示/etc/inittab文件就能查看运行级别相关说明。

[root@localhost ~]# cat/etc/inittab

#

# inittab This file describes how the INIT process should set up

# the system in a certain run-level.

#

# Author: Miquel van Smoorenburg, <[email protected]>

# Modified for RHS Linux by Marc Ewing and Donnie Barnes

#

# Default runlevel. The runlevels used by RHS are:

# 0 - halt (Do NOT set initdefault to this)

Page 104: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

104 第 1 章 Linux shell 和基本指令

# 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)

#

# 当前默认运行级别为5号,以GUI模式启动。

id:5:initdefault:

# System initialization.

si::sysinit:/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc 0

l1:1:wait:/etc/rc.d/rc 1

l2:2:wait:/etc/rc.d/rc 2

l3:3:wait:/etc/rc.d/rc 3

l4:4:wait:/etc/rc.d/rc 4

l5:5:wait:/etc/rc.d/rc 5

l6:6:wait:/etc/rc.d/rc 6

# Trap CTRL-ALT-DELETE

ca::ctrlaltdel:/sbin/shutdown -t3 -r now

# When our UPS tells us power has failed, assume we have a few minutes

# of power left. Schedule a shutdown for 2 minutes from now.

# This does, of course, assume you have powerd installed and your

# UPS connected and working correctly.

pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

# If power was restored before the shutdown kicked in, cancel it.

pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"

# Run gettys in standard runlevels

1:2345:respawn:/sbin/mingetty tty1

2:2345:respawn:/sbin/mingetty tty2

3:2345:respawn:/sbin/mingetty tty3

4:2345:respawn:/sbin/mingetty tty4

5:2345:respawn:/sbin/mingetty tty5

6:2345:respawn:/sbin/mingetty tty6

# Run xdm in runlevel 5

x:5:respawn:/etc/X11/prefdm -nodaemon

[root@localhost ~]#

Page 105: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.8 系统管理员指令总结 105

1

2

3

4

5

8

6

7

[root@localhost ~]# which init | xargs ls -l

-rwxr-xr-x 1 root root 38652 Jan 21 17:22 /sbin/init

[root@localhost ~]# which telinit | xargs ls -l

lrwxrwxrwx 1 root root 4 May 23 04:50 /sbin/telinit -> init

[root@localhost ~]#

1.8.6.2 runlevel 使用runlevel命令显示过去和当前的运行级别。下列示例显示N 5,表示以Xwindow GUI模式

启动。可使用init 3命令执行用于服务器的多用户模式,从显示内容“5 3”可以看出,由之前运

行级别5转到当前运行级别3。服务器运行时通常选择运行级别3。

[root@localhost ~]# runlevel

N 5

[root@localhost ~]# init 3

[root@localhost ~]# runlevel

5 3

[root@localhost ~]#

1.8.6.3 halt、shutdown、poweroff、reboot halt、shutdown、poweroff(half命令的符号链接)命令用于终止系统,reboot命令用于重启。

通常使用shutdown -h now命令立即终止系统,reboot命令大多用于重启。shutdown -r now命令也

用于重启。

[root@localhost ~]# shutdown --help

shutdown: invalid option -- -

Usage: shutdown [-akrhHPfnc] [-t secs] time [warning message]

-a: use /etc/shutdown.allow

-k: don't really shutdown, only warn.

-r: reboot after shutdown.

-h: halt after shutdown.

-P: halt action is to turn off power.

-H: halt action is to just halt.

-f: do a 'fast' reboot (skip fsck).

-F: Force fsck on reboot.

-n: do not go through "init" but go down real fast.

-c: cancel a running shutdown.

-t secs: delay between warning and kill signal.

** the "time" argument is mandatory! (try "now") **

[root@localhost ~]#

[立即终止]

[root@localhost ~]# shutdown -h now

Page 106: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

106 第 1 章 Linux shell 和基本指令

[重启]

[root@localhost ~]# reboot

1.8.6.4 service service命令用于开启和终止系统服务。Linux系统启动脚本的原路径是/etc/rc.d/init.d,或符号

链接的/etc/init.d。启动时7个运行级别的启动脚本(符号链接文件)以每个运行级别的目录名

(rc?.d)存放至/etc/rc.d目录。

使用yum install vsftpd -y命令在当前系统设置vstfpd(ftp服务器)。

[root@localhost ~]# yum install vsftpd -y

[root@localhost ~]# ls -l /etc/rc.d/

total 112

drwxr-xr-x 2 root root 4096 2009-07-17 17:59 init.d

-rwxr-xr-x 1 root root 2255 2008-11-14 00:48 rc

drwxr-xr-x 2 root root 4096 2009-07-17 17:59 rc0.d

drwxr-xr-x 2 root root 4096 2009-07-17 17:59 rc1.d

drwxr-xr-x 2 root root 4096 2009-07-17 17:59 rc2.d

drwxr-xr-x 2 root root 4096 2009-07-17 17:59 rc3.d

drwxr-xr-x 2 root root 4096 2009-07-17 17:59 rc4.d

drwxr-xr-x 2 root root 4096 2009-07-17 17:59 rc5.d

drwxr-xr-x 2 root root 4096 2009-07-17 17:59 rc6.d

-rwxr-xr-x 1 root root 220 2008-11-14 00:48 rc.local

-rwxr-xr-x 1 root root 27420 2009-03-06 08:54 rc.sysinit

[root@localhost ~]# service vsftpd start

vsftpd启动对vsftpd的vsftpd: [ OK ]

[root@localhost ~]# service vsftpd stop

正在终止vsftpd゚: [ OK ]

[root@localhost ~]#

1.8.7 网络

1.8.7.1 ifconfig ifconfig命令是用于显示和调试网络接口环境的实用工具。eth0表示首个以太网卡,lo表示本

地回环网络(loopback)。

[root@localhost ~]# ifconfig

eth0 Link encap:Ethernet HWaddr 08:00:27:80:A7:E2

inet addr:192.168.1.200 Bcast:192.168.1.255 Mask:255.255.255.0

inet6 addr: fe80::a00:27ff:fe80:a7e2/64 Scope:Link

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:47921 errors:5 dropped:0 overruns:0 frame:0

TX packets:42284 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:16676460 (15.9 MiB) TX bytes:6203801 (5.9 MiB)

Page 107: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.8 系统管理员指令总结 107

1

2

3

4

5

8

6

7

Interrupt:11 Base address:0xd020

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:1153 errors:0 dropped:0 overruns:0 frame:0

TX packets:1153 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:1813610 (1.7 MiB) TX bytes:1813610 (1.7 MiB)

[root@localhost ~]#

使用下列命令终止以太网卡的网络使用:

[root@localhost ~]# ifonfig eth0 down

使用下列命令开启以太网卡的网络使用:

[root@localhost ~]# ifonfig eth0 up

ifup eth0命令用于激活eth0,ifdown eth0命令用于禁用eth0。

需要注意,进行远程访问时,不要使用ifconfig eth0 down命令终止以太网卡的运行。因为在

远程访问时,以太网卡终止运行就表示网络断开而无法继续执行操作。请使用下列/etc/init.d/

network启动脚本重新开始激活/禁用操作。使用network启动脚本更易于重新开始以太网卡的运行。

[root@localhost /]# /etc/init.d/network

使用方法: /etc/init.d/network {start|stop|restart|reload|status}

[root@localhost ~]# /etc/init.d/network restart

正在断开eth0接口: [ OK ]

正在断开loopback接口: [ OK ]

正在激活loopback接口: [ OK ]

正在激活eth0接口: [ OK ]

[root@localhost ~]#

1.8.7.2 iwconfig iwconfig命令用于显示无线网络配置环境,功能类似于ifconfig,但只显示无线设备。

[root@localhost ~]# iwconfig

lo no wireless extensions.

eth0 no wireless extensions.

sit0 no wireless extensions.

[root@localhost ~]#

Page 108: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

108 第 1 章 Linux shell 和基本指令

从上述结果可以看出,此托管具有eth0、lo、sit0等3个接口,当前Linux系统不存在无线设备。

eth0表示以太网卡的接口,lo表示loopback接口,sit0表示IPv6和IPv4的隧道通信协议。IPv6因地

址表示法不同而无法直接与IPv4进行通信,所以使用特殊目的虚拟设备sit0。

1.8.7.3 ip ip命令用于显示和操作路由、设备、路由和隧道策略。

[root@localhost ~]# ip link show

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000

link/ether 08:00:27:80:a7:e2 brd ff:ff:ff:ff:ff:ff

3: sit0: <NOARP> mtu 1480 qdisc noop

link/sit 0.0.0.0 brd 0.0.0.0

[root@localhost ~]# ip route list

192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.200

169.254.0.0/16 dev eth0 scope link

default via 192.168.1.1 dev eth0

[root@localhost ~]#

1.8.7.4 route 使用route命令显示或修改内核路由列表信息。显示内容与之前使用ip route list命令的结果

相同。

[root@localhost ~]# route

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

192.168.1.0 * 255.255.255.0 U 0 0 0 eth0

169.254.0.0 * 255.255.0.0 U 0 0 0 eth0

default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0

[root@localhost ~]#

1.8.7.5 chkconfig chkconfig命令用于检索和更新系统服务的运行级别信息。在/etc/rc?.d目录下启动时,能显示

并管理每个运行级别的系统服务。

[root@localhost ~]# chkconfig --help

chkconfig version 1.3.30.1 - Copyright (C) 1997-2000 Red Hat, Inc.

This may be freely redistributed under the terms of the GNU Public License.

usage: chkconfig --list [name]

chkconfig --add <name>

chkconfig --del <name>

chkconfig [--level <levels>] <name> <on|off|reset|resetpriorities>

[root@localhost ~]# chkconfig --list | grep vsftpd

Page 109: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.8 系统管理员指令总结 109

1

2

3

4

5

8

6

7

vsftpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off

[root@localhost ~]# chkconfig --level 35 vsftpd on

[root@localhost ~]# chkconfig --list | grep vsftpd

vsftpd 0:off 1:off 2:off 3:on 4:off 5:on 6:off

[root@localhost ~]#

上述示例显示了vsftpd服务的每个运行级别环境设置,可以看出,全部默认设置为off。在3

和5运行级别上启动该运行级别时,可以使用--level 35 vsftpd on选项将3和5运行级别值设置为on,

其目的在于激活(on)并使之开始服务。也就是说,将运行级别3的文本多用户模式和5的GUI多

用户模式设置为启动时自动开启vsftpd服务。

1.8.7.6 tcpdump tcpdump命令用于实时显示网络数据包。如无选项则显示所有网络数据包。执行tcpdump tcp

port 21命令显示通过21号端口进行通信的数据包。可以按Crtl-C快捷键终止执行。

[root@localhost ~]# /etc/init.d/vsftpd start

正在启动对vsftpd的vsftpd: [ OK ]

[root@localhost ~]# tcpdump tcp port 21

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

18:28:07.894840 IP 192.168.1.10.4169 > 192.168.1.200.ftp: S 2098434402:2098434402(0) win 65535 <mss

1460,nop,nop,sackOK>

18:28:08.001485 IP 192.168.1.200.ftp > 192.168.1.10.4169: S 3074825676:3074825676(0) ack 2098434403 win 5840 <mss

1460,nop,nop,sackOK>

18:28:07.895458 IP 192.168.1.10.4169 > 192.168.1.200.ftp: . ack 1 win 65535

18:28:07.914397 IP 192.168.1.200.ftp > 192.168.1.10.4169: P 1:21(20) ack 1 win 5840

...中略...

<Ctrl-C>

23 packets captured

23 packets received by filter

0 packets dropped by kernel

[root@localhost ~]#

1.8.8 文件系统

1.8.8.1 mount mount命令用于挂载文件系统。载有文件系统的设备包括硬盘分区、软盘和CDROM、USB

等移动设备、虚拟磁盘等。打开/etc/fstab文件可以看到各种设置内容,启动时自动读取该设置文

件并挂载,其使用目的在于启动后不指定文件系统和设备,直接手动挂载。/etc/mtab文件保存当

前挂载的文件系统和分区信息。

格 式 mount [-fnrvw] [-t 文件系统类型] [-o 选项] 设备名 目录名

Page 110: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

110 第 1 章 Linux shell 和基本指令

挂载CDROM的方法如下。

# mkdir /media/cdrom

# mount -t iso9660 /dev/cdrom /media/cdrom

挂载CD图像文件的方法如下。

# mkdir /media/cdimg

# mount -o loop -t iso9660 -r cd_image.iso /media/cdimg

挂载usb内存(vfat)的方法如下。

[root@localhost ~]# cat /etc/fstab

LABEL=/1 / ext3 defaults 1 1

tmpfs /dev/shm tmpfs defaults 0 0

devpts /dev/pts devpts gid=5,mode=620 0 0

sysfs /sys sysfs defaults 0 0

proc /proc proc defaults 0 0

LABEL=SWAP-sda2 swap swap defaults 0 0

[root@localhost ~]# mkdir /mnt/usb

[root@localhost ~]# mount -t vfat /dev/sdb1 /mnt/usb

[root@localhost ~]# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/sda1 39G 3.8G 34G 11% /

tmpfs 252M 0 252M 0% /dev/shm

/dev/sdb1 972M 78M 894M 9% /mnt/usb

[root@localhost ~]# cat /etc/mtab

/dev/sda1 / ext3 rw 0 0

proc /proc proc rw 0 0

sysfs /sys sysfs rw 0 0

devpts /dev/pts devpts rw,gid=5,mode=620 0 0

tmpfs /dev/shm tmpfs rw 0 0

none /proc/sys/fs/binfmt_misc binfmt_misc rw 0 0

sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw 0 0

/dev/sdb1 /mnt/usb vfat rw 0 0

[root@localhost ~]# mount

/dev/sda1 on / type ext3 (rw)

proc on /proc type proc (rw)

sysfs on /sys type sysfs (rw)

devpts on /dev/pts type devpts (rw,gid=5,mode=620)

tmpfs on /dev/shm type tmpfs (rw)

none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)

sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)

/dev/sdb1 on /mnt/usb type vfat (rw)

[root@localhost ~]#

Page 111: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.8 系统管理员指令总结 111

1

2

3

4

5

8

6

7

1.8.8.2 umount umount命令对挂载的文件系统立即进行卸载。使用eject命令即可在卸载同时从光驱内取出

CD-ROM。

# umount /mnt/usb

# umount /mnt/cdrom

# eject

1.8.8.3 sync sync命令将已更新的所有缓冲数据强制性地立即保存到硬盘驱动。也就是说,同步执行缓冲

和硬盘驱动。

1.8.8.4 losetup losetup命令用于连接循环设备与标准文件或块设备、与循环设备分离、了解循环设备状态等

方面。使用循环设备参数显示该循环设备的状态。

下面创建循环设备文件并格式化ext3文件系统,然后挂载至/mnt/loop目录。先使用/dev/zero

设备创建由0组成的文件,然后使用losetup命令将刚刚创建的文件与/dev/loop0设备连接。通过

mkfs.ext3命令格式化/dev/loop0设备,使用“mount -oloop[设备名][目录名]”格式挂载至/mnt/loop

目录。 后,使用“umount/mnt/loop”命令对已挂载的/dev/loop0设备进行卸载操作。

[root@localhost ~]# mkdir /mnt/loop

[root@localhost ~]# head -c 1000000 < /dev/zero > file

[root@localhost ~]# ls -l file

-rw-r--r-- 1 root root 1000000 2009-07-17 19:39 file

[root@localhost ~]# losetup /dev/loop0 file

[root@localhost ~]# losetup /dev/loop0

/dev/loop0: [0301]:1638439 (file)

[root@localhost ~]# mkfs.ext3 /dev/loop0

mke2fs 1.39 (29-May-2006)

Filesystem label=

OS type: Linux

Block size=1024 (log=0)

Fragment size=1024 (log=0)

128 inodes, 976 blocks

48 blocks (4.92%) reserved for the super user

First data block=1

Maximum filesystem blocks=1048576

1 block group

8192 blocks per group, 8192 fragments per group

128 inodes per group

Writing inode tables: done

Filesystem too small for a journal

Page 112: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

112 第 1 章 Linux shell 和基本指令

Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 24 mounts or

180 days, whichever comes first. Use tune2fs -c or -i to override.

[root@localhost ~]# mount -o loop /dev/loop0 /mnt/loop

[root@localhost ~]# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/hda1 6.8G 3.3G 3.2G 51% /

tmpfs 125M 0 125M 0% /dev/shm

/dev/loop0 955K 17K 890K 2% /mnt/loop

[root@localhost ~]# echo "loop device" > /mnt/loop/loop.txt

[root@localhost ~]# ls -l /mnt/loop/

total 13

-rw-r--r-- 1 root root 12 2009-07-17 19:52 loop.txt

drwx------ 2 root root 12288 2009-07-17 19:43 lost+found

[root@localhost ~]# umount /dev/loop0

[root@localhost ~]# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/hda1 6.8G 3.3G 3.2G 51% /

tmpfs 125M 0 125M 0% /dev/shm

[root@localhost ~]#

1.8.8.5 mkswap、dd mkswap命令用于创建交换文件或交换分区。

[root@localhost ~]# dd if=/dev/zero of=swapfile bs=1024 count=8192

8192+0 records in

8192+0 records out

8388608 bytes (8.4 MB) copied, 0.128979 seconds, 65.0 MB/s

[root@localhost ~]# ls -l swapfile

-rw-r--r-- 1 root root 8388608 2009-07-17 20:51 swapfile

[root@localhost ~]# mkswap swapfile 8192

Setting up swapspace version 1, size = 8384 kB

[root@localhost ~]# sync

[root@localhost ~]# free

total used free shared buffers cached

Mem: 255556 236820 18736 0 4844 164224

-/+ buffers/cache: 67752 187804

Swap: 1052248 156 1052092

[root@localhost ~]# swapon swapfile

[root@localhost ~]# free

total used free shared buffers cached

Mem: 255556 237028 18528 0 4860 164368

-/+ buffers/cache: 67800 187756

Swap: 1060432 156 1060276

[root@localhost ~]#

Page 113: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.8 系统管理员指令总结 113

1

2

3

4

5

8

6

7

上述示例使用dd命令创建内容全部为0、8.4MB大小的文件。使用mkswap命令将该文件转为

交换文件,然后使用sync命令进行同步操作,并使用free命令查看内存状况,显示Swap容量是

1052248 。该状态下使用swapon swapfile命令将容量添加给swap,然后使用free命令查看内存状况,

发现刚刚添加的swapfile容量已增加至整个Swap容量(1060432)。

1.8.8.6 swapon、swapoff swapon命令用于交换文件或分区,swapoff命令用于关闭交换文件或分区。

格 式 swapon[swapoff] [文件名或分区设备]

下列示例中,swapoff命令用于关闭交换swapfile。因此,从free命令的结果可以看出,swap

容量变回原来的1052248。

[root@localhost ~]# swapoff swapfile

[root@localhost ~]# free

total used free shared buffers cached

Mem: 255556 217848 37708 0 5152 153688

-/+ buffers/cache: 59008 196548

Swap: 1052248 156 1052092

[root@localhost ~]#

1.8.8.7 mkfs.ext3 mkfs.ext3命令用于将分区或文件转换为ext3文件系统。使用mkfs命令并将-t选项(type)值指

定为ext3,即可创建文件系统。

mkfs.ext3 [设备名] 格 式

mkfs -t ext3 [设备名]

我们曾在mkswap命令中使用过mkfs.ext3命令。

1.8.8.8 hdparm hdparm命令用于显示硬盘设置情况或调整设置。

[root@localhost ~]# hdparm --help

hdparm - get/set hard disk parameters - version v6.6

Usage: hdparm [options] [device] ..

Options:

-a get/set fs readahead

-A set drive read-lookahead flag (0/1)

-b get/set bus state (0 == off, 1 == on, 2 == tristate)

Page 114: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

114 第 1 章 Linux shell 和基本指令

-B set Advanced Power Management setting (1-255)

-c get/set IDE 32-bit IO setting

-C check IDE power mode status

-d get/set using_dma flag

--direct use O_DIRECT to bypass page cache for timings

-D enable/disable drive defect management

-E set cd-rom drive speed

-f flush buffer cache for device on exit

-g display drive geometry

-h display terse usage information

-i display drive identification

-I detailed/current information directly from drive

--Istdin read identify data from stdin as ASCII hex

--Istdout write identify data to stdout as ASCII hex

-k get/set keep_settings_over_reset flag (0/1)

-K set drive keep_features_over_reset flag (0/1)

-L set drive doorlock (0/1) (removable harddisks only)

-M get/set acoustic management (0-254, 128: quiet, 254: fast) (EXPERIMENTAL)

-m get/set multiple sector count

-n get/set ignore-write-errors flag (0/1)

-p set PIO mode on IDE interface chipset (0,1,2,3,4,...)

-P set drive prefetch count

-q change next setting quietly

-Q get/set DMA tagged-queuing depth (if supported)

-r get/set device readonly flag (DANGEROUS to set)

-R register an IDE interface (DANGEROUS)

-S set standby (spindown) timeout

-t perform device read timings

-T perform cache read timings

-u get/set unmaskirq flag (0/1)

-U un-register an IDE interface (DANGEROUS)

-v defaults; same as -mcudkrag for IDE drives

-V display program version and exit immediately

-w perform device reset (DANGEROUS)

-W set drive write-caching flag (0/1) (DANGEROUS)

-x tristate device for hotswap (0/1) (DANGEROUS)

-X set IDE xfer mode (DANGEROUS)

-y put IDE drive in standby mode

-Y put IDE drive to sleep

-Z disable Seagate auto-powersaving mode

-z re-read partition table

--security-help display help for ATA security commands

[root@localhost ~]# hdparm /dev/hda1

Page 115: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.8 系统管理员指令总结 115

1

2

3

4

5

8

6

7

/dev/hda1:

multcount = 128 (on)

IO_support = 0 (default 16-bit)

unmaskirq = 0 (off)

using_dma = 1 (on)

keepsettings = 0 (off)

readonly = 0 (off)

readahead = 256 (on)

geometry = 16644/16/63, sectors = 14667282, start = 63

[root@localhost ~]#

1.8.8.9 fdisk 使用fdisk命令创建或修改存储设备分区列表。

格 式 fdisk [设备名]

fdisk用于指定、切换、检查硬盘分区列表。能用作设备名的值如下。

/dev/hda:第一个IDE硬盘驱动。

/dev/hdb:第二个IDE硬盘驱动。

/dev/sda:第一个SATA、SCSI硬盘驱动。

/dev/sdb:第二个SATA、SCSI硬盘驱动。

分区值表示设备名称值的分区号。例如,/dev/hda1值表示第一个IDE硬盘的第一个分区。那

么,/dev/sda1就表示SATA硬盘的第一个分区。

仅执行fdisk命令就能显示如下使用方法。

[root@localhost ~]# fdisk

Usage: fdisk [-l] [-b SSZ] [-u] device

E.g.: fdisk /dev/hda (for the first IDE disk)

or: fdisk /dev/sdc (for the third SCSI disk)

or: fdisk /dev/eda (for the first PS/2 ESDI drive)

or: fdisk /dev/rd/c0d0 or: fdisk /dev/ida/c0d0 (for RAID devices)

...

我安装了S-ATA 100MB硬盘以测试fdisk命令,安装完毕后识别为/dev/sda。下面对安装好的

/dev/sda设备分区开始操作。

根据以下方法进行/dev/sda设备的分区操作。出现提示符后输入m即可显示每个命令的说明,

输入p显示当前设置的分区信息。输入l(小写字母l)显示可用的分区类型,如图1-31所示。可以

看出,Linux系统的分区号为83,Linux交换分区号为82。输入n创建分区时,Linux分区自动设置

为83。输入p确认结束,然后输入w保存已设置的分区信息。

Page 116: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

116 第 1 章 Linux shell 和基本指令

[root@localhost ~]# fdisk /dev/sda

Command (m for help): m

Command action

a toggle a bootable flag

b edit bsd disklabel

c toggle the dos compatibility flag

d delete a partition

l list known partition types

m print this menu

n add a new partition

o create a new empty DOS partition table

p print the partition table

q quit without saving changes

s create a new empty Sun disklabel

t change a partition's system id

u change display/entry units

v verify the partition table

w write table to disk and exit

x extra functionality (experts only)

Command (m for help): p

Disk /dev/sda: 104 MB, 104857600 bytes

255 heads, 63 sectors/track, 12 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System

Command (m for help): n

Command action

e extended

p primary partition (1-4)

p

Partition number (1-4): 1

First cylinder (1-12, default 1): 1

Last cylinder or +size or +sizeM or +sizeK (1-12, default 12): 12

Command (m for help): p

Disk /dev/sda: 104 MB, 104857600 bytes

255 heads, 63 sectors/track, 12 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System

/dev/sda1 1 12 96358+ 83 Linux

Page 117: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.8 系统管理员指令总结 117

1

2

3

4

5

8

6

7

图1-31 分区类型

Command (m for help): w

The partition table has been altered!

Calling ioctl() to re-read partition table.

Syncing disks.

[root@localhost ~]#

使用fdisk命令创建/dev/sda硬盘分区,使用mkfs.ext3命令将/dev/sda1分区创建为ext3文件系

统,使用mkdir命令创建/backup目录,然后使用mount命令将.dev/sda1分区挂载到/backup目录,其

内容如图1-32所示。

图1-32 mount -t ext3 /dev/sda1/backup

Page 118: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

118 第 1 章 Linux shell 和基本指令

1.8.8.10 fsck.ext3 fsck.ext3命令用于检测、修理、调试ext3文件系统。但是,对挂载分区进行文件系统检测可

能出现问题。因此,请务必先卸载,然后再执行文件系统检测。

格 式 fsck.ext3 [设备名] 或 fsck -t ext3 [设备名]

下面开始检测刚创建的/dev/sda1分区的文件系统。

[root@localhost ~]# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/hda1 6.8G 3.3G 3.2G 51% /

tmpfs 125M 0 125M 0% /dev/shm

/dev/sda1 92M 5.6M 81M 7% /backup

[root@localhost ~]# umount /backup

[root@localhost ~]# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/hda1 6.8G 3.3G 3.2G 51% /

tmpfs 125M 0 125M 0% /dev/shm

[root@localhost ~]# fsck.ext3 /dev/sda1

e2fsck 1.39 (29-May-2006)

/dev/sda1: clean, 11/24096 files, 8713/96356 blocks

[root@localhost ~]#

检测/dev/sda1分区的ext3文件系统,未发现任何错误,表示正常。

1.8.8.11 badblocks badblocks命令用于检测存储设备的物理坏块。

格 式 badblocks [设备名]

[root@localhost ~]# badblocks /dev/sda1

[root@localhost ~]#

对/dev/sda1分区进行坏块检测,未显示任何信息。也就是说,该分区无坏块,属于正常分区。

1.8.8.12 lsusb 该命令用于显示已安装的USB设备目录。

[root@localhost ~]# lsusb

Bus 001 Device 001: ID 0000:0000

Bus 002 Device 001: ID 0000:0000

[root@localhost ~]#

Page 119: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.8 系统管理员指令总结 119

1

2

3

4

5

8

6

7

1.8.8.13 lspci 该命令用于显示已安装的pci设备目录。

[root@localhost ~]# lspci

00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)

00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]

00:01.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)

00:02.0 VGA compatible controller: InnoTek Systemberatung GmbH VirtualBox Graphics Adapter

00:03.0 Ethernet controller: Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] (rev 40)

00:04.0 System peripheral: InnoTek Systemberatung GmbH VirtualBox Guest Service

00:05.0 Multimedia audio controller: Intel Corporation 82801AA AC'97 Audio Controller (rev 01)

00:06.0 USB Controller: Apple Computer Inc. KeyLargo/Intrepid USB

00:07.0 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 08)

00:0b.0 USB Controller: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB2 EHCI Controller

00:0d.0 SATA controller: Intel Corporation 82801HBM/HEM (ICH8M/ICH8M-E) SATA AHCI Controller (rev 02)

[root@localhost ~]#

1.8.8.14 mKBootdisk 制作独立的(stand-alone)软驱引导(boot floppy)用于系统驱动。使用--iso选项创建可启动

的iso文件,可通过cdrom复制。也可以使用mkisofs命令。

1.8.8.15 mkisofs 使用mkisofs命令可以创建iso9660文件系统,即CD图像。

例如,将/bin目录下文件转为bin.iso文件。

[root@localhost ~]# mkisofs -o bin.iso -J -V backup /bin

[root@localhost ~]# ls -l bin.iso

-rw-r--r-- 1 root root 8087552 2009-07-17 22:21 bin.iso

[root@localhost ~]#

[使用选项] -o:要创建的ISO图像文件名。

-J:Windows兼容Joliet Filesystem,文件名限制为64个字。

-V:创建Volume ID。

已创建bin.iso文件,现在进行挂载。

[root@localhost ~]# mkdir /mnt/cdrom

[root@localhost ~]# mount -o loop -t iso9660 bin.iso /mnt/cdrom/

[root@localhost ~]# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/hda1 6.8G 3.3G 3.2G 51% /

tmpfs 125M 0 125M 0% /dev/shm

/root/bin.iso 7.8M 7.8M 0 100% /mnt/cdrom

[root@localhost ~]# ls /mnt/cdrom

Page 120: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

120 第 1 章 Linux shell 和基本指令

alsacard echo ls setserial

alsaunmute ed mail sleep

...

[root@localhost ~]# umount /mnt/cdrom

[root@localhost ~]# ls /mnt/cdrom

[root@localhost ~]#

1.8.8.16 chroot chroot命令用于修改root目录,使用已指定的root目录执行命令和交互式shell。chroot命令在

安全性方面非常有用。

使用chroot命令复制可使用在指定目录的命令时,必须同时复制该命令的共享库。可以使用

ldd命令查看每个命令的共享库目录。

chroot/aaa/bbb/bin/ls命令表示将/aaa/bbb目录改为root目录后,由root目录执行/aaa/bbb/bin/ls

命令。然后在登录用户的~/.bashrc文件内设置alias XX “chroot /aaa/bbb/bin/ls”别名,那么,用户

执行XX命令时,chroot命令将/aaa/bbb目录改为顶端root(/)目录,然后执行其下的/bin/ls命令。

1.8.8.17 lockfile lockfile命令包含于procmail软件包。使用lockfile命令创建信号量(Semaphore)锁定文件、设

备、资源等,还可以管理文件访问。若锁定文件已存在,那么无权访问其他进程。应用程序通常

在/var/lock目录下创建锁定文件并检测,可使用rm-f [锁定文件名]进行删除。

[root@localhost ~]# rpm -ql procmail | grep lockfile

/usr/bin/lockfile

/usr/share/man/man1/lockfile.1.gz

[root@localhost ~]# ls -l /var/lock

total 32

drwxr-xr-x 2 root root 4096 2009-01-21 20:13 dmraid

drwx------ 2 root root 4096 2007-03-15 02:14 iptraf

-rw-r--r-- 1 root root 0 2009-07-17 21:33 irqbalance

drwx------ 2 root root 4096 2009-05-23 04:52 lvm

drwxr-xr-x 2 root root 4096 2009-07-17 21:33 subsys

[root@localhost ~]#

1.8.8.18 flock 该命令虽然不如lockfile命令有用,但其能够在已指定命令的执行过程中锁定进程,阻止其他

进程的访问和使用。它与lockfile命令不同,不能自动创建锁定文件。

1.8.8.19 mknod mknod命令用于创建FIFO、特殊字符文件(character special file)、特殊块文件等。默认创建

的文件模式为0666。

1.8.8.20 MAKEDEV MAKEDEV命令用于创建设备文件,在/dev目录下只有超级用户有权使用该命令。它比mknod

Page 121: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.8 系统管理员指令总结 121

1

2

3

4

5

8

6

7

命令具有更多选项,是非常有用的高级命令。

1.8.8.21 tmpwatch 该命令用于自动删除从未在指定期限内访问的文件。通常使用cron命令管理临时文件。

[root@localhost ~]# cat /etc/cron.daily/tmpwatch

flags=-umc

/usr/sbin/tmpwatch "$flags" -x /tmp/.X11-unix -x /tmp/.XIM-unix \

-x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix 240 /tmp

/usr/sbin/tmpwatch "$flags" 720 /var/tmp

for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do

if [ -d "$d" ]; then

/usr/sbin/tmpwatch "$flags" -f 720 "$d"

fi

done

[root@localhost ~]#

1.8.9 备份

1.8.9.1 dump、restore dump命令是用于备份文件系统(ext2/ext3)的实用工具,可使用-f选项备份网络文件系统。

dump命令用于读取低级磁盘分区,并创建二进制格式的备份文件。可使用restore命令恢复磁盘、

磁带驱动等各种存储媒体内备份的文件。

1.8.9.2 fdformat 该命令用于软盘的低级格式化。(/dev/fd0*)

格 式 fdformat [-n]设备名

1.8.10 系统资源

1.8.10.1 ulimit 该命令用于设置系统资源使用的上限值(upper limit)。-f选项用于限制文件大小(ulimit -f

1000:1M大小的文件),-c选项用于限制核心转储文件(core dump)的大小(ulimit-c 0),-a选项

用于显示当前系统上限值。

[root@localhost ~]# ulimit -a

core file size (blocks, -c) 0

data seg size (kbytes, -d) unlimited

scheduling priority (-e) 0

file size (blocks, -f) unlimited

pending signals (-i) 4095

max locked memory (kbytes, -l) 32

Page 122: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

122 第 1 章 Linux shell 和基本指令

max memory size (kbytes, -m) unlimited

open files (-n) 1024

pipe size (512 bytes, -p) 8

POSIX message queues (bytes, -q) 819200

real-time priority (-r) 0

stack size (kbytes, -s) 10240

cpu time (seconds, -t) unlimited

max user processes (-u) 4095

virtual memory (kbytes, -v) unlimited

file locks (-x) unlimited

[root@localhost ~]#

1.8.10.2 quota 该命令用于显示用户和组的磁盘使用量的上限值。(quotaon、quotaoff)

1.8.10.3 setquota 使用该命令在命令行中设置用户和组的磁盘限额。

1.8.10.4 umask umask命令用于设置用户的文件创建许可掩码。执行umask 022命令创建的新文件赋予644许

可(666-022=644),新创建的目录赋予755许可(777-022=755)。当然,可以使用chmod命令

更改许可。

1.8.10.5 rdev

rdev [ -rsvh ] [ -o offset ] [ image [ value [ offset ] ] ]

rdev [ -o offset ] [ image [ root_device [ offset ] ] ]

swapdev [ -o offset ] [ image [ swap_device [ offset ] ] ]

ramsize [ -o offset ] [ image [ size [ offset ] ] ]

vidmode [ -o offset ] [ image [ mode [ offset ] ] ]

格 式

rootflags [ -o offset ] [ image [ flags [ offset ] ] ]

单独执行rdev命令可以从/etc/mtab文件中搜寻root文件系统并显示。单独执行swapdev、

ramsize、vidmode、rootflags命令显示各自的使用方法。Linux内核的启动图像内有指定root设备、

视频模式、RAM磁盘大小、交换设备的多个字节。这些字节初始值从内核图像内的504(十进制

数)位移开始。

[root@localhost ~]# rdev

/dev/root /

[root@localhost ~]#

498 Root flags

(500 and 502 Reserved)

Page 123: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.8 系统管理员指令总结 123

1

2

3

4

5

8

6

7

504 RAM 磁盘大小

506 VGA 模式

508 Root 设备

(510 Boot Signature)

可以使用rdev命令修改这些值。

image参数表示Linux内核图像,它通常指以下之一。

/vmlinux

/vmlinux.test

/vmunix

/vmunix.test

/dev/fd0

/dev/fd1

使用rdev或swapdev命令时,能成为root_device或swap_device参数值的设备如下。

/dev/hda[1-8]

/dev/hdb[1-8]

/dev/sda[1-8]

/dev/sdb[1-8]

remsize命令的size参数值等于RAM盘的KB单位的大小。

rootflags命令使用的flag参数值等于挂载root文件系统时赋予的附加信息值。若flags值非0,内

核就将root文件系统挂载为只读模式。

vidmode命令的mode参数值能够指定以下视频模式。

-3 = Prompt

-2 = Extended VGA

-1 = Normal VGA

0 = as if "0" was pressed at the prompt

1 = as if "1" was pressed at the prompt

2 = as if "2" was pressed at the prompt

n = as if "n" was pressed at the prompt

若未指定value参数值,则image值只用于显示当前设置。

选项 -s:用swapdev命令替换rdev命令。

-r:用ramsize命令替换rdev命令。

-R:用rootflags命令替换rdev命令。

-v:用vidmode命令替换rdev命令。

-h:显示帮助并退出。

Page 124: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

124 第 1 章 Linux shell 和基本指令

1.8.11 模块

1.8.11.1 lsmod 该命令用于显示已安装的内核模块目录。也可以使用cat/proc/modules命令。

[root@localhost ~]# lsmod | head -n 10

Module Size Used by

nls_utf8 6209 1

loop 19017 2

vboxvfs 45728 0

autofs4 24261 2

hidp 23105 2

rfcomm 42457 0

l2cap 29505 10 hidp,rfcomm

bluetooth 53797 5 hidp,rfcomm,l2cap

sunrpc 144765 1

[root@localhost ~]#

1.8.11.2 insmod insmod命令用于强制添加内核模块。若情况允许,推荐使用modprobe命令。

1.8.11.3 rmmod 用于强制删除内核模块。

1.8.11.4 modprobe

modprobe [ -v ] [ -V ] [ -C config-file ] [ -n ] [ -i ] [ -q ] [ -o

modulename ] [ modulename ] [ module parameters ... ]

modprobe [ -r ] [ -v ] [ -n ] [ -i ] [ modulename ... ]

modprobe [ -l ] [ -t dirname ] [ wildcard ]

格 式

modprobe [ -c ]

该命令用于载入、删除内核模块,通常指启动脚本中自动调用的模块加载器(loader)。与

insmod命令相比,使用modprobe命令安装模块会更好。启动时自动载入的模块将保存到

/etc/modprode.conf。

[root@localhost ~]# cat /etc/modprobe.conf

alias scsi_hostadapter ata_piix

alias snd-card-0 snd-intel8x0

options snd-card-0 index=0

options snd-intel8x0 index=0

remove snd-intel8x0 { /usr/sbin/alsactl store 0 >/dev/null 2>&1 || : ; }; /sbin/modprobe -r --ignore-

remove snd-intel8x0

alias eth0 pcnet32

[root@localhost ~]#

Page 125: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.8 系统管理员指令总结 125

1

2

3

4

5

8

6

7

1.8.11.5 depmod 用于创建模块依赖关系文件。通常在启动脚本中调用并使用。

1.8.11.6 modinfo 显示可加载的模块信息。

[root@localhost ~]# modinfo cdrom

filename: /lib/modules/2.6.18-128.el5/kernel/drivers/cdrom/cdrom.ko

license: GPL

srcversion: F6B75B512215F7107DD93CF

depends:

vermagic: 2.6.18-128.el5 SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1

parm: debug:bool

parm: autoclose:bool

parm: autoeject:bool

parm: lockdoor:bool

parm: check_media_type:bool

parm: mrw_format_restart:bool

module_sig:

883f3504977493f4f3f897cd3dced2112e47309f4685e07514774d9e1f6246352dd68bf2b920d2e60a084c27

da4190e322f21d4578bf64fecf293bc342

[root@localhost ~]#

1.8.12 其他指令

1.8.12.1 env env命令用于显示环境变量或在其他环境中执行程序。该命令也用于在shell脚本上端指定脚

本语言。可以输入完整路径,通过解析器指定php语言,而输入#!/bin/env php即可在环境变量PATH

指定的路径内自动检索php执行文件。如果是Bash shell就输入#!/bin/env bash。

[root@localhost ~]# env

HOSTNAME=localhost.localdomain

SHELL=/bin/bash

TERM=xterm

HISTSIZE=1000

USER=root

LS_COLORS=no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=

01;05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.btm=00;32:*.bat=00;32:*.sh=00;32:*.csh=00;

32:*.tar=00;31:*.tgz=00;31:*.arj=00;31:*.taz=00;31:*.lzh=00;31:*.zip=00;31:*.z=00;31:*.Z=00;31:*.gz=

00;31:*.bz2=00;31:*.bz=00;31:*.tz=00;31:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;

35:*.xbm= 00;35:*.xpm=00;35:*.png=00;35:*.tif=00;35:

MAIL=/var/spool/mail/root

PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr

/bin:/ root/bin

Page 126: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

126 第 1 章 Linux shell 和基本指令

INPUTRC=/etc/inputrc

PWD=/root

LANG=en_US.UTF-8

SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass

SHLVL=1

HOME=/root

LOGNAME=root

CVS_RSH=ssh

LESSOPEN=|/usr/bin/lesspipe.sh %s

G_BROKEN_FILENAMES=1

_=/bin/env

OLDPWD=/etc/cron.daily

[root@localhost~]#

下列/etc/rc.d/init.d/vsftpd启动脚本的第一行标有“#!/bin/bash”,使用env命令输入#!/bin/env

bash也具有相同的含义。

[root@localhost ~]# cat /etc/rc.d/init.d/vsftpd

#!/bin/bash

#

# vsftpd This shell script takes care of starting and stopping

# standalone vsftpd.

#

# chkconfig: 35 60 50

# description: Vsftpd is a ftp daemon, which is the program \

# that answers incoming ftp service requests.

# processname: vsftpd

# config: /etc/vsftpd/vsftpd.conf

# Source function library.

. /etc/rc.d/init.d/functions

# Source networking configuration.

. /etc/sysconfig/network

# Check that networking is up.

...中略...

[root@localhost ~]#

1.8.12.2 ldd 显示可执行文件的共享库依赖关系。关于共享库请参考gcc编程。

Linux系统的静态(static)库具有.a扩展名,共享(shared)库具有.so扩展名。

[root@localhost ~]# ldd /bin/ls

linux-gate.so.1 => (0x00491000)

Page 127: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.8 系统管理员指令总结 127

1

2

3

4

5

8

6

7

librt.so.1 => /lib/librt.so.1 (0x00d8f000)

libacl.so.1 => /lib/libacl.so.1 (0x00183000)

libselinux.so.1 => /lib/libselinux.so.1 (0x00101000)

libc.so.6 => /lib/libc.so.6 (0x00bec000)

libpthread.so.0 => /lib/libpthread.so.0 (0x00d61000)

/lib/ld-linux.so.2 (0x00bc9000)

libattr.so.1 => /lib/libattr.so.1 (0x0017c000)

libdl.so.2 => /lib/libdl.so.2 (0x00d5b000)

libsepol.so.1 => /lib/libsepol.so.1 (0x0011b000)

[root@localhost ~]#

1.8.12.3 watch 使用watch命令在指定的时间单位内重新执行指定命令,并全屏显示结果值。按Ctrl-C快捷键

退出watch页面。

执行以下命令,每5秒显示1次/var/log/messages文件内容:

[root@localhost ~]# watch -n 5 tail /var/log/messages

执行以下命令,每60秒查看1次邮件:

[root@localhost ~]# watch -n 60 from

如图1-33所示,执行以下命令监控目录内修改的文件:

[root@localhost ~]# watch -d ls -l

图 1-33

1.8.12.4 nm 该命令用于显示已编译而未清除(strip)的目标文件的符号目录。

Page 128: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

128 第 1 章 Linux shell 和基本指令

[root@localhost ~]# mkdir gcc

[root@localhost ~]# cd gcc

[root@localhost gcc]# vim test.c

#include <stdio.h>

int main() {

printf("Hello Linuxer!\n");

return 0;

}

[root@localhost gcc]# gcc test.c

[root@localhost gcc]# ls -l

total 12

-rwxr-xr-x 1 root root 4728 2009-07-17 23:06 a.out

-rw-r--r-- 1 root root 75 2009-07-17 23:06 test.c

[root@localhost gcc]# ./a.out

Hello Linuxer!

[root@localhost gcc]# ./a.out

Hello Linuxer!

[root@localhost gcc]# nm a.out

080494a8 d _DYNAMIC

08049574 d _GLOBAL_OFFSET_TABLE_

08048478 R _IO_stdin_used

w _Jv_RegisterClasses

08049498 d __CTOR_END__

08049494 d __CTOR_LIST__

080494a0 D __DTOR_END__

0804949c d __DTOR_LIST__

08048490 r __FRAME_END__

080494a4 d __JCR_END__

080494a4 d __JCR_LIST__

08049590 A __bss_start

0804958c D __data_start

08048430 t __do_global_ctors_aux

08048300 t __do_global_dtors_aux

0804847c R __dso_handle

08049494 d __fini_array_end

08049494 d __fini_array_start

w __gmon_start__

08048429 T __i686.get_pc_thunk.bx

08049494 d __init_array_end

08049494 d __init_array_start

080483b0 T __libc_csu_fini

080483c0 T __libc_csu_init

U __libc_start_main@@GLIBC_2.0

08049494 d __preinit_array_end

Page 129: Linux shell和基本指令images.china-pub.com/ebook3800001-3805000/3804070/ch01.pdf6 第1 章 Linux shell 和基本指令 shell脚本(shell script )是一个解析器,它将许多Linux系统环境下的指令汇整在一起并程序

1.8 系统管理员指令总结 129

1

2

3

4

5

8

6

7

08049494 d __preinit_array_start

08049590 A _edata

08049598 A _end

08048458 T _fini

08048474 R _fp_hw

0804824c T _init

080482b0 T _start

080482d4 t call_gmon_start

08049594 b completed.5788

0804958c W data_start

08049590 b dtor_idx.5790

08048360 t frame_dummy

08048384 T main

U puts@@GLIBC_2.0

[root@localhost gcc]#

1.8.12.5 strip 该命令用于删除目标文件的调试符号引用并缩小文件,但以后无法进行调试。

[root@localhost gcc]# ls -l

total 12

-rwxr-xr-x 1 root root 4728 2009-07-17 23:06 a.out

-rw-r--r-- 1 root root 75 2009-07-17 23:06 test.c

[root@localhost gcc]# strip a.out

[root@localhost gcc]# ls -l

total 8

-rwxr-xr-x 1 root root 2944 2009-07-17 23:09 a.out

-rw-r--r-- 1 root root 75 2009-07-17 23:06 test.c

[root@localhost gcc]# nm a.out

nm: a.out: no symbols

[root@localhost gcc]#

本章内容到此结束。我们学习了进行shell脚本编程前Linux提供的各种命令和基本知识。从

第2章开始将介绍学习shell脚本编程必备的Linux系统基础知识和shell脚本编程基础语法、正则表

达式、grep、sed、awk、Bash shell编程、vim编辑器等内容。从第2章到第7章将反复介绍常用命

令和重要语法,希望各位逐步加深理解。