摘要:本讲介绍Linux系统中文件管理的概念,包括常用命令格式、文件类型、目录结构、文件系统及其安装。
众所周知,我们上机时是通过用户界面与计算机打交道。用户界面定义了用户与计算机交流的不同方式,常见的有图形界面、命令界面及程序界面。每个人喜欢什么样的用户界面取决于教育背景及经验。Linux提供了几种不同的用户界面,其中,命令界面是Linux系统下最简单、但也是功能最强的用户界面。
我们经常要利用文件来存放信息和数据、创建/删除文件、打开/关闭文件、读/写文件等,用户最常用的操作几乎都与文件相关。
常用命令格式
Linux提供了几百条命令,虽然这些命令的功能不同,但它们的使用方式和规则都是统一的。
Linux命令的一般格式是:
命令名 [选项] [参数1] [参数2]……
◆命令名由小写的英文字母构成,往往是表示相应功能的英文单词或单词的缩写。例如,date表示日期;who表示谁在系统中;cp是copy的缩写,表示拷贝文件等。
◆方括号中的部分表明对命令行来讲不是必须的,即可有可无。例如,可以直接在提示符后面输入命令date,显示当前的日期和时间;也可以在date命令名后面带有选项和参数,如“date -s 15:30:00”,设置系统时间为下午3点30分。
◆选项是对命令的特别定义,以“-”开始,多个选项可用一个“-”连起来,如“ls -l -a”与“ls -la”相同。
◆命令行的参数提供命令运行的信息,或者是命令执行过程中所使用的文件名。通常参数是一些文件名,告诉命令从哪里可以得到输入,以及把输出送到什么地方。
◆如果命令行中没有提供参数,命令将从标准输入文件(即键盘)接受数据,输出结果显示在标准输出文件(即显示器)上,而错误信息则显示在标准错误输出文件(即显示器)上。可使用重定向功能对这些文件进行重定向。
◆命令在正常执行后返回一个0值,表示执行成功;如果命令执行过程中出错,没有完成全部工作,则返回一个非零值(在Shell中可用变量$?查看)。在Shell脚本中,可用命令返回值作为控制逻辑的一部分。
◆Linux操作系统的联机帮助对每个命令的准确语法都做了说明,可以使用命令man来获取相应命令的联机说明,如“man ls”。
文件系统概念
磁盘上的文件系统是层次结构的,由若干目录和其子目录组成,最上层的目录称作根(root)目录,用“/”表示。
1.文件与目录的定义
◆文件系统 是磁盘上有特定格式的一片区域,操作系统通过文件系统可以方便地查寻和访问其中所包含的磁盘块。
◆文件 文件系统中存储数据的一个命名的对象。一个文件可以是空文件(即没有包含用户数据),但是它仍然为操作系统提供了其它信息。
◆目录 目录文件中包含许多文件的目录项,每个目录项包含相应文件的名字和I节点号。在I节点中存放该文件的控制管理信息。目录支持文件系统的层次结构。文件系统中的每个文件都登记在一个(或多个)目录中。
◆子目录 被包含在另一个目录中的目录。包含子目录的目录称作父目录。除了root目录以外,所有的目录都是子目录,并且有它们的父目录。root目录就作为自己的父目录。
◆文件名 用来标识文件的字符串,它保存在一个文件目录项中。
◆路径名 通过斜线字符(/)结合在一起的一个或多个文件名的集合。路径名指定一个文件在分层树型结构(即文件系统)中的位置。
◆当前工作目录 查看文件系统要使用一个参考点目录,它就称作当前工作目录。
用ls命令可以列出当前工作目录中所包含的文件和子目录的名字,这是默认方式。
文件名按照ASCII码顺序列出,以数字开头的文件名列在前面,然后是以大写字母开头的文件名,最后是以小写字母开头的文件名。
2.文件结构
文件是Linux操作系统处理信息的基本单位。所有软件都组织成文件。
(1)文件的成分 无论文件是一个程序、一个文档、一个数据库,或者是一个目录,操作系统都会赋予它如下所示的同样的结构:
◆索引节点 又称I节点,在文件系统结构中,包含有关相应文件的信息的一个记录,这些信息包括文件权限、文件主、文件大小、存放位置、建立日期等。
◆数据 文件的实际内容,它可以是空的,也可以非常大,并且有自己的结构。
(2)命名文件 文件名保存在目录文件中。Linux的文件名几乎可以由ASCⅡ字符的任意组合构成,文件名最长可多达255个字符(某些较老的文件系统类型把文件名长度限制为14个字符)。下面的惯例会使管理文件更加方便。
◆文件名应尽量简单,并且应反映出文件的内容。文件名几乎没有必要超过14个字符。
◆除斜线(/)和空字符(ASCII字符 )以外,文件名可以包含任意的ASCⅡ字符,因为那两个字符被操作系统当作表示路径名的特殊字符来解释。
◆习惯上允许使用下线符“_”和句点“.”来区别文件的类型,使文件名更易读。但是应避免使用以下字符,因为对系统的Shell来说,它们有特殊的含义。这些字符是:“;”、“|”、“<”、“>”、“`”、“″”、“′”、“$”、“!”、“%”、“&”、“*”、“?”、“”、“(”、“)”、“[”、“]”。文件名应避免使用空格、制表符或其它控制字符。
◆同类文件应使用同样的后缀或扩展名。
◆Linux系统区分文件名的大小写,例如,名为letter的文件与名为Letter的文件不是同一个文件。
◆以圆点“.”开头的文件名是隐含文件,默认方式下使用ls命令并不能把它们在屏幕上显示出来。同样,在默认情况下,Shell通配符并不匹配这类文件名。
(3)文件名通配符 为了能一次处理多个文件,Shell提供了几个特别字符,称为文件名通配符(也称作扩展字符)。通过使用通配符可以让Shell查询与特别格式相符的文件名;用作命令参数的文件或目录的缩写;以简短的标记访问长文件名;可以用于任意的命令行。
主要的文件名通配符有:
◆星号(*) 与0个或多个任意的字符相匹配,例如,le*可以代表letter、 lease或le。星号匹配的是当前目录下的所有文件,但以点“.”开头的隐含文件除外。.*只与隐含文件匹配。
◆问号(?) 问号只与一个任意的字符匹配,可以使用多个问号。例如,file?与文件file1、file2匹配,但不与file、file10匹配;而name.??? 与文件name.abc、name.xyz匹配,但不与文件name.ab匹配。
◆方括号([ ]) 与问号相似,只与一个字符匹配。它们的区别在于,问号与任意一个字符匹配,而方括号只与括号中列出的字符之一匹配。例如letter [123]只与文件letter1、letter2或letter3匹配,但不与文件 letter12匹配。可以用短横线代表一个范围内的字符,而不用将它们一一列出。例如,letter[1-3]是letter[123]的简写形式。但是,要注意范围内的字符都按升序排列,即[A-Z]是有效的,而[Z-A]是无效的。方括号中可以列出多个范围,如[A-Za-z]可以和任意大写或小写的字符相匹配。方括号中如果以惊叹号“!”开始,表示不与惊叹号后的字符匹配。
上面介绍的所有符号都可以混和使用,例如,[!A-Z]*.?代表所有不以大写字母开头,但倒数第二个位置是.的文件名。
文件类型
Linux操作系统支持普通文件、目录文件、特别文件及符号链接文件等文件类型。
1.普通文件
普通文件也称作常规文件,包含各种长度的字节串。核心对这些数据没有进行结构化,只是作为有序的字节序列把它提交给应用程序。应用程序自己组织和解释这些数据,通常把它们归并为下述类型之一:
◆文本文件,由ASCII字符构成。例如,信件、报告和称作脚本(Script)的命令文本文件,后者由shell解释执行。
◆数据文件,由来自应用程序的数字型和文本型数据构成。例如,电子表格、数据库,以及字处理文档。
◆可执行的二进制程序,由机器指令和数据构成。例如,上面所说的系统提供的命令。
使用file命令可以确定指定文件的类型。该命令可以将任意多个文件名当做参数,其一般使用格式是:file 文件名 [文件名...]
2.目录
目录是一类特殊的文件,利用它可以构成文件系统的分层树型结构。如同普通文件那样,目录文件也包含数据;但目录文件与普通文件的差别是,核心对这些数据加以结构化,它是由成对的“I节点号/文件名”构成的列表。
◆I节点号是检索I节点表的下标,I节点中存放有文件的状态信息。
◆文件名是给一个文件分配的文本形式的字符串,用来标识该文件。在一个指定的目录中,任何两项都不能有同样的名字。
每个目录的第一项都表示目录本身,并以“.”作为它的文件名。每个目录的第二项的名字是“..”,表示该目录的父目录。
应注意:以“.”开头的文件名表示隐含文件,使用带-a选项的ls命令可以列出它们。
当把文件添加到一个目录中的时候,该目录的大小会增长,以便容纳新文件名。当删除文件时,目录的尺寸并不减少,而是核心对该目录项做上特殊标记,以便下次添加一个文件时重新使用它。ls命令不会列出这些未被使用的项。
3.设备文件
在Linux系统中,所有设备都作为一类特别文件对待,用户像使用普通文件那样对设备进行操作,从而实现设备无关性。但是,设备文件除了存放在文件I节点中的信息外,它们不包含任何数据。系统利用它们来标识各个设备驱动器,核心使用它们与硬件设备通信。
有两类特别设备文件,它们对应不同类型的设备驱动器:
◆字符设备 最常用的设备类型,允许I/O传送任意大小的数据,取决于设备本身的容量。使用这种接口的设备包括终端、打印机及鼠标。
◆块设备 这类设备利用核心缓冲区的自动缓存机制,缓冲区进行I/O传送总是以1KB为单位。使用这种接口的设备包括硬盘、软盘和RAM盘。
设备文件的一个示例是当前正在使用的终端,tty命令可以显示出这个文件名。例如:
$ tty/dev/tty01
通常,设备文件在/dev目录之下。 目录及其操作命令
在Linux系统中,除根目录(root)以外,所有文件和目录都包含在相应的目录文件中。下面介绍Linux系统的目录结构及主要的操作命令。
1.目录结构
Linux文件系统采用带链接的树形目录结构,即只有一个根目录(通常用“/”表示),其中含有下级子目录或文件的信息;子目录中又可含有更下级的子目录或者文件的信息。这样一层一层地延伸下去,构成一棵倒置的树,如图1所示。
图1 Linux树型目录结构
在目录树中,根节点和中间节点(用圆圈表示)都必须是目录,而普通文件和特别文件只能作为“叶子”出现。当然,目录也可以作为叶子。
(1)用户主目录
当注册进入系统时,主目录就是当前工作目录。主目录往往位于/home目录之下,并且与注册名相同,例如,/home/mengqc。通常主目录包含子目录、数据文件,以及用于注册环境的配置文件。
(2)路径名
迄今为止,所看到的文件仅是主目录下的文件。其实,还可以利用路径名访问在层次结构文件系统中任何地方的文件和目录。
为了访问文件,必须告诉系统文件在什么地方,即保存在哪个目录下。路径名描述了文件系统中通向任意文件的路径。有绝对路径和相对路径两种路径名。当为命令指定文件路径名时,需要指定两种路径形式的一种,不管它有多长或有多复杂。
◆绝对路径名
在Linux操作系统中,每一个文件有惟一的绝对路径名,它是沿着层次树、从根目录开始、到达相应文件的所有目录名连接而成,各目录名之间以斜线字符(/)隔开。例如,/home/mengqc/lib/func/file1。
绝对路径名总是以斜线字符(/)开头,它表示根目录。如果要访问的文件在当前工作目录之上,那么,使用绝对路径名往往是最简便的方法。
绝对路径名也称作全路径名,使用pwd命令可以在屏幕上显示出当前工作目录的绝对路径名。例如:
$ pwd/home/mengqc
图2 路径名类型
图2示出路径名的类型。绝对路径名为/home/mengqc/lib/func/file1;相对路径名(当前目录是 /home/mengqc/lib)为func/file1。
◆相对路径名
相对路径名利用相对当前工作目录的路径指定一个文件。
为了访问当前工作目录或其任意子目录中的文件,可以使用相对路径名。例如,如果工作目录是/home/mengqc/lib,为了列出目录/home/mengqc/lib/func中的文件file1,可以使用下述命令:ls -l func/file1
注意,相对路径名不能以斜线字符(/)开头。
为了访问在当前工作目录中和当前工作目录之上的文件,可以在相对路径名中使用特殊目录名“.”和“..”。“.”目录表示本目录自身,而“..”目录代表该目录的父目录。例如,当前工作目录是/home/mengqc/lib,想列出/home/liu目录的内容,可使用命令:ls ../../liu
提醒注意,在每个目录中都有“..”目录文件。在上面示例中,/home/mengqc/lib的父目录是/home/mengqc,后者的父目录是/home。也可以连续使用“../” 形式表示父目录,直至根目录。所以,系统中的每个文件都可以利用相对路径名来命名。
(3) 正确使用路径名
什么情况下使用绝对路径名,什么情况下使用相对路径名,取决于哪种方式涉及到的目录更少。路径短,不仅键盘输入少,而且节省系统搜索路径的时间,提高执行效率。例如,当前的工作目录是/etc/conf/cf.d,如果需要访问系统口令文件/etc/passwd,那么使用绝对路径名是/etc/passwd,使用相对路径名是../../passwd。绝对路径名/etc/passwd涉及的目录有2个,而相对路径名../../passwd涉及的目录却是3个。此时,使用绝对路径名更有效。
但是,如果当前工作目录是/home/mengqc/lib,要访问在func目录之下的file1文件,那么使用绝对路径名是/home/mengqc/lib/func/file1,使用相对路径名是func/file1。绝对路径名/home/mengqc/lib/func/file1涉及的目录有5个,而相对路径名涉及的目录只有2个。此时,使用相对路径名更有效。
如果不清楚当前工作目录与其它目录之间的关系,那么最好使用绝对路径名。
2.链接文件
Linux具有为一个文件起多个名字的功能,称为链接。被链接的文件可以存放在相同的或不同的目录下。如果在同一目录下,二者必须有不同的文件名,而不用在硬盘上为同样的数据重复备份;如果在不同的目录下,那么被链接的文件可以与原文件同名,只要对一个目录下的该文件进行修改,就可以完成对所有目录下同名链接文件的修改。对于某文件的各个链接文件,我们可以给它们指定不同的存取权限,以控制对信息的共享和增强安全性。
文件链接分为硬链接和符号链接两种形式。
(1) 硬链接
建立硬链接时,是在另外的目录或本目录中增加目标文件的一个目录项,这样,一个文件就登记在多个目录中。图3中所示的m2.c文件就在目录mub1和liu中都建立了目录项。
图3 文件链接
创建硬链接后,已经存在的文件的I节点号(inode)会被多个目录文件项使用。一个文件的硬链接数可以在目录的长列表格式的第二列中看到,无额外链接的文件的链接数为1。
ln命令用来创建链接。默认情况下,ln命令创建硬链接。ln命令会增加链接数,rm命令会减少链接数。一个文件除非链接数为0,否则不会物理地从文件系统中被删除。
对硬链接有如下限制:
◆不能对目录文件做硬链接。
◆不能在不同的文件系统之间做硬链接。也就是说,链接文件和被链接文件必须位于同一个文件系统中。
(2)符号链接
符号链接也称软链接,是将一个路径名链接到一个文件。这些文件是一种特别类型的文件。事实上,它只是一个小文本文件(如图3中的abc文件),其中包含它所链接的目标文件的绝对路径名,如图3中虚线箭头所示。被链接文件是实际上包含所有数据的文件。所有读写文件的命令,当它们涉及符号链接文件时,将沿着链接方向前进,找到实际的文件。
和硬链接不同的是,符号链接确实是一个新文件,它具有与目标文件不同的I节点号;而硬链接并没有建立新文件。
符号链接没有硬链接的限制,可以对目录文件做符号链接,也可以在不同文件系统之间做符号链接。
用“ln -s”命令建立符号链接时,最好源文件用绝对路径名,这样可以在任何工作目录下进行符号链接。当源文件用相对路径时,如果当前的工作路径和你要创建的符号链接文件所在路径不同时,就不能进行链接。
请注意,符号链接与源文件或目录之间的区别:
◆删除源文件或目录时,只删除了数据,不会删除链接。一旦以同样文件名创建了源文件,链接将继续指向该文件的新数据。
◆在目录长列表中,符号链接作为一种特殊的文件类型显示出来,其第一个字母是l。
◆符号链接的大小是其链接文件的路径名中的字节数。
◆当用“ls -l”命令列出文件时,可以看到符号链接名后有一个箭头指向源文件或目录,例如:lrwxrwxrwx ... 14 Jun 20 10:20 /etc/motd->/original_file
上面代码中,表示“文件大小”的数字“14”恰好表示源文件名“/original_file”由14个字符构成。
ln命令的一般格式:
ln [选项] 源文件 [目标文件]
链接的对象可以是文件,也可以是目录。如果链接指向目录,用户就可以利用该链接直接进入被链接的目录,而不用给出到达该目录的一长串路径。这样,即使删除这个链接,也不会破坏原来的目录。
选项-s表示建立符号链接,而不是硬链接。
注意,符号链接文件不是一个独立的文件,它的许多属性依赖于原文件,所以给一个符号链接文件设置存取权限是没有意义的。
(3)示例
◆将目录/home/mengqc/mub1下的文件m2.c链接到目录/home/liu下的文件a2.c:
$ cd
/home/mengqc$ ln
mub1/m2.c
/home/liu/a2.c
在执行ln命令之前,目录/home/liu中不存在a2.c文件。执行ln之后,在/home/liu目录中才有a2.c这一项,表明m2.c和a2.c已经链接起来。注意,二者在物理上是同一个文件。利用“ls -l”命令可以看到链接数的变化。
◆在目录/home/liu下建立一个符号链接文件abc,使它指向目录/home/mengqc/mub1:
$ ln -s /home/mengqc/mub1 /home/liu/abc
执行该命令后,/home/mengqc/mub1代表的路径将存放在名为/home/liu/abc的文件中。 3.文件或目录的存取权限
使用文件命令对文件进行操作的前提是拥有相应的权限。下面我们介绍如何控制这些权限。
(1)用户和权限
Linux为每个文件都分配了一个文件所有者,称为文件主,并赋予文件主惟一的注册名。对文件的控制取决于文件主或超级用户(root)。文件或目录的创建者对创建的文件或目录拥有特别使用权。
文件的所有关系是可以改变的,可以将文件或目录的所有权转让给其它用户,但只有文件主或root用户才有权改变文件的所有关系。文件的所有权的标志是用户ID(UID)。
利用chown 命令可以更改某个文件或目录的所有权。例如,超级用户把自己的一个文件myfile拷贝给用户xu。为了让用户xu能够存取这个文件,超级用户(root)应该把这个文件的属主设为xu,否则,用户xu无法存取这个文件,命令如下:
chown xu myfile
如果改变了文件或目录的所有权,原文件主将不再拥有该文件或目录的权限。
系统管理员经常使用chown命令,以便将文件拷贝到另一个用户的目录下以后,让该用户拥有使用该文件的权限。
(2)用户组
在Linux下,每个文件又同时属于一个用户组。当创建一个文件或目录时,系统会赋予它一个用户组关系,用户组的所有成员都可以使用此文件或目录。
文件用户组关系的标志是GID。文件的GID只能由文件主或超级用户(root)来修改。chgrp命令可以改变文件的GID。
(3)用户和权限
Linux系统中的每个文件和目录都有存取许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作。
Linux系统中规定了四种不同类型的用户,即文件主(owner)、同组用户(group)、可以访问系统的其它用户(others)、超级用户(root),具有管理系统的特权。
存取权限规定三种访问文件或目录的方式:读(r)、写(w)、可执行或查找(x)。
当用“ls -l”命令显示文件或目录的详细信息时,最左边的一列为文件的存取权限,其中各位的含义如图4所示。
图4 文件权限表示
◆文件的存取权限
读权限(r)表示只允许指定用户读取相应文件的内容,而禁止对它做任何的更改操作。将所访问的文件的内容作为输入的命令都需要有读的权限。例如cat、more等。
写权限(w)表示允许指定用户打开并修改文件。例如命令vi、cp等。
执行权限(x)表示允许指定用户将该文件作为一个程序执行。
◆目录的存取权限
在ls命令后加上-d选项,可以了解目录文件的使用权限。
读权限(r)表示可以列出存储在该目录下的文件,即读目录内容列表。这一权限允许Shell使用文件扩展名列出相匹配的文件名。
写权限(w)表示允许用户从目录中删除或添加新的文件,通常只有文件主才有写权限。
虽然Linux和Windows NT/2000系统一样是一个多用户的系统,但是它们之间有不少重要的差别。对于很多习惯了Windows系统的管理员来讲,如何保证Linux操作系统安全、可靠将会面临许多新的挑战。本文将重点介绍Linux系统安全的命令。
passwd
1.作用
passwd命令原来修改账户的登陆密码,使用权限是所有用户。
2.格式
passwd [选项] 账户名称
3.主要参数
-l:锁定已经命名的账户名称,只有具备超级用户权限的使用者方可使用。
-u:解开账户锁定状态,只有具备超级用户权限的使用者方可使用。
-x, --maximum=DAYS:最大密码使用时间(天),只有具备超级用户权限的使用者方可使用。
-n, --minimum=DAYS:最小密码使用时间(天),只有具备超级用户权限的使用者方可使用。
-d:删除使用者的密码, 只有具备超级用户权限的使用者方可使用。
-S:检查指定使用者的密码认证种类, 只有具备超级用户权限的使用者方可使用。
4.应用实例
$ passwdChanging password for user cao.Changing password for cao(current) UNIX password:New UNIX password:Retype new UNIX password:passwd: all authentication tokens updated successfully.
从上面可以看到,使用passwd命令需要输入旧的密码,然后再输入两次新密码。
su
1.作用
su的作用是变更为其它使用者的身份,超级用户除外,需要键入该使用者的密码。
2.格式
su [选项]... [-] [USER [ARG]...]
3.主要参数
-f , --fast:不必读启动文件(如 csh.cshrc 等),仅用于csh或tcsh两种Shell。
-l , --login:加了这个参数之后,就好像是重新登陆为该使用者一样,大部分环境变量(例如HOME、SHELL和USER等)都是以该使用者(USER)为主,并且工作目录也会改变。如果没有指定USER,缺省情况是root。
-m, -p ,--preserve-environment:执行su时不改变环境变数。
-c command:变更账号为USER的使用者,并执行指令(command)后再变回原来使用者。
USER:欲变更的使用者账号,ARG传入新的Shell参数。
4.应用实例
变更账号为超级用户,并在执行df命令后还原使用者。
su -c df root
umask
1.作用
umask设置用户文件和目录的文件创建缺省屏蔽值,若将此命令放入profile文件,就可控制该用户后续所建文件的存取许可。它告诉系统在创建文件时不给谁存取许可。使用权限是所有用户。
2.格式
umask [-p] [-S] [mode]
3.参数
-S:确定当前的umask设置。
-p:修改umask 设置。
[mode]:修改数值。
4.说明
传统Unix的umask值是022,这样就可以防止同属于该组的其它用户及别的组的用户修改该用户的文件。既然每个用户都拥有并属于一个自己的私有组,那么这种“组保护模式”就不在需要了。严密的权限设定构成了Linux安全的基础,在权限上犯错误是致命的。需要注意的是,umask命令用来设置进程所创建的文件的读写权限,最保险的值是0077,即关闭创建文件的进程以外的所有进程的读写权限,表示为-rw-------。在~/.bash_profile中,加上一行命令umask 0077可以保证每次启动Shell后, 进程的umask权限都可以被正确设定。
5.应用实例
umask -Su=rwx,g=rx,o=rxumask -p 177umask -Su=rw,g=,o=
上述5行命令,首先显示当前状态,然后把umask值改为177,结果只有文件所有者具有读写文件的权限,其它用户不能访问该文件。这显然是一种非常安全的设置。
chgrp
1.作用
chgrp表示修改一个或多个文件或目录所属的组。使用权限是超级用户。
2.格式
chgrp [选项]... 组 文件...
或
chgrp [选项]... --reference=参考文件 文件...
将每个<文件>的所属组设定为<组>。
3.参数
-c, --changes :像 --verbose,但只在有更改时才显示结果。
--dereference:会影响符号链接所指示的对象,而非符号链接本身。
-h, --no-dereference:会影响符号链接本身,而非符号链接所指示的目的地(当系统支持更改符号链接的所有者,此选项才有效)。
-f, --silent, --quiet:去除大部分的错误信息。
--reference=参考文件:使用<参考文件>的所属组,而非指定的<组>。
-R, --recursive:递归处理所有的文件及子目录。
-v, --verbose:处理任何文件都会显示信息。
4.应用说明
该命令改变指定指定文件所属的用户组。其中group可以是用户组ID,也可以是/etc/group文件中用户组的组名。文件名是以空格分开的要改变属组的文件列表,支持通配符。如果用户不是该文件的属主或超级用户,则不能改变该文件的组。
5.应用实例
改变/opt/local /book/及其子目录下的所有文件的属组为book,命令如下:
$ chgrp - R book /opt/local /book
chmod
1.作用
chmod命令是非常重要的,用于改变文件或目录的访问权限,用户可以用它控制文件或目录的访问权限,使用权限是超级用户。
2.格式
chmod命令有两种用法。一种是包含字母和操作符表达式的字符设定法(相对权限设定);另一种是包含数字的数字设定法(绝对权限设定)。
(1)字符设定法
chmod [who] [+ | - | =] [mode] 文件名
◆操作对象who可以是下述字母中的任一个或它们的组合
u:表示用户,即文件或目录的所有者。
g:表示同组用户,即与文件属主有相同组ID的所有用户。
o:表示其它用户。
a:表示所有用户,它是系统默认值。
◆操作符号
+:添加某个权限。
-:取消某个权限。
=:赋予给定权限,并取消其它所有权限(如果有的话)。
◆设置mode的权限可用下述字母的任意组合
r:可读。
w:可写。
x:可执行。
X:只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x属性。
s:文件执行时把进程的属主或组ID置为该文件的文件属主。方式“u+s”设置文件的用户ID位,“g+s”设置组ID位。
t:保存程序的文本到交换设备上。
u:与文件属主拥有一样的权限。
g:与和文件属主同组的用户拥有一样的权限。
o:与其它用户拥有一样的权限。
文件名:以空格分开的要改变权限的文件列表,支持通配符。
一个命令行中可以给出多个权限方式,其间用逗号隔开。
(2) 数字设定法
数字设定法的一般形式为: chmod [mode] 文件名
数字属性的格式应为3个0到7的八进制数,其顺序是(u)(g)(o)文件名,以空格分开的要改变权限的文件列表,支持通配符。
数字表示的权限的含义如下:0001为所有者的执行权限;0002为所有者的写权限;0004为所有者的读权限;0010为组的执行权限;0020为组的写权限;0040为组的读权限;0100为其他人的执行权限;0200为其他人的写权限;0400为其他人的读权限;1000为粘贴位置位;2000表示假如这个文件是可执行文件,则为组ID为位置位,否则其中文件锁定位置位;4000表示假如这个文件是可执行文件,则为用户ID为位置位。
3.实例
如果一个系统管理员写了一个表格(tem)让所有用户填写,那么必须授权用户对这个文件有读写权限,可以使用命令:#chmod 666 tem
上面代码中,这个666数字是如何计算出来的呢?0002为所有者的写权限,0004为所有者的读权限,0020为组的写权限,0040为组的读权限,0200为其他人的写权限,0400为其他人的读权限,这6个数字相加就是666(注以上数字都是八进制数),结果见图1所示。
图1 用chmod数字方法设定文件权限
从图1可以看出,tem文件的权限是-rw-rw-rw-,即用户对这个文件有读写权限。
如果用字符权限设定使用下面命令:
#chmod a =wx tem chown
1.作用
更改一个或多个文件或目录的属主和属组。使用权限是超级用户。
2.格式
chown [选项] 用户或组 文件
3.主要参数
--dereference:受影响的是符号链接所指示的对象,而非符号链接本身。
-h, --no-dereference:会影响符号链接本身,而非符号链接所指示的目的地(当系统支持更改符号链接的所有者,此选项才有效)。
--from=目前所有者:目前组只当每个文件的所有者和组符合选项所指定的,才会更改所有者和组。其中一个可以省略,这已省略的属性就不需要符合原有的属性。
-f, --silent, --quiet:去除大部分的错误信息。
-R, --recursive:递归处理所有的文件及子目录。
-v, --verbose:处理任何文件都会显示信息。
4.说明
chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或用户ID;组可以是组名或组ID;文件是以空格分开的要改变权限的文件列表,支持通配符。系统管理员经常使用chown命令,在将文件拷贝到另一个用户的目录下以后,让用户拥有使用该文件的权限。
5.应用实例
1.把文件shiyan.c的所有者改为wan
$ chown wan shiyan.c
2.把目录/hi及其下的所有文件和子目录的属主改成wan,属组改成users。
$ chown - R wan.users /hi
chattr
1.作用
修改ext2和ext3文件系统属性(attribute),使用权限超级用户。
2.格式
chattr [-RV] [-+=AacDdijsSu] [-v version] 文件或目录
3.主要参数
-R:递归处理所有的文件及子目录。
-V:详细显示修改内容,并打印输出。
-:失效属性。
+:激活属性。
= :指定属性。
A:Atime,告诉系统不要修改对这个文件的最后访问时间。
S:Sync,一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘。
a:Append Only,系统只允许在这个文件之后追加数据,不允许任何进程覆盖或截断这个文件。如果目录具有这个属性,系统将只允许在这个目录下建立和修改文件,而不允许删除任何文件。
i:Immutable,系统不允许对这个文件进行任何的修改。如果目录具有这个属性,那么任何的进程只能修改目录之下的文件,不允许建立和删除文件。
D:检查压缩文件中的错误。
d:No dump,在进行文件系统备份时,dump程序将忽略这个文件。
C:Compress,系统以透明的方式压缩这个文件。从这个文件读取时,返回的是解压之后的数据;而向这个文件中写入数据时,数据首先被压缩之后才写入磁盘。
s:Secure Delete,让系统在删除这个文件时,使用0填充文件所在的区域。
u:Undelete,当一个应用程序请求删除这个文件,系统会保留其数据块以便以后能够恢复删除这个文件。
4.说明
chattr命令的作用很大,其中一些功能是由Linux内核版本来支持的,如果Linux内核版本低于2.2,那么许多功能不能实现。同样-D检查压缩文件中的错误的功能,需要2.5.19以上内核才能支持。另外,通过chattr命令修改属性能够提高系统的安全性,但是它并不适合所有的目录。chattr命令不能保护/、/dev、/tmp、/var目录。
5.应用实例
1.恢复/root目录,即子目录的所有文件
# chattr -R +u/root
2.用chattr命令防止系统中某个关键文件被修改
在Linux下,有些配置文件(passwd ,fatab)是不允许任何人修改的,为了防止被误删除或修改,可以设定该文件的“不可修改位(immutable)”,命令如下:
# chattr +i /etc/fstab
sudo
1.作用
sudo是一种以限制配置文件中的命令为基础,在有限时间内给用户使用,并且记录到日志中的命令,权限是所有用户。
2.格式
sudo [-bhHpV] [-s <shell>] [-u <用户>] [指令]sudo [-klv]
3.主要参数
-b:在后台执行命令。-h:显示帮助。-H:将HOME环境变量设为新身份的HOME环境变量。-k:结束密码的有效期,即下次将需要输入密码。-l:列出当前用户可以使用的命令。-p:改变询问密码的提示符号。-s <shell>:执行指定的Shell。-u <用户>:以指定的用户为新身份,不使用时默认为root。-v:延长密码有效期5分钟。
4.说明
sudo命令的配置在/etc/sudoers文件中。当用户使用sudo时,需要输入口令以验证使用者身份。随后的一段时间内可以使用定义好的命令,当使用配置文件中没有的命令时,将会有报警的记录。sudo是系统管理员用来允许某些用户以root身份运行部分/全部系统命令的程序。一个明显的用途是增强了站点的安全性,如果需要每天以超级用户的身份做一些日常工作,经常执行一些固定的几个只有超级用户身份才能执行的命令,那么用sudo是非常适合的。
ps
1.作用
ps显示瞬间进程 (process) 的动态,使用权限是所有使用者。
2.格式
ps [options] [--help]
3.主要参数
ps的参数非常多, 此出仅列出几个常用的参数。
-A:列出所有的进程。-l:显示长列表。-m:显示内存信息。-w:显示加宽可以显示较多的信息。-e:显示所有进程。a:显示终端上的所有进程,包括其它用户的进程。-au:显示较详细的信息。-aux:显示所有包含其它使用者的进程。
4.说明
要对进程进行监测和控制,首先要了解当前进程的情况,也就是需要查看当前进程。ps命令就是最基本、也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行、运行的状态、进程是否结束、进程有没有僵尸、哪些进程占用了过多的资源等。图2给出了ps-aux命令详解。大部分信息都可以通过执行该命令得到。最常用的三个参数是u、a、x。下面就结合这三个参数详细说明ps命令的作用:ps aux
图2 ps-aux命令详解
图2第2行代码中,USER表示进程拥有者;PID表示进程标示符;%CPU表示占用的CPU使用率;%MEM占用的物理内存使用率;VSZ表示占用的虚拟内存大小;RSS为进程占用的物理内存值;TTY为终端的次要装置号码。
STAT表示进程的状态,其中D为不可中断的静止(I/O动作);R正在执行中;S静止状态;T暂停执行;Z不存在,但暂时无法消除;W没有足够的内存分页可分配;高优先序的进程;N低优先序的进程;L有内存分页分配并锁在内存体内 (实时系统或 I/O)。START为进程开始时间。TIME为执行的时间。COMMAND是所执行的指令。
4.应用实例
在进行系统维护时,经常会出现内存使用量惊人,而又不知道是哪一个进程占用了大量进程的情况。除了可以使用top命令查看内存使用情况之外,还可以使用下面的命令:
ps aux | sort +5n
who
1.作用
who显示系统中有哪些用户登陆系统,显示的资料包含了使用者ID、使用的登陆终端、上线时间、呆滞时间、CPU占用,以及做了些什么。 使用权限为所有用户。
2.格式
who - [husfV] [user]
3.主要参数
-h:不要显示标题列。-u:不要显示使用者的动作/工作。-s:使用简短的格式来显示。-f:不要显示使用者的上线位置。-V:显示程序版本。
4.说明
该命令主要用于查看当前在线上的用户情况。如果用户想和其它用户建立即时通信,比如使用talk命令,那么首先要确定的就是该用户确实在线上,不然talk进程就无法建立起来。又如,系统管理员希望监视每个登录的用户此时此刻的所作所为,也要使用who命令。who命令应用起来非常简单,可以比较准确地掌握用户的情况,所以使用非常广泛。
动手练习
1.使用Linux命令检测系统入侵者
安装过Mandrake Linux和Red Hat Linux的用户都会知道,Linux系统会内置三种不同级别(标准、高、更高)的防火墙,当进行了Linux服务器的安装和一些基本的设置后,服务器应该说是比较安全的,但是也会有黑客通过各种方法利用系统管理员的疏忽侵入系统。如何快速查找黑客非常重要。一般来说,可以使用命令查询黑客是否入侵,见表1。
表1 查询黑客入侵现象的命令对应表
举例说明,如果黑客嗅探网络,那么它必须使网卡接口处于混杂模式,使用下面命令进行查询:
#ifconfig -aeth0
Link encap:Ethernet
HWaddr 00:00:E8:A0:25:86
inet addr:192.168.1.7
Bcast:192.168.1.255
Mask:255.255.255.0
UP BROADCAST RUNNING PROMISCUOUS
MTU:1500
Metric:1......
从这个命令的输出中,可以看到上面讲到的这些概念。第一行的00:00:E8:A0:25:86是mac地址,第二行的192.168.1.7是IP地址,第四行讲的是接收数据状态,这时正在被黑客嗅探。一般而言,网卡有几种接收数据帧的状态,如Broadcast、Multicast、Promiscuous等。Broadcast是指接收所有类型为广播报文的数据帧;Multicast是指接收特定的组播报文;Promiscuous则是通常说的混杂模式,是指对报文中的目的硬件地址不加任何检查、全部接收的工作模式。
2.限制su命令的滥用
我们知道,超级用户在Linux中有最大的权利,几乎所有黑客都想得到这个目标。Linux可以增加对切换到超级用户的限制。使用PAM(Pluggable Authentication Modules)可以禁止除在wheel组以外的任何人su成root,修改/etc/pam.d/su文件,除去屏蔽标识#。使用/usr/sbin/usermod G10 bjecadm将bjecadm这个账号加入gid为10的组,就是wheel组。命令如下:
/etc/pam.d/su
# 使用密码验证#auth sufficient /lib/security/pam_wheel.so debug# 限制只有wheel组用户才可以切换到root#auth required /lib/security/pam_wheel.so use_uidchmod -G10 bjecadm