一、用户与用户组
1.1 Linux系统内的三种身份
:所有者、用户组与其他人
root是万能的天神。
1.2 Linux用户身份与用户组记录的文件
账号:/etc/passwd
密码:/etc/shadow
用户组:/etc/group
二、文件权限概念
2.1 文件属性
[root@www ~]# ls -al
total 156
drwxr-x--- 4 root root 4096 Sep 8 14:06 .
drwxr-xr-x 23 root root 4096 Sep 8 14:21 ..
-rw------- 1 root root 1474 Sep 4 18:27 anaconda-ks.cfg
-rw------- 1 root root 199 Sep 8 17:14 .bash_history
-rw-r--r-- 1 root root 24 Jan 6 2007 .bash_logout
-rw-r--r-- 1 root root 191 Jan 6 2007 .bash_profile
-rw-r--r-- 1 root root 176 Jan 6 2007 .bashrc
-rw-r--r-- 1 root root 100 Jan 6 2007 .cshrc
drwx------ 3 root root 4096 Sep 5 10:37 .gconf <=范例说明处
drwx------ 2 root root 4096 Sep 5 14:09 .gconfd
-rw-r--r-- 1 root root 42304 Sep 4 18:26 install.log <=范例说明处
-rw-r--r-- 1 root root 5661 Sep 4 18:25 install.log.syslog
[ 1 ][ 2 ][ 3 ][ 4 ][ 5 ][ 6 ][ 7 ]
[ 权限 ][连结][拥有者][群组][文件容量][ 修改日期 ][ 檔名 ]
ls
是『list
』的意思,重点在显示文件的文件名与相关属性。而选项『-al
』则表示列出所有的文件详细的权限与属性 (包含隐藏档,就是文件名第一个字符为『 . 』的文件)。
-
第一个字符
代表这个文件是『目录、文件或链接文件等等』:当为[ d ]则是目录,例如上表档名为『.gconf』的那一行;
当为[ - ]则是文件,例如上表档名为『install.log』那一行;
列表项目
文件权限:
接下来的字符中,以三个为一组,且均为『rwx
』 的三个参数的组合。其中,[r
]代表可读(read
)、[w
]代表可写(write
)、[x
]代表可执行(execute
)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已。第五列为这个文件的容量大小,默认单位为
B
。
[root@www ~]# ls -l /etc/termcap /root/install.log
-rw-r--r-- 1 root root 807103 Jan 7 2007 /etc/termcap
-rw-r--r-- 1 root root 42304 Sep 4 18:26 /root/install.log
# 如上所示,/etc/termcap 为 2007 年所修改过的文件,离现在太远之故;
# 至于 install.log 是今年 (2009) 所建立的,所以就显示完整的时间了。
2.2 改变文件属性与权限
chgrp
:改变文件所属群组
chown
:改变文件拥有者
chmod
:改变文件的权限, SUID, SGID, SBIT等等的特性
2.2.1 改变所属群组, chgrp
,这个指令就是change group
的缩写。
请记得,要被改变的组名必须要在/etc/group文件内存在才行,否则就会显示错误!
[root@www ~]# chgrp [-R] dirname/filename ...
选项与参数:
-R : 进行递归(`recursive`)的持续变更,亦即连同次目录下的所有文件、目录
都更新成为这个群组之意。常常用在变更某一目录内所有的文件之情况。
范例:
[root@www ~]# chgrp users install.log
[root@www ~]# ls -l
-rw-r--r-- 1 root users 68495 Jun 25 08:53 install.log
[root@www ~]# chgrp testing install.log
chgrp: invalid group name `testing' <== 发生错误讯息啰~找不到这个群组名~
2.2.2 改变文件拥有者, chown
。
改变拥有者就是change owner
啰!BINGO!
要注意的是, 用户必须是已经存在系统中的账号,也就是在/etc/passwd 这个文件中有纪录的用户名称才能改变。
chown的用途还满多的,他还可以顺便直接修改群组的名称呢!此外,如果要连目录下的所有次目录或文件同时更改文件拥有者的话,直接加上 -R
的选项即可!我们来看看语法与范例:
[root@www ~]# chown [-R] 账号名称 文件或目录
[root@www ~]# chown [-R] 账号名称:组名 文件或目录
选项与参数:
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都变更
范例:将install.log的拥有者改为bin这个账号:
[root@www ~]# chown bin install.log
[root@www ~]# ls -l
-rw-r--r-- 1 bin users 68495 Jun 25 08:53 install.log
范例:将install.log的拥有者与群组改回为root:
[root@www ~]# chown root:root install.log
[root@www ~]# ls -l
-rw-r--r-- 1 root root 68495 Jun 25 08:53 install.log
Tips
事实上,
chown
也可以使用『chown user.group file
』,亦即在拥有者与群组间加上小数点『.
』也行! 不过很多朋友设定账号时,喜欢在账号当中加入小数点(例如vbird.tsai
这样的账号格式),这就会造成系统的误判了! 所以我们比较建议使用冒号『:
』来隔开拥有者与群组啦!此外,chown
也能单纯的修改所属群组呢! 例如『chown .sshd install.log
』就是修改群组~看到了吗?就是那个小数点的用途!
2.2.3 改变权限, chmod
文件权限的改变使用的是chmod
这个指令,但是,权限的设定方法有两种, 分别可以使用数字
或者是符号
来进行权限的变更。我们就来谈一谈:
1. 数字类型改变文件权限
Linux文件的基本权限就有九个,分别是owner/group/others
三种身份各有自己的read/write/execute
权限, 先复习一下刚刚上面提到的数据:文件的权限字符为:『-rwxrwxrwx
』, 这九个权限是三个三个一组的!其中,我们可以使用数字来代表各个权限,各权限的分数对照表如下:
r:4
w:2
x:1
每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,例如当权限为: [-rwxrwx---] 分数则是:
owner = rwx = 4+2+1 = 7
group = rwx = 4+2+1 = 7
others= --- = 0+0+0 = 0
所以等一下我们设定权限的变更时,该文件的权限数字就是770啦!变更权限的指令chmod的语法是这样的:
[root@www ~]# chmod [-R] xyz 文件或目录
选项与参数:xyz
: 就是刚刚提到的数字类型的权限属性,为 rwx
属性数值的相加。-R
: 进行递归(recursive
)的持续变更,亦即连同次目录下的所有文件都会变更
举例来说,如果要将.bashrc
这个文件所有的权限都设定启用,那么就下达:
[root@www ~]# ls -al .bashrc
-rw-r--r-- 1 root root 395 Jul 4 11:45 .bashrc
[root@www ~]# chmod 777 .bashrc
[root@www ~]# ls -al .bashrc
-rwxrwxrwx 1 root root 395 Jul 4 11:45 .bashrc
2. 符号类型改变文件权限
还有一个改变权限的方法呦!从之前的介绍中我们可以发现,基本上就九个权限分别是(1)user (2)group (3)others
三种身份啦!那么我们就可以藉由u, g, o
来代表三种身份的权限!此外, a 则代表 all
亦即全部的身份!那么读写的权限就可以写成r, w, x
!也就是可以使用底下的方式来看:
+(加入)
-(除去)
=(设定)
[root@www ~]# chmod u=rwx,go=rx .bashrc
# 注意喔!那个 u=rwx,go=rx 是连在一起的,中间并没有任何空格!
[root@www ~]# ls -al .bashrc
-rwxr-xr-x 1 root root 395 Jul 4 11:45 .bashrc
此外,如果我不知道原先的文件属性
,而我只想要增加.bashrc这个文件的每个人均可写入的权限, 那么我就可以使用:
[root@www ~]# ls -al .bashrc
-rwxr-xr-x 1 root root 395 Jul 4 11:45 .bashrc
[root@www ~]# chmod a+w .bashrc
[root@www ~]# ls -al .bashrc
-rwxrwxrwx 1 root root 395 Jul 4 11:45 .bashrc
而如果是要将权限去掉而不更动其他已存在的权限呢?例如要拿掉全部人的可执行权限,则:
[root@www ~]# chmod a-x .bashrc
[root@www ~]# ls -al .bashrc
-rw-rw-rw- 1 root root 395 Jul 4 11:45 .bashrc
2.3 目录与文件的权限的意义
现在我们知道了Linux系统内文件的三种身份(拥有者、群组与其他人
),每种身份都有三种权限(rwx
), 已知道能够使用chown, chgrp, chmod
去修改这些权限与属性
,当然,利用ls -l去观察文件也没问题。 前两小节也谈到了这些文件权限对于数据安全
的重要性。那么,这些文件权限对于一般文件与目录文件有何不同呢? 有大大的不同啊!
2.3.1 权限对文件的重要性
文件是实际含有数据的地方,包括一般文本文件、数据库内容文件、二进制可执行文件(binary program
)等等。 因此,权限对于文件来说,他的意义是这样的:
r (read)
:可读取此一文件的实际内容,如读取文本文件的文字内容等;w (write)
:可以编辑、新增或者是修改该文件的内容(但不含删除该文件
);x (execute)
:该文件具有可以被系统执行的权限。
那个可读(r
)代表读取文件内容是还好了解,那么可执行(x
)呢?这里你就必须要小心啦! 因为在Windows底下一个文件是否具有执行的能力是藉由『 扩展名
』来判断的, 例如:.exe, .bat, .com 等等,但是在Linux底下,我们的文件是否能被执行,则是藉由是否具有『x』这个权限来决定的!跟档名是没有绝对的关系的!
至于最后一个w这个权限呢?当你对一个文件具有w权限时,你可以具有写入/编辑/新增/修改文件的内容的权限, 但并不具备有删除该文件本身的权限!
对于文件的rwx
来说, 主要都是针对『文件的内容
』而言,与文件档名的存在与否没有关系喔!因为文件记录的是实际的数据嘛!
2.3.2 权限对目录的重要性
文件是存放实际数据
的所在,那么目录主要是储存啥玩意啊?目录主要的内容在记录文件名列表,文件名与目录有强烈的关连啦! 所以如果是针对目录时,那个 r, w, x
对目录是什么意义呢?
r (read contents in directory):
表示具有读取目录结构列表的权限,所以当你具有读取(r)一个目录的权限时,表示你可以查询该目录下的文件名
数据(无法读取文件的详细信息
)。 所以你就可以利用 ls
这个指令将该目录的内容列表显示出来!
w (modify contents of directory):
这个可写入的权限对目录来说,是很了不起的! 因为他表示你具有更改该目录结构列表的权限,也就是底下这些权限:
建立新的文件与目录;
删除已经存在的文件与目录(不论该文件的权限为何!
)
将已存在的文件或目录进行更名;
搬移该目录内的文件、目录位置。
总之,目录的w权限就与该目录底下的文件名变动有关就对了啦!
x (access directory):
咦!目录的执行权限有啥用途啊?目录只是记录文件名而已,总不能拿来执行吧?没错!目录不可以被执行,目录的x代表的是用户能否进入该目录成为工作目录的用途!
所谓的工作目录(work directory
)就是你目前所在的目录啦!举例来说,当你登入Linux时, 你所在的家目录就是你当下的工作目录。而变换目录的指令是『cd
』(change directory
)啰!
看几个范例,让你了解一下啥是目录的权限啰!
例题:
有个目录的权限如下所示:
drwxr--r-- 3 root root 4096 Jun 25 08:35 .ssh
系统有个账号名称为vbird
,这个账号并没有支持root
群组,请问vbird
对这个目录有何权限?是否可切换到此目录中?
答:vbird
对此目录仅具有r
的权限,因此vbird
可以查询此目录下的文件名列表。因为vbird
不具有x
的权限, 因此vbird
并不能切换到此目录内!(相当重要的概念!)
很多朋友在架设网站的时候都会卡在一些权限的设定上,他们开放目录数据给因特网的任何人来浏览, 却只开放r
的权限,如上面的范例所示那样,那样的结果就是导致网站服务器软件无法到该目录下读取文件(最多只能看到檔名), 最终用户总是无法正确的查阅到文件的内容(显示权限不足啊!)。要注意:
要开放目录给任何人浏览时,应该至少也要给予
r
及x
的权限,但w
权限不可随便给! 为什么w
不能随便给,我们来看下一个例子:
例题:
假设有个账号名称为dmtsai
,他的家目录在/home/dmtsai/,dmtsai对此目录具有[rwx
]的权限。 若在此目录下有个名为the_root.data的文件,该文件的权限如下:
-rwx------ 1 root root 4365 Sep 19 23:20 the_root.data
请问dmtsai对此文件的权限为何?可否删除此文件?
答:
如上所示,由于dmtsai对此文件来说是『others
』的身份,因此这个文件他无法读、无法编辑也无法执行, 也就是说,他无法变动这个文件的内容就是了。
但是由于这个文件在他的家目录下, 他在此目录下具有rwx
的完整权限,因此对于the_root.data这个『档名』来说,他是能够『删除
』的! 结论就是,dmtsai这个用户能够删除the_root.data这个文件!
[root@www ~]# cd /tmp <==切换工作目录到/tmp
[root@www tmp]# mkdir testing <==建立新目录
[root@www tmp]# chmod 744 testing <==变更权限
[root@www tmp]# touch testing/testing <==建立空的文件
[root@www tmp]# chmod 600 testing/testing <==变更权限
[root@www tmp]# ls -ald testing testing/testing
drwxr--r-- 2 root root 4096 Sep 19 16:01 testing
-rw------- 1 root root 0 Sep 19 16:01 testing/testing
# 仔细看一下,目录的权限是 744 ,且所属群组与使用者均是 root 喔!
# 那么在这样的情况底下,一般身份用户对这个目录/文件的权限为何?
一般用户的读写权限为何?
[root@www tmp]# su - vbird <==切换身份成为 vbird 啰!
[vbird@www ~]$ cd /tmp <==看一下,身份变了喔!提示字符也变成 $ 了!
[vbird@www tmp]$ ls -l testing/
?--------- ? ? ? ? ? testing
# 因为具有 r 的权限可以查询档名。不过权限不足(没有x),所以会有一堆问号。
[vbird@www tmp]$ cd testing/
-bash: cd: testing/: Permission denied
# 因为不具有 x ,所以当然没有进入的权限啦!有没有呼应前面的权限说明啊!
如果该目录属于用户本身,会有什么状况?
上面的练习我们知道了只有r
确实可以让用户读取目录的文件名列表,不过详细的信息却还是读不到的
, 同时也不能将该目录变成工作目录(用 cd 进入该目录之意)。那如果我们让该目录变成用户的, 那么用户在这个目录底下是否能够删除文件呢?
[vbird@www tmp]$ exit <==让 vbird 变回原本的 root 身份喔!
[root@www tmp]# chown vbird testing <==修改权限,让vbird拥有此目录
[root@www tmp]# su - vbird <==再次变成vbird来操作
[vbird@www ~]$ cd /tmp/testing <==可以进入目录了呢!
[vbird@www testing]$ ls -l
-rw------- 1 root root 0 Sep 19 16:01 testing <==文件不是vbird的!
[vbird@www testing]$ rm testing <==尝试刪除这个文件看看!
rm: remove write-protected regular empty file `testing'? y
# 竟然可以删除!这样理解了吗?!
透过上面这个简单的步骤,你就可以清楚的知道, x
在目录当中是与『能否进入该目录』有关, 至于那个 w
则具有相当重要的权限,因为他可以让使用者删除
、更新、新建文件或目录, 是个很重要的参数啊!这样可以理解了吗?! ^_^
2.4 文件种类与扩展名
任何装置在Linux底下都是文件, 不仅如此,连数据沟通的接口也有专属的文件在负责~所以,你会了解到,Linux的文件种类真的很多~
普通文件:
纯文本文件(
ASCII
):这是Linux系统中最多的一种文件类型啰, 称为纯文本档是因为内容为我们人类可以直接读到的数据,例如数字、字母等等。 几乎只要我们可以用来做为设定的文件都属于这一种文件类型。 举例来说,你可以下达『cat ~/.bashrc
』就可以看到该文件的内容。 (cat
是将一个文件内容读出来的指令)二进制文件(
binary
):还记得我们在『 第零章、计算器概论 』里面的软件程序的运作中提过, 我们的系统其实仅认识且可以执行二进制文件(binary file
)吧?没错~ 你的Linux
当中的可执行文件(scripts
, 文字型批处理文件不算)就是这种格式的啦~ 举例来说,刚刚下达的指令cat
就是一个binary file
。数据格式文件(
data
): 有些程序在运作的过程当中会读取某些特定格式的文件,那些特定格式的文件可以被称为数据文件 (data file
)。举例来说,我们的Linux
在使用者登入时,都会将登录的数据记录在/var/log/wtmp
那个文件内,该文件是一个data file
,他能通过过last
这个指令读出来! 但是使用cat
时,会读出乱码~因为他是属于一种特殊格式的文件。瞭乎?
目录:
就是目录啰~第一个属性为 [
d
],例如 [drwxrwxrwx
]。
链接文件:
就是类似Windows系统底下的快捷方式啦! 第一个属性为
l
,例如 [lrwxrwxrwx
] ;
设备文件:
与系统周边及储存等相关的一些文件, 通常都集中在/dev
这个目录之下!通常又分为两种:
区块(
block
)设备文件:就是一些储存数据, 以提供系统随机存取的接口设备,举例来说,硬盘与软盘等就是啦! 你可以随机的在硬盘的不同区块读写,这种装置就是成组设备啰!你可以自行查一下/dev/sda
看看, 会发现第一个属性为[b
]喔!字符(
character
)设备文件:亦即是一些串行端口的接口设备, 例如键盘、鼠标等等!这些设备的特色就是『一次性读取』的,不能够截断输出。 举例来说,你不可能让鼠标『跳到』另一个画面,而是『滑动』到另一个地方啊!第一个属性为 [c
]。
数据接口文件(sockets
):
既然被称为数据接口文件, 这种类型的文件通常被用在网络上的数据承接了。我们可以启动一个程序来监听客户端的要求, 而客户端就可以透过这个socket
来进行数据的沟通了。第一个属性为 [ s
], 最常在/var/run
这个目录中看到这种文件类型了。
管道(FIFO, pipe
):FIFO
也是一种特殊的文件类型,他主要的目的在解决多个程序同时存取一个文件所造成的错误问题。 FIFO
是first-in-first-out
的缩写。第一个属性为[p
] 。
三、目录配置
3.1 绝对路径与相对路径
除了需要特别注意的FHS目录配置外,在文件名部分我们也要特别注意喔!因为根据档名写法的不同,也可将所谓的路径(path
)定义为绝对路径(absolute
)与相对路径(relative
)。 这两种文件名/路径的写法依据是这样的:
绝对路径:由根目录(/
)开始写起的文件名或目录名称, 例如 /home/dmtsai/.bashrc
;
相对路径:相对于目前路径的文件名写法。 例如 ./home/dmtsai
或 ../../home/dmtsai/
等等。反正开头不是 / 就属于相对路径的写法
而你必须要了解,相对路径是以『你当前所在路径的相对位置』来表示的。举例来说,你目前在 /home
这个目录下, 如果想要进入 /var/log
这个目录时,可以怎么写呢?
cd /var/log (absolute)
cd ../var/log (relative)
因为你在 /home
底下,所以要回到上一层 (../
) 之后,才能继续往 /var
来移动的! 特别注意这两个特殊的目录:
.
:代表当前的目录,也可以使用./
来表示;..
:代表上一层目录,也可以../
来代表。
这个 .
与 ..
目录概念是很重要的,你常常会看到 cd ..
或 ./command
之类的指令下达方式, 就是代表上一层与目前所在目录的工作状态喔!很重要的吶!
例题:
如何先进入/var/spool/mail/
目录,再进入到/var/spool/cron/
目录内?
答:
由于/var/spool/mail
与/var/spool/cron
是同样在/var/spool/
目录中,因此最简单的指令下达方法为:
cd /var/spool/mail
cd ../cron
如此就不需要在由根目录开始写起了。这个相对路径是非常有帮助的!尤其对于某些软件开发商来说。 一般来说,软件开发商会将数据放置到/usr/local/
里面的各相对目录。
例题:
网络文件常常提到类似『./run.sh
』之类的数据,这个指令的意义为何?
答:
由于指令的执行需要变量(bash
章节才会提到)的支持,若你的执行文件放置在本目录,并且本目录并非正规的执行文件目录(/bin, /usr/bin
等为正规),此时要执行指令就得要严格指定该执行档。『./
』代表『本目录』的意思,所以『./run.sh
』代表『执行本目录下, 名为run.sh
的文件』啰!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。