linux入门-文件权限管理与配置
一、关于linux的操作命令一般格式如下:
1,一行指令中第一个输入的部分绝对是“指令(command)”或“可可执行文件案(例如批次
脚本,script)”
2,command 为指令的名称,例如变换工作目录的指令为 cd 等等;
3,中刮号[]并不存在于实际的指令中,而加入选项设置时,通常选项前会带 - 号,例如 -h;
有时候会使用选项的完整全名,则选项前带有 -- 符号,例如 --help;
4,parameter1 parameter2.. 为依附在选项后面的参数,或者是 command 的参数;paramenter1和parameter2可有可无,例如ls,
5,指令,选项,参数等这几个咚咚中间以空格来区分,不论空几格 shell 都视为一格。所以空 格是很重要的特殊字符!;
6,按下[Enter]按键后,该指令就立即执行。[Enter]按键代表着一行指令的开始启动。
7,指令太长的时候,可以使用反斜线()来跳脱[Enter]符号,使指令连续到下一行。注 意!反斜线后就立刻接特殊字符,才能跳脱!
8,在Linux系统中,英文大小写字母是不一样的。举例来说,cd与CD并不同。还有其他的将会在shell部分介绍,比如管道符。
例如:以ls命令为例:关于ls命令详解后续介绍。如果不能理解,请看后续。
//使用方法如下,可以直接使用命令ls,也可以加上选项-a,-l,-al等等,也可以加上参数ls /var/,也可以即加上选项由加上参数,如ls -a /var/等等,也可以加上多个参数,如ls -a /var/ /etc/等等。
ls
ls -l
ls -a
ls -al
ls /var/
ls -a /var/
ls -a /var/ /etc/
二、关机和重启命令:
- 惯用的关机指令: shutdown
- 重新开机,关机: reboot, halt, poweroff
1,shutdown 详解:
[root@study ~]# shutdown [-krhc] [时间] [警告讯息]
选项与参数:
-k : 不要真的关机,只是发送警告讯息出去!
-r : 在将系统的服务停掉之后就重新开机(常用)(即重启)
-h : 将系统的服务停掉后,立即关机。 (常用)
-c : 取消已经在进行的shutdown指令内容。
时间 : 指定系统关机的时间!时间的范例下面会说明。若没有这个项目,则默认1分钟后自动进行。
范例:
root@refreshing18-virtual-machine:/# /sbin/shutdown -h 10 'I will shutdown after 10 mins'
Shutdown scheduled for Wed 2019-03-20 15:22:25 CST, use 'shutdown -c' to cancel.
//其他使用方法:
[root@study ~]# shutdown -h now 立刻关机,其中 now 相当于时间为0的状态
[root@study ~]# shutdown -h 20:25 系统在今天的20:25分会关机,若在21:25才下达此指令,则隔天才关机
[root@study ~]# shutdown -h +10 系统再过十分钟后自动关机
[root@study ~]# shutdown -r now 系统立刻重新开机
[root@study ~]# shutdown -r +30 'The system will reboot' 再过三十分钟系统会重启,并显示后面的讯息给所有在线上的使用者
[root@study ~]# shutdown -k now 'This system will reboot'
仅发出警告信件的参数!系统并不会关机啦!吓唬人!
2,reboot, halt, poweroff使用方法:
[root@study ~]# systemctl [指令]
指令项目包括如下:
halt 进入系统停止的模式,屏幕可能会保留一些讯息,这与你的电源管理模式有关
poweroff 进入系统关机模式,直接关机没有提供电力喔!
reboot 直接重新开机
suspend 进入休眠模式
[root@study ~]# systemctl reboot # 系统重新开机
[root@study ~]# systemctl poweroff # 系统关机
三、linux中几个常用的快捷键:
[Tab]按键:具有“命令补全”与“文 件补齐”的功能;
eg: 命令补全,在命令行输入ca再按两次[tab]按键
[root@localhost /]# ca
cacertdir_rehash cache_metadata_size cache_writeback caller case catman cache_check cache_repair cal capsh cat cache_dump cache_restore ca-legacy captoinfo catchsegv
例如:文本补全,在命令行输入ls -al ~/.bash再按两次[tab]按键
[root@localhost /]# ls -al ~/.bash
.bash_history .bash_logout .bash_profile .bashrc
[Ctrl]-c按键:是中断目前程序的按键;
[dmtsai@study ~]$ find /
....(一堆东西都省略)....
# 此时屏幕会很花,你看不到命令提示字符的!直接按下[ctrl]-c即可!
[dmtsai@study ~]$ <==此时提示字符就会回来了!find程序就被中断!
[Ctrl]-d按键:代表着: “键盘输入结 束(End Of File, EOF 或 End Of Input)”的意思;
四、权限设置与管理
注:由于后面部分命令将涉及权限相关的知识,故在此先介绍了。
基本概念介绍
简介:每个文件都有其相关的属性和权限,该文件由谁创建,谁可以读取,谁又可以修改该文件等等,都是可以通过文件的权限属性进行配置的。下面首先介绍对于文件权限很重要的三个概念:(1)使用者及(2)群组与(3)非本群组外的其他人
1,文件的拥有者:
初次接触Linux的朋友大概会觉得很怪异,怎么“Linux有这么多使用者,还分什么群组,有什么用?”。这个“使用者与群组”的功能可是相当健全而好用的一个安全防护呢!怎么 说呢?由于Linux是个多用户多任务的系统,因此可能常常会有多人同时使用这部主机来 进行工作的情况发生,为了考虑每个人的隐私权以及每个人喜好的工作环境,因此,这 个“文件拥有者”的角色就显的相当的重要了!
例如当你将你的e-mail情书转存成文件之后,放在你自己的主文件夹,你总不希望被其他 人看见自己的情书吧?这个时候,你就把该文件设置成“只有文件拥有者,就是我,才能看与修改这个文件的内容”,那么即使其他人知道你有这个相当“有趣”的文件,不过由于你有设置适当的权限,所以其他人自然也就无法知道该文件的内容啰!
2,群组概念
那么群组呢?为何要设置文件还有所属的群组?其实,群组最有用的功能之一,就是当 你在团队开发资源的时候啦!举例来说,假设有两组专题生在我的主机里面,第一个专 题组别为projecta,里面的成员有class1,class2, class3三个;第二个专题组别为 projectb,里面的成员有class4,class5, class6。 这两个专题之间是有竞争性质的,但却 要缴交同一份报告。每组的组员之间必须要能够互相修改对方的数据,但是其他组的组员则不能看到本组自己的文件内容,此时该如何是好?
在Linux下面这样的限制是很简单啦!我可以经由简易的文件权限设置,就能限制非自己 团队(亦即是群组啰)的其他人不能够阅览内容啰!而且亦可以让自己的团队成员可以 修改我所创建的文件!同时,如果我自己还有私人隐密的文件,仍然可以设置成让自己 的团队成员也看不到我的文件数据。方便吧!
另外,如果teacher这个帐号是projecta与projectb这两个专题的老师, 他想要同时观察两 者的进度,因此需要能够进入这两个群组的权限时,你可以设置teacher这个帐号,“同 时支持projecta与projectb这两个群组!”,也就是说:每个帐号都可以有多个群组的支持 呢!
3,其他人的概念
其他人,很容易理解,在这里以某个文件为例,即不是这个文件的拥有者,也不在这个文件指定群主中的人就是其他人啦,是不是很easy呢,嘿嘿。
文件属性介绍
[dmtsai@study ~]$ su - # 先来切换一下身份看看
Password: Last login: Tue Jun 2 19:32:31 CST 2015 on tty2
[root@study ~]# ls -al
total 48
dr-xr-x---. 5 root root 4096 May 29 16:08 .
dr-xr-xr-x. 17 root root 4096 May 4 17:56 ..
-rw-------. 1 root root 1816 May 4 17:57 anaconda-ks.cfg
-rw-------. 1 root root 927 Jun 2 11:27 .bash_history
-rw-r--r--. 1 root root 18 Dec 29 2013 .bash_logout
-rw-r--r--. 1 root root 176 Dec 29 2013 .bash_profile
-rw-r--r--. 1 root root 176 Dec 29 2013 .bashrc
drwxr-xr-x. 3 root root 17 May 6 00:14 .config
[ 1 ] [2] [3] [4] [5] [ 6 ] [ 7 ]
[ 权限 ] [链接][拥有者][群组][文件大小][ 修改日期 ][ 文件名 ]
1,第一栏代表这个文件的类型与权限
如上,第一栏其实共有十个字符,如:drwxr-xr-x
- 第一个字符第一个字符代表这个文件是“目录、文件或链接文件等等”:
- 接下来的字符中,以三个为一组,且均为“rwx” 的三个参数的组合。其中,[ r]代表可(read)、[w]代表可写(write)、[x]代表可执行(execute)。要注意的是,这三个 权限的位置不会改变,如果没有权限,就会出现减号[-]而已。
- 第一组为“文件拥有者可具备的权限”,以“anaconda-ks.cfg”那个文件为例, 该文件 的拥有者可以读写,但不可执行;
- 第二组为“加入此群组之帐号的权限”;
- 第三组为“非本人且没有加入本群组之其他帐号的权限”。
2,第二栏表示有多少文件名链接到此节点(i-node):每个文件都会将他的权限与属性记录到文件系统的i-node中,不过,我们使用的目录树却是使 用文件名来记录, 因此每个文件名就会链接到一个i-node啰!这个属性记录的,就是有多少 不同的文件名链接到相同的一个i-node号码去就是了。
3,第三栏表示这个文件(或目录)的“拥有者帐号”
4,第四栏表示这个文件的所属群组
5,第五栏为这个文件的容量大小,默认单位为Bytes
6,第六栏为这个文件的创建日期或者是最近的修改日期
7,第七栏为这个文件的文件名
实例1:
-rw-r--r-- 1 root root 238 Jun 18 17:22 test.txt
-rwxr-xr-- 1 test1 testgroup 5238 Jun 19 10:25 ping_tsai
#文件test.txt的拥有者为root,所属群组为root。至于权限方面则只有root这个帐号可以读写此文件,其他人则仅能读此文件;
#另一个文件ping_tsai的拥有者为test1,而所属群组为testgroup,其中test1可以针对此文件具有可读可写可执行的权力,而同群组的test2,test3两个人与test1同样是testgroup的群组帐号,则仅可读可执行 但不能写(亦即不能修改);至于没有加入testgroup这一个群组的其他人则仅可以读,不能写也不能执行!
实例2:
drwxr-xr-- 1 test1 testgroup 5238 Jun 19 10:25 groups/
#文件拥有者test1[rwx]可以在本目录中进行任何工作
#而testgroup这个群组[r-x]的帐号,例如test2, test3亦可以进入本目录进行工作,但是不能 在本目录下进行写入的动作;
#至于other的权限中[r--]虽然有r,但是由于没有x的权限,因此others的使用者,并不能进入此目录!
文件属性与权限相关命令
1,chgrp:改变文件所属群组 (全称change group)
[注]:要被改变的群组名称必须要在/etc/group文件内存在才行,否则就会显示错误!
实例使用:
[root@study ~]# chgrp [-R] usergroup dirname/filename ...
选项与参数:
-R : 进行递回(recursive)的持续变更,亦即连同次目录下的所有文件、目录 都更新成为这个群组之意。常常用在变更某一目录内所有的文件之情况。
范例:
[root@study ~]# chgrp users initial-setup-ks.cfg
[root@study ~]# ls -l
-rw-r--r--. 1 root users 1864 May 4 18:01 initial-setup-ks.cfg [root@study ~]# chgrp testing initial-setup-ks.cfg
chgrp: invalid group: `testing' <== 发生错误讯息啰~找不到这个群组名~
2,chown:改变文件拥有者(全称change owner)
[注]:使用者必须是 已经存在系统中的帐号,也就是在/etc/passwd 这个文件中有纪录的使用者名称才能改变。
实例使用:
[root@study ~]# chown [-R] 帐号名称 文件或目录
[root@study ~]# chown [-R] 帐号名称:群组名称 文件或目录
选项与参数:
-R : 进行递回(recursive)的持续变更,亦即连同次目录下的所有文件都变更
范例:将initial-setup-ks.cfg的拥有者改为bin这个帐号:
[root@study ~]# chown bin initial-setup-ks.cfg
[root@study ~]# ls -l
-rw-r--r--. 1 bin users 1864 May 4 18:01 initial-setup-ks.cfg
范例:将initial-setup-ks.cfg的拥有者与群组改回为root:
[root@study ~]# chown root:root initial-setup-ks.cfg
[root@study ~]# ls -l
-rw-r--r--. 1 root root 1864 May 4 18:01 initial-setup-ks.cfg
其他用法:
事实上,chown也可以使用“chown user.group file”,亦即在拥有者与群组间加上小数点“.”也行!不过很多朋友设置帐号时,喜欢在帐号当中加入小数点(例如vbird.tsai这样的帐 号格式),这就会造成系统的误判了!所以我们比较建议使用冒号“:”来隔开拥有者与群组 啦!此外,chown也能单纯的修改所属群组呢!例如“chown .sshd initial-setup-ks.cfg”就 是修改群组~看到了吗?就是那个小数点的用途!
3,chmod:改变权限
[注]:权限的设置方法有两种,分别可以使用数字或者是符号来进行权限的变更
-
数字类型改变文件权限
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@study ~]# chmod [-R] xyz 文件或目录 选项与参数: xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。 -R : 进行递回(recursive)的持续变更,亦即连同次目录下的所有文件都会变更
实例:将.bashrc这个文件所有的权限都设置启用,那么就下达: [root@study ~]# ls -al .bashrc -rw-r--r--. 1 root root 176 Dec 29 2013 .bashrc [root@study ~]# chmod 777 .bashrc [root@study ~]# ls -al .bashrc -rwxrwxrwx. 1 root root 176 Dec 29 2013 .bashrc //那如果要将权限变成“-rwxr-xr--”呢?那么权限的分数就成为 [4+2+1][4+0+1] [4+0+0]=754 啰!所以你需要下达“chmod 754 filename”。
-
符号类型改变文件权限
基本上就九个权限分别是 (1)user(2)group(3)others三种身份,那么我们就可以借由u,g,o来代表三种身份的权限!此外,a则代表all亦即全部的身份!那么读写执行的权限就可以写成r,w,x,使用方法如下:
|chmod| u g o a |+(加入)-(除去) =(设置)| r w x |文件或目录 |
例如1:设置”一个文件的权限成为“-rwxr-xr-x”时,基本上就是:
-
user(u):具有可读、可写、可执行的权限;
-
group与others(g/o):具有可读与执行的权限。所以就是:
[root@study ~]# chmod u=rwx,go=rx .bashrc # 注意喔!那个 u=rwx,go=rx 是连在一起的,中间并没有任何空白字符! [root@study ~]# ls -al .bashrc -rwxr-xr-x. 1 root root 176 Dec 29 2013 .bashrc
例如2:设置“-rwxr-xr--”这样的权限呢?可以使用“chmod u=rwx,g=rx,o=r filename”来设置。
例如3:如果我不知道原先的文件属性,而我只想要增加.bashrc这个文件的每个人均可写入的权限
//设置方法如下 [root@study ~]# ls -al .bashrc -rwxr-xr-x. 1 root root 176 Dec 29 2013 .bashrc [root@study ~]# chmod a+w .bashrc [root@study ~]# ls -al .bashrc -rwxrwxrwx. 1 root root 176 Dec 29 2013 .bashrc
例如4:如果是要将权限去掉而不更动其他已存在的权限呢?例如要拿掉全部人的可执行权限。
//设置方法如下 [root@study ~]# chmod a-x .bashrc [root@study ~]# ls -al .bashrc -rw-rw-rw-. 1 root root 176 Dec 29 2013 .bashrc [root@study ~]# chmod 644 .bashrc # 测试完毕得要改回来喔!
-
权限对文件的意义:
- r(read):可读取此一文件的实际内容,如读取文本文件的文字内容等;
- w(write):可以编辑、新增或者是修改该文件的内容(但不含删除该文件);
- x(eXecute):该文件具有可以被系统执行的权限。
权限对目录的意义:
-
r(read contents in directory):
表示具有读取目录结构清单的权限,所以当你具有读取(r)一个目录的权限时,表示你 可以查询该目录下的文件名数据。所以你就可以利用 ls 这个指令将该目录的内容列表显示出来!没有r的话,使用 [tab] 时,他就无法自动帮你补齐文件名了
-
w(modify contents of directory):
这个可写入的权限对目录来说,是很了不起的!因为他表示你具有异动该目录结构清单的权限,也就是下面这些权限:
- 创建新的文件与目录;
- 删除已经存在的文件与目录(不论该文件的权限为何!)
- 将已存在的文件或目录进行更名;
- 搬移该目录内的文件、目录位置。总之,目录的w权限就与该目录下面的文件名异 动有关就对了啦!
-
x(access directory):
咦!目录的执行权限有啥用途啊?目录只是记录文件名而已,总不能拿来执行吧?没 错!目录不可以被执行,目录的x代表的是使用者能否进入该目录成为工作目录的用途! 所谓的工作目录(work directory)就是你目前所在的目录啦!举例来说,当你登陆Linux时,你所在的主文件夹就是你当下的工作目录。而变换目录的指令是“cd”(change directory)啰!
默认权限与隐藏权限
1,文件默认权限:umask
当你创建一个新的文件或目录时,他的默认权限会是什么呢?这就与umask有关 了!基本上,umask就是指定“目前使用者在创建文件或目录时候的权限默认值”,有关umask介绍如下:
//umask查看方法有两种,第一种直接输入umask,就可以看到数字体态的权限设置分数,则是加入-S
//(Symbolic)这个选项,就会以符号类型的方式来显示出权限了,如下:,但是输入umask的时候出现了
//4个数字,第一个代表特殊权限,后续介绍,我们下面先介绍后面三个数字。
[root@study ~]# umask
0022 <==与一般权限有关的是后面三个数字!
[root@study ~]# umask -S
u=rwx,g=rx,o=rx
文件的默认最大权限:
- 若使用者创建为“文件”则默认“没有可执行(x)权限”,亦即只有 rw 这两个项目,也就 是最大为666分,默认权限如下:-rw-rw-rw-
- 若使用者创建为“目录”,则由于x与是否可以进入此目录有关,因此默认为所有权限均开放,亦即为777分,默认权限如下:drwxrwxrwx
umask输入后显示的数字中后面三个数字的含义:
umask的分数指的是“该默认值需要减掉的权限!”因为r、w、x分别是4、2、 1分,所以啰!也就是说,当要拿掉能写的权限,就是输入2分,而如果要拿掉能读的权限,也就是4分,那么要拿掉读与写的权限,也就是6分,而要拿掉执行与写入的权限,也就是3分。
实例:
以上面的例子来说明的话,因为umask为022,所以user并没有被拿掉任何权限,不 过group与others的权限被拿掉了2(也就是w这个权限),那么当使用者:
- 创建文件时权限变化:(-rw-rw-rw-)-(-----w--w-) ==> -rw-r--r--
- 创建目录时权限变化:(drwxrwxrwx)-(d----w--w-) ==> drwxr-xr-x
验证:
[root@study ~]# umask
0022
[root@study ~]# touch test1
[root@study ~]# mkdir test2
[root@study ~]# ll -d test*
-rw-r--r--. 1 root root 0 6月 16 01:11 test1
drwxr-xr-x. 2 root root 6 6月 16 01:11 test2
修改默认权限:
当我们需要新建文件给同群组的使用者共同编辑时,那么umask的群组就不能拿掉2 这个w的权限!所以啰,umask就得要是002之类的才可以!这样新建的文件才能够是rw-rw-r--的权限模样喔!那么如何设置umask呢?简单的很,直接在umask后面输入002 就好了!
[root@study ~]# umask 002
[root@study ~]# touch test3
[root@study ~]# mkdir test4
[root@study ~]# ll -d test[34]
#中括号[ ]代表中间有个指定的字符,而不是任意字符的意思
-rw-rw-r--. 1 root root 0 6月 16 01:12 test3
drwxrwxr-x. 2 root root 6 6月 16 01:12 test4
实例2:
假设你的umask为003,请问该umask情况下,创建的文件与目录权限为?答: umask为003,所以拿掉的权限为--------wx,因此:
- 文件:(-rw-rw-rw-) - (--------wx) = -rw-rw-r--
- 目录:(drwxrwxrwx) - (d-------wx) = drwxrwxr-
2,文件隐藏属性
- chattr(设置文件隐藏属性)
[root@study ~]# chattr [+-=][ASacdistu] 文件或目录名称
选项与参数:
+ :增加某一个特殊参数,其他原本存在参数则不动。
- :移除某一个特殊参数,其他原本存在参数则不动。
= :设置一定,且仅有后面接的参数
A :当设置了A这个属性时,若你有存取此文件(或目录)时,他的存取时间atime将不会 被修改,可避免 I/O 较慢的机器过度的存取磁盘。(目前建议使用文件系统挂载参数处理这 个项目)
S :一般文件是非同步写入磁盘的,如果加上S这个属性时,当你进行任何文件的修改,该更动会“同步”写入磁盘中。
a :当设置a之后,这个文件将只能增加数据,而不能删除也不能修改数据,只有root能设置这属性
c :这个属性设置之后,将会自动的将此文件“压缩”,在读取的时候将会自动解压缩, 但是在储存的时候,将会先进行压缩后再储存(看来对于大文件似乎蛮有用的!)
d :当dump程序被执行的时候,设置d属性将可使该文件(或目录)不会被dump备份
i :这个i就很厉害了!他可以让一个文件“不能被删除、改名、设置链接也无法写入或新增数据!” 对于系统安全性有相当大的助益!只有root能设置此属性。
s :当文件设置了s属性时,如果这个文件被删除,他将会被完全的移除出这个硬盘空间, 所以如果误删了,完全无法救回来了喔!
u :与s相反的,当使用u来设置文件时,如果该文件被删除了,则数据内容其实还存在磁盘中, 可以使用来救援该文件喔!
注意1:属性设置常见的是a与i的设置值,而且很多设置值必须要身为root才能设置
注意2:xfs 文件系统仅支持 AadiS而已
范例:请尝试到/tmp下面创建文件,并加入 i 的参数,尝试删除看看。
[root@study ~]# cd /tmp
[root@study tmp]# touch attrtest <==创建一个空文件
[root@study tmp]# chattr +i attrtest <==给予i的属性
[root@study tmp]# rm attrtest <==尝试删除看看
rm: remove regular empty file `attrtest'? y
rm: cannot remove `attrtest': Operation not permitted
# 看到了吗?呼呼!连 root 也没有办法将这个文件删除呢!赶紧解除设置!
范例:请将该文件的 i 属性取消!
[root@study tmp]# chattr -i attrtest
- lsattr(显示文件隐藏属性)
[root@study ~]# lsattr [-adR] 文件或目录
选项与参数:
-a :将隐藏文件的属性也秀出来;
-d :如果接的是目录,仅列出目录本身的属性而非目录内的文件名;
-R :连同子目录的数据也一并列出来!
[root@study tmp]# chattr +aiS attrtest
[root@study tmp]# lsattr attrtest
--S-ia---------- attrtest
使用chattr设置后,可以利用lsattr来查阅隐藏的属性。不过,这两个指令在使用上必须要 特别小心,否则会造成很大的困扰。例如:某天你心情好,突然将/etc/shadow这个重要的密 码记录文件给他设置成为具有i的属性,那么过了若干天之后,你突然要新增使用者,却一 直无法新增!别怀疑,赶快去将i的属性拿掉吧!
文件特殊权限:SUID,SGID,SBIT
1,SUID:
当s这个标志出现在文件拥有者的x权限上时,例如/usr/bin/passwd这个文件的权限状态:“-rwsr-xr-x”,此时就被称为Set UID,简称为SUID的特殊权限。
SUID的特殊功能与限制:
- SUID权限仅对二进制程序(binary program)有效;
- 执行者对于该程序需要具有x的可执行权限;
- 本权限仅在执行该程序的过程中有效(run-time);
- 执行者将具有该程序拥有者(owner)的权限
例如:
我们的Linux系统中,所有帐号的密码都记录在/etc/shadow这个文件里面,这个文件的权限 为:“---------- 1 root root”,意思是这个文件仅有root可读且仅有root可以强制写入而已。既然这个文件仅有root可以修改,那么我的v01cano这个一般帐号使用者能否自行修改自己的密码呢?你可以使用你自己的帐号输入“passwd”这个指令来看看,嘿嘿!一般使用者当然可以 修改自己的密码了!明明/etc/shadow就不能让v01cano这个一般帐户去存取的,为什么 v01cano还能够修改这个文件内的密码呢?这就是 SUID的功能。
- v01cano对于/usr/bin/passwd这个程序来说是具有x权限的,表示v01cano能执行 passwd;
- passwd的拥有者是root这个帐号;
- v01cano执行passwd的过程中,会“暂时”获得root的权限;
- /etc/shadow就可以被v01cano所执行的passwd所修改。
2,SGID
当s标志在文件拥有者的x项目为SUID,那s在群组的x时则称为Set GID, SGID。举例来说,你可以用下面的指令来观察到具有SGID权限的文件。
[root@study ~]# ls -l /usr/bin/locate
-rwx--s--x. 1 root slocate 40496 Jun 10 2014 /usr/bin/locate
与SUID不同的是,SGID可以针对文件或目录来设置!如果是对文件来说,SGID有如下的 功能:
- SGID对二进制程序有用;
- 程序执行者对于该程序来说,需具备x的权限;
- 执行者在执行的过程中将会获得该程序群组的支持!
举例来说,上面的/usr/bin/locate这个程序可以去搜寻/var/lib/mlocate/mlocate.db这个文件的内容mlocate.db的权限如下:
[root@study ~]# ll /usr/bin/locate /var/lib/mlocate/mlocate.db
-rwx--s--x. 1 root slocate 40496 Jun 10 2014 /usr/bin/locate
-rw-r-----. 1 root slocate 2349055 Jun 15 03:44 /var/lib/mlocate/mlocate.db
与SUID非常的类似,若我使用v01cano这个帐号去执行locate时,那v01cano将会取得 slocate群组的支持,因此就能够去读取mlocate.db啦!
除了binary program之外,事实上SGID也能够用在目录上,这也是非常常见的一种用途! 当一个目录设置了SGID的权限后,他将具有如下的功能:
- 使用者若对于此目录具有r与x的权限时,该使用者能够进入此目录;
- 使用者在此目录下的有效群组(effective group)将会变成该目录的群组;
- 用途:若使用者在此目录下具有w的权限(可以新建文件),则使用者所创建的新文件,该新文件的群组与此目录的群组相同。
3,Sticky Bit
这个Sticky Bit, SBIT目前只针对目录有效,对于文件已经没有效果了。SBIT对于目录的作用 是:
- 当使用者对于此目录具有w, x权限,亦即具有写入的权限时;
- 当使用者在该目录下创建文件或目录时,仅有自己与root才有权力删除该文件
简单的说:当甲这个使用者于A目录是具有群组或其他人的身份,并且拥有该目录w的权 限,这表示“甲使用者对该目录内任何人创建的目录或文件均可进行"删除/更名/搬移"等动 作。”不过,如果将A目录加上了SBIT的权限项目时,则甲只能够针对自己创建的文件或目 录进行删除/更名/移动等动作,而无法删除他人的文件。
举例来说,我们的 /tmp 本身的权限是“drwxrwxrwt”, 在这样的权限内容下,任何人都可以在 /tmp 内新增、修改文件,但仅有该文件/目录创建者与 root 能够删除自己的目录或文件。这个 特性也是挺重要的啊!你可以这样做个简单的测试:
- 以 root 登陆系统,并且进入 /tmp 当中;
- touch test,并且更改 test 权限成为 777 ;
- 以一般使用者登陆,并进入 /tmp;
- 尝试删除 test 这个文件!
4,SUID/SGID/SBIT权限设置
前面你应该已经知道数字体态更改权限的方式 为“三个数字”的组合,那么如果在这三个数字之前再加上一个数字的话,最前面的那个数字 就代表这几个权限了!
- 4为SUID
- 2为SGID
- 1为SBIT
假设要将一个文件权限改为“-rwsr-xr-x”时,由于s在使用者权限中,所以是SUID,因此, 在原先的755之前还要加上4,也就是:“chmod 4755 filename”来设置!此外,还有大S 与大T的产生喔!参考下面的范例啦!
下面的范例只是练习而已,所以使用同一个文件来设置,你必须了解SUID 不是用在目录上,而SBIT不是用在文件上的喔!
[root@study ~]# cd /tmp
[root@study tmp]# touch test <==创建一个测试用空档
[root@study tmp]# chmod 4755 test; ls -l test <==加入具有SUID的权限
-rwsr-xr-x 1 root root 0 Jun 16 02:53 test
[root@study tmp]# chmod 6755 test; ls -l test<==加入具有SUID/SGID的权限
-rwsr-sr-x 1 root root 0 Jun 16 02:53 test
[root@study tmp]# chmod 1755 test; ls -l test <==加入SBIT的功能!
-rwxr-xr-t 1 root root 0 Jun 16 02:53 test
[root@study tmp]# chmod 7666 test; ls -l test <==具有空的SUID/SGID权限
-rwSrwSrwT 1 root root 0 Jun 16 02:53 test
最后一个例子就要特别小心!怎么会出现大写的S与T呢?不都是小写的吗?因为s与t 都是取代x这个权限的,但是你有没有发现阿,我们是下达7666喔!也就是说,user, group以及others都没有x这个可执行的标志(因为666嘛),所以,这个S,T代表的就 是“空的”啦!怎么说?SUID是表示“该文件在执行的时候,具有文件拥有者的权限”,但是文 件拥有者都无法执行了,哪里来的权限给其他人使用?当然就是空的啦!
而除了数字法之外,你也可以通过符号法来处理喔!其中SUID为u+s,而SGID为g+s, SBIT则是o+t啰!来看看如下的范例:
# 设置权限成为 -rws--x--x 的模样:
[root@study tmp]# chmod u=rwxs,go=x test; ls -l test
-rws--x--x 1 root root 0 Jun 16 02:53 test
#承上,加上SGID与SBIT在上述的文件权限中!
[root@study tmp]# chmod g+s,o+t test; ls -l test
-rws--s--t 1 root root 0 Jun 16 02:53 test