-5 档案权限基本观念
每一个Linux档案都具有四种存取权限:可读取(r, Readable)、可写入(w, Writable)、可执行(X, eXecute)和无权限( - )等。管理员必须依据使用者的需求,来授予不同的权限,而且使用者最多可被授予三种的权限。您可以利用「ls -l 」的指令来检视该档案或目錄的使用权限,它是以显示资料的第一个栏位为準。在第一个栏位中是由10个字元所组成,以下是一个此栏位的范例:
在以上的范例中,第一位字元与存取权限无关,它是表示此档案的形态:「-」表示档案,「d」表示目录,而「l」表示连结档案。 而其他的9 个字元共分为三组的存取权限组合:
◆ 字元2、3、4表示此档案拥有者的存取权限,有时我们也简称此权限为u (User)的权限。
◆ 字元5、6、7表示此档案拥有者所属群组成员的存取权限,例如此档案拥有者属於 admin j群组’而此群组中有10个成员,则表示这10个成员都拥有此处指定的权限,有时我们也简称此权限为g (Group)的权限。
字元8、9、10表示此档案拥有者所属群组之外的使用者存取权限,行时我们也简称此权限为o (Other)的权限。
注意:
这9 个字元的权限总和有时我们也简称为 a (All)的权限。
有了以上的基本观念后,接下来我们继续讨论有关每个字元的代表意义,这9个字元依据权限种类的不同,也分为三种类型:
◆ 字元2、5、8表示「读取」的权限,若是要授予读取的权限,则可在这三个字元中输入「r」值,若是不允许读取则输入「-」。
◆ 字元3、6、9表示「写入」的权限,若是要授予写入的权限,则可在这三个字元中输入「w」值,若是不允许写入则输入「-」。
◆ 字元4、7、10表示「执行」的权限,若是要授予执行的权限,则可在这三个字元中输入「x」值,若是不允许执行则输入「-」。
以上的說明希望读者务必研究清楚,否则接下来的內容可能会令您感到很困感。我们可以稍为整理一下以上的內容,因为这9个字元分別指定三组不同人员的存取权限(字元2、3、4属於拥有者,字元5、6、7属於群组,字元8、9、lO属於其他人员),而且这9个字元也分成
三种不同的存取类型(字元2、5、8属於读取权限,字元3、6、9属於写入权限,字元4、7、10属於执行权限)。因此,综合这些观念,这9个字元个別的意义如下表所示:
截王目前为止,读者应该可以完全了解档案存取权限的意义,以及运用的方法,现在再重新解读以上范例(-rwxr-xr-x)的代表权限,您应该可以清楚了解以下的意义:
◆ 这是一个档案
◆ 拥有者被授予读取,写入和执行的存取权限
◆ 群组被授予读取和执行的存取权限
◆ 其他人员被授予读取和执行的存取权限
如果要检视目前使用者的使用者ID (uid)和所属群组ID (gid),则需使用「id 」指令:
[jack@nsl jack] $ id
uid=500(jack) gid=500(jack) groups=500(jack)
▓ 档案权限修改- chmod
在档案建立时系统会自动设定存取权限,但若是这些预设权限无法适合企业环境的需求,此时可以利用「chmod」(Change Mode)指令来修改存取权限。
通常在权限修改时,允许使用二种方式来表示权限类型:数字表示法和文字表示法,这二种表示法各有其优鲇,您可以依习惯来选择。
◎ 以数字表示法修改存取权限
所谓数字表示法是指将读取(r),写入 (w) 和执行(x) 分別以4、2、l来代表,沒有授予的部份就表示值为0,然后再把所授予的权限相加而成,以下是几个示范的例子:
以数字表示法来表示权限虽然比较简单,但是可读性较差,您必须经过简单的換算才可了解原始的权限,下表是以数字表示法可能出现的数字及权限对应,提供读者参考:
了解这种表示法后,就可以开始利用chmod指令来变更权限。本书以/testl/filel.txt档案为例,如果希望拥有者和群组成员都被授予读取和写入的权限,而其他人只能读取该档案,则我们知道我们应该将权限设为「rw-rw-r--」而此权限的数字表示法为664,因此您可以输入以下的指令来设定权限並在设定后检查是否正确:
[root@nsl root]#chmod 664 /test1/file1
[root@nsl root]#ls -l /test1/file1
-rw-rw-r-- 2root root 180 11月 3 10:53 /test1/file1
◎ 以文字表示法修改存取权限
权限的另一种表示法是文字表示法,它不是利用数字来表示,所以看起来较复杂,但因为可读性较佳,所以许多人也习惯利用此法来进行权限的设定。使用权限的文字表示法时,系统使用以下4 种字母来表示不同的使用者:
● 拥有者 - u (User)
● 群组–g (Group)
● 其他人员 –o (Other)
● 所有人- a (All)
而权限仍然使用3种的分类法
● 读取- r (Read)
● 写入- w (Write)
● 执行- x (eXecute)
和数字表示法不同的是,文字表示法在设定权限时不仅可以重新指定(用数字表示法的作法相同),也可以由原来的权限来增加或減少权限,它是利用以下三个运算子来执行:
本书使用以下的范例来說明,假设/testl/filel.txt目前的权限如下所示:
[root@nsl root]#ls -l /test1/file1
-rw-r--r-- 2root root 180 11月 3 10:53 /test1/file1
若希望将此权限修改为以下的权限:
-rwxrw---- 2root root 180 11月 3 10:53 /test1/file1
由以上的范例要求,我们可以了解权限的变动如下:
● 拥有者(u)的权限由「rw-」变为「rwx」:增加了执行 (x) 的权限。
● 群组(g) 的权限由「g」变为「rw-」增加了写入(w) 的权限。
● 其他人员 (o) 的权限由「r- -」变为「- - -」:減少了读取(r)的权限。
所以你可以输入以下的指令:
[root@nsl root]# chmod u+x, g+w, o-r/test1/file1.txt 或
[root@nsl root]# chmod u=rwx, g=rw /test1/file1.txt
注意:逗点 (,) 前后不可接空白,否则无法执行指令。
以上就是利用数字和文字表示法来修改档案权限的作法,您可以依照个人的操作习惯来选择最适合的方式,笔者建议最好是能熟悉某种表示法,以避免因同时使用二种表示法而造成的混淆。
▓ 目錄权限修改
虽然Linux目錄也是属於档案的一种,而且目錄的权限、观念,以及设定大多与档案相同,但是其代表的意义卻大不相同。例如在目錄的层级並沒有所谓的「执行」操作,但是目錄仍沿用档案所使用的四种权限名称:可读取(r,Readable),可写入(w,Writable)、可执行(x,
eXecute) 和无权限(- )。在目錄中使用的四种权限代表意义如下:
● 可读取 (r):列出目錄中的內容,与ls的功能相似。
● 可写入 (w):可在目錄中新增、刪除和修改档案。
● 可执行 (x):可以使用cd指令来切換至此目錄
● 无权限 (-):沒有任何此目錄的存取权限
要修改目錄的权限和修改档案权限相同,都是使用「chmod」指令,但是不同的地方是,需使用万用字元 (*) 来表示目錄中的所有档案。例如要同时将/testl目錄中的所有档案存取权限,设定为所有人都可读取及写入,则应该使用以下的指令:
[root@nsl root]# chmod 666 /test1/*或
[root@nsl root]# chmod u=rw,g=rw,o=rw /test1/*
如果目錄中简包含其他的子目錄,则必须使用「-R 」(Recursive)参数来同时设定所有档案及子目錄的权限,若是如此,以上的范例应改为以下的指令输入:
[root@nsl root]# chmod -R 666 /test1/*或
[root@nsl root]# chmod -R u=rw,g=rw,o=rw /test1/*
▓ 变更档案与目錄拥有者- chown
通常档案或目錄的拥有者就是此档案或目錄的建立者,若需要变更档案或目錄拥有者,首先需确定是否具有root等级的权限,也就是說此项权限只授予同在一个管理员群组中的成员。
假设您要将/testl/filel.txt复制到使用者jack的主目錄 一/home/Jack,在复制之后您会发现此档案的拥有者仍然是您(root)。
[root@nsl root]# cp/test1/file1.txt/home/jack/file1
[root@nsl root]# ls -l/home/jack/file1.txt
-rw-r--r-- 1 root root 58923 11月 3 10:53/home/jack/file1
此时可以使用chown(Change Owner)指令来将filel.txt的拥有权授予jack:
[root@nsl root]# Chown jack/home/jack/file1.txt
[root@nsl root]# ls -l/home/jack/file1.txt
-rw-r--r-- 1 jack root 58923 11月 3 12:53/home/jack/file1.txt
由以上的范例中可以发现,filel.txt档案的拥有者已经成功的变更为iack,但是授予存取权限的群组仍然是先前的群组(root),所以我们可以利用chown的指令来同时变更拥有存取权限的使用者和群组。假设我们要将filel.txt的存取权限授予使用者jack和群组users,则可使
用以下的指令:
[root@nsl root]# Chown jack:users/home/jack/file1
[root@nsl root]# ls -l/home/jack/file1.txt
-rw-r--r-- 1 jack users 58923 11月 3 14:29/home/jack/file1
如果只需要变更拥有存取权限的群组,您也可以利用「chgrp」(Change Group)指令,它的使用语法与chown类似:
#chgrp 群组名称 档案或目录名称
▓ 指定档案的预设权限遮罩一umask
所谓权限遮罩是由4个8进位的数字所组成,如果将现有的权限減掉权限遮罩后,即可產生建立档案时预设的权限。一般而言,新建档案的预设值是0666,新建目錄的预设值是0777,如果将权限遮罩设为0002,则每个新增的档案预设权限即为0666 – 0002 = 0664,而目錄的预设权限则为0777 – 0002 = 0775。
您可以直接输入「umask」指令来检查目前的预设权限遮罩,或是输入「umask权限遮罩」的格式预设权限遮罩。
[root@nsl root]# umask
0022 →预设权限遮罩
root@nsl root]# umask 0002 →指定预设权限遮罩
[root@nsl root]# umask
0002
利用umask的方式来指定预设权限遮罩,可以避免新增存取权限过大的档案或目錄,但是決定预设权限遮罩前需考量整体的安全性等级,以符合企业的实际需求。
1-6 I/O 重新导向及管線
I/O 重新导(Redirection)向以及管線是Linux系统中特有的观念,所谓I/O重导是指将指令执行的结果重新导出到其他设备或档案(它是以 「>」 或 「>>」 来表示),或是重新导入到其他设备或档案(它是以「<」来表示),而管線是指将某个指令的输出结果传送到另一个指令来当成输入,它的代表符号是「|」。
▓ I/O 重新导向
通常Linux中的标准输入及输出(I/O)共有三种形态:
● 标准输入 (Standard input,stdin)
● 标准输出 (Standard output,stdout)
● 标准错误输出(Standard Error,stderr)
在一般情形下,标準输入(stdin)是指由键盘将资料输入,但是Linux也接受由档案为输入的来源,例如在「cat ./file.txt」指令中,file.txt就是标準输入。
标準输出(stdout)通常是指将指令结果输出到终端机或萤幕,例如「cat ./file.txt」的指令结果就是标準输出。
而标準错误输出(stderr)是指执行指令发生错误时,输出到萤幕的讯息,例如在以上的范例中,如果file.txt並不存在,则系统出现的「cat :/file.txt :沒有此一档案或目錄」讯息就是标準错误输出。虽然标準输出和标準错误输出都是将讯息显示到萤幕,但是它们在意义上並不相同,其中最大的原因就是重新导向的方式不同。
◎ 输出导向 (>)
一般我们在Linux执行任何指令或程式,预设都是将结果输出到萤幕,但是有时我们会希望将结果储存到一个档案中,以方便资料的收集,此时便可使用输出导向的功能。例如希
望将 /etc目錄下的档案资料结果储存到/testl/etc.txt档案中,则可使用以下的指令:
[root@nsl root]# ls -al /etc > /test1/etc.txt
在执行上述指令后,系统並不会出现任何资料,因为所有原来会出现的输出內容都已重新导向到/testl/etc.txt档案中,同时也不需预先建立/test1/etc.txt档案中,因为若是此档案不存在,则在重新导向时,系统会自动產生指令中指定的档案。
利用我们先前介绍过的「cat」指令,然后再配合重新导向的使用,就可以成为一个简单的文字编辑器。您可以试著输入以下的指令:
[root@nsl root]#cat > /test1/editor.txt
I Love Linux !! →按Enter键
→按Ctrl+C就可结束档案的编辑
在输入之后,因为並末提供cat指令任何参数,所以游标会停留在下一行的开头等待输入,此时便可输入希望记錄的內容,然后在输入完毕后先按口逊钮(否则最后一行不会储存),再按Ctrl+C就可结束档案的编辑,系统並会将此內容以editor.txt档名加以储存。
◎ 附加输出导向(>>)
相信大家对於以上介绍的重新导向至此应该有基本的认识,但是此处会出现一个问题一若是重新导向的档案原来已存在,那我们在输入新的资料后会產生什麼结果?答案是所有旧的资料都会消失,而以新的內容取代。 想必这是许多人所不愿意乐见的,因为旧有的资料常常包含许多有价值的內容,所以在硬碟空间足夠的条件下,最好能保存先前的资料。
为了解決这个问题,Linux提供了「附加输出导向」的功能,它的用法及功能与输出导向很类似,唯一不同的是,新输入的资料会附加(Append)在原有內容之后,同时它的表示符号为「>>」。 以下我们利用一个范例来說明使用输出导向和附加输出导向对原始档案所產生的影响,我们假设原有的档案/testl/origin.txt中只有一行文字This is the original words inthe file!
◎ 输入导向(<)
输出导向的观念和输入导向刚好相反,前者是将指令或程式的执行结果透过萤幕或档案来输出,但是后者卻是将键盘或档案提供给指令来执行,有时这个观念常会令人困惑,我们先来看以下的范例:
[root@nsl root]# cat file1
The content of file1 !
[root@nsl test1]# cat < file1
The content of file1 !
在上述的范例中,二者的输出结果完全相同,但是在执行的程序上卻完全不同。 在「cat filel 」指令中,cat的标準输入档案为filel,因此cat在收到输入档案后,会执行它的功能而将filel的內容显示到萤幕。但是在「cat < filel 」指令中,cat並沒有任何的标準输入档案,而是利用「输入重导(<)」的功能来将filel传给cat当成标準输入档案,最后才将filel的內容显示到萤幕。
由以上的二个范例我们会感觉似乎输入重导並沒有太大的功能! 的确,在可以接受参数的指令上,输入重导並沒有很大的用处,但是在无法接受参数的指令上就相当有用,例如「patch」。
[root@nsl test1]# patch patch-2.4.8-2
[root@nsl test1]# patch < patch-2.4.8-2
因为patch指令並无法接受参数,所以在上述的第一行指令输入后,patch指令会将patch-2.4.8-2视为参数,但因为它无法接受参数,所以画面不会有任何的反应,但若是利用输入重导 (< ) 来将patch-2.4.8-2档案输入给patch,则系统就会开始执行原始码更新的动作。
▓ 附加输入导向 (<<字串)
附加输入导向可以让您自行定义一个字串,例如quit,系统在收到此字串前,会持续的将资料输入档案,这个功能经常使用在电子邮件系统中。以下是一个传送电子邮件的范例,假设我们定义的字串是「Finish」您可以继续输入邮件內容,当输入「Finish」字串后,系统便会结束邮件的编辑並且寄出。
[root@nsl root]# mail jacklee1024@sinamail.com <
>The mail is from jack!
>Finish →结束邮件的编辑并寄出
◎ 错误输出导向(& >)
输出导向(>)和错误输出导向(& >)最大的差別是在於指令执行发生错误时,若是指令执行发生错误,输出导向会错误讯息直接显示到萤幕,但是並不记錄到档案中。而错误输出导向不论是正常或错误的执行,都不会将讯息结果显示在萤幕上,而是直接写入档案中。
一般的程式设计师都会习惯将程式测试和除错时的所有讯息(正常和错误)记錄在档案中,以利曰后修改时的参考,以下提供一个简单的范例来让读者了解二者问的不同:
▓ 管線
Linux系统中的「管線」(Pipe)最主要的功能是将其他程式的输出结果,直接导向到另一个程式来当成输入资料,虽然这个方式对於初学者可能会觉得复杂,但是有效的利用这个功能可以节省不少指令的输入时间,以及避免错误的发生。
举例来說,/etc目錄下的档案有很多,若是您使用「1s -al」指令,它们並沒有办法在同一页中显示,若要浏览第一页中的资料,就显得很不方便。此时就可以将「1s -al」指令產生的结果利用管線( | )直接导向至「1ess 」指令,因此就可以使用上下键来逐行浏览输出结果。
[root@nsl root]# ls -al /etc | less
管線的使用可以与许多现有的指令相结合,也能產生许多不同的效果,若是读者有兴趣可以多多尝试管線与不同的指令组合,例如< 、> 和 &>,相信您一定可以从中得到许多的便利。
1-7 使用指令与图形管理工具的迷失
在本章的最后,笔者想提出一些有关大家对於指令与图形介面工具在进行系统管理上一直爭论不休的看法,也希望能给大家一个新的思考方向。
相信对於大多数Linux入门的新手(包括才疏学浅的我)来說,沒有人会对Linux的指令產生好印象,因为使用者永远不知到底有多少指令?每个指令支援的参数有多少?尤其在微软的图形介面系统橫扫全球个人电脑的旋风后,对於习惯鲇鲇滑鼠便可完成操作的使用者来說,学习Linux繁复的指令可說是梦魇的开始,此时在大家的心里不禁產生了一个问题一我们真的要学指令吗?
尤其在X Window System问市后,其功能在一再的加強后,以目前来讲已经可以与微软系统上的图形使用者介面(GUI)相媲美(虽不中亦不远矣!),但是为何翻开坊问Linux的管理书籍,其中的內容多半是指令的介绍,而寻卜使用作业系统中附加的图形工具呢?
甚至现在也有一些可由微软的作业系统上,利用浏览器连接到Linux上进行远端管理的图形工具,例如Webmin’它们的功能也能包含大部份的管理內容,为何我们还要苦苦死守文字模式的Telnet来进行远端管理呢?
相信笔者以上提出的几个问题一定可以让各位反覆的思考许久,若是您有宝贵的意见,也希望能与读者共同分享,以下仅提出笔者对这个思想冲突上的浅见:
◎ 实体上的限制
由於使用者图形介面会比指令耗损较多的实体记忆体,因此在理论上,使用指令的操作确实可以增加系统效能。但是在目前记忆体价格大幅滑落的情形下,以这个理由来回答必须使用指令进行管理似乎过於牵強。
其实笔者认为第一个必须使用指令的理由是,若是GUI无法啟动,例如显示卡的设定產生问题时,您就必须使用指令的方式来进行有关的设定。因此以这个角度上来思考,学习指令並非是Linux的专利,使用微软作业系统的使用者也必须一同来学习需要的指令,因为Windows系列產品有时也会遇到视窗无法开啟的问题。
◎ 管理上的深度
GUI的设计常以大部份使用者的需求来设计,因此在一般的情形下使用GUI已是绰绰有余,其实並不需要指令的辅助。
但重要的是,有时您要进行较为精细的管理工作,或是专为特定的对象来设计系统,此时您就必须使用指令才可方便的进行设定,因为GUI可能並沒有提供该项的功能。所以笔者
並不赞成入门者一开始就接触艰深的指令操作,相反的,笔者认为初学者可以尽可能的使用GUI工具,等到对於Linux建立初步的观念后,再来对指令进行探讨,相信可以消除大多数读者对於这个強大作业系统的恐惧感。
◎ 应避免的错误观念
记得笔者在求学时,学校的老师大多以Unix指令教授为主,其实这並不是一件错的事,而是他们的观念错了,因为他们不会使用图形介面工具,所以他们就一昧的反驳使用GUI的使用者。 笔者认为在电脑的学习上应该抱著多所包容且虛心的态度才可使自己增长,不论指令或是图形工具一定有我们可以学习的地方,因此不应对任何一种方式存在偏颇的观念,否则最后您必是被资讯世界淘汰的人。
总归一句话,多角度的学习一定会有所助益,最重要的是不要对Linux失云信心,因为它是一个很好的作业系统,失去了学习它的机会,一定会是您的一大憾事。 虽然笔者完全肯定GUI的功能,但是因为要将指令与GUI的內容同时在书中介绍並非易事,所以本书会以指令讨论为主,而以图形介面工具为辅,希望能给予读者一个多樣式的选择。