首页 > 代码库 > 权限管理与切换(二十一)

权限管理与切换(二十一)

权限管理与切换:sudo,id,chmod,chown,chgrp,setfacl,getfacl,umask


21.1.su

功能:变更用户身份(super user)

切换用户时:

切换用户时:

(1) 不读取目标用户的配置文件(非登录式切换,半切换);

su  USERNAME

(2) 读取目标用户的配置文件(登录式切换,完全切换);

su  -l  USERNAME

su  -  USERNAME

注意:root切换至任何其它用户无须认证密码;普通用户切换至其它用户,都需要密码;


21.2.sudo

功能说明:用来以其他用户来执行命令

常用选项:

-b:在后台执行指令; 

-h:显示帮助; 

-H:将HOME环境变量设为新身份的HOME环境变量; 

-k:结束密码的有效期限,也就是下次再执行sudo时便需要输入密码;。 

-l:列出目前用户可执行与无法执行的指令; 

-p:改变询问密码的提示符号; 

-s:执行指定的shell; 

-u<用户>:以指定的用户作为新的身份。若不加上此参数,则预设以root作为新的身份; 

-v:延长密码有效期限5分钟;  因为sudo在第一次执行时或是在N分钟内没有执行(N预设为5)会询问密码。这个参数是重新做一次确认,如果超过N分钟,也会问密码。

-V :显示版本信息。


21.3.chmod

功能:改变文件权限

这一命令有符号模式和绝对模式


符号模式:

语法:chmod [who] operator [permission] filename


who的含义是:


u 文件属主权限。

g 属组用户权限。

o 其他用户权限。

a 所有用户(文件属主、属组用户及其他用户)。


operator的含义:


+ 增加权限。

- 取消权限。

= 设定权限。


permission的含义:


r 读权限。

w 写权限。

x 执行权限。

s 文件属主和组set-ID。

t 粘性位*。

l 给文件加锁,使其他用户无法访问。

u,g,o 针对文件属主、属组用户及其他用户的操作。


示例:

[root@localhost scripts]# chmod a+x test.txt   #添加所有的执行权限
[root@localhost scripts]# ll test.txt
-rwxr-xr-x 1 root root 276 Jun 26 18:39 test.txt
[root@localhost scripts]# chmod a-x test.txt   #收回所有命令的执行权限
[root@localhost scripts]# ll test.txt
-rw-r--r-- 1 root root 276 Jun 26 18:39 test.txt
[root@localhost scripts]# chmod og-w test.txt  #收回属组用户和其他用户的写权限
[root@localhost scripts]# ll test.txt
-rw-r--r-- 1 root root 276 Jun 26 18:39 test.txt
[root@localhost scripts]# chmod g+w test.txt #赋予属组用户写权限
[root@localhost scripts]# chmod u+x test.txt  #赋予文件属主执行权限
[root@localhost scripts]# chmod go+x test.txt  #赋予属组用户和其他用户执行权限

21.4.chown

功能:变更文件或目录的拥有者或所属群组。

语法:chomd -R -h owner file

常用选项:

 -c或--changes           效果类似"-v"参数,但仅回报更改的部分。

 -f或--quite或--silent  不显示错误信息。

 -h或--no-dereference  之对符号连接的文件作修改,而不更动其他任何相关文件。

 -R或--recursive  递归处理,将指定目录下的所有文件及子目录一并处理。

 -v或--version  显示指令执行过程。

 --dereference  效果和"-h"参数相同。

 --help  在线帮助。

 --reference=<参考文件或目录>  把指定文件或目录的拥有者与所属群组全部设成和参考文件或目 录的拥有者与所属群组相同。

示例:

[root@localhost scripts]# ll test.txt
-rwxrwxr-x 1 root root 276 Jun 26 18:39 test.txt
[root@localhost scripts]# chown user001 test.txt
[root@localhost scripts]# ll test.txt
-rwxrwxr-x 1 user001 root 276 Jun 26 18:39 test.txt

21.5.chgrp

功能:变更文件或目录的所属群组

语法:chgrp [-cfhRv][--help][--version][所属群组][文件或目录...]

常用选项:

 -c或--changes  效果类似"-v"参数,但仅回报更改的部分。

 -f或--quiet或--silent  不显示错误信息。

 -h或--no-dereference  只对符号连接的文件作修改,而不更动其他任何相关文件。

 -R或--recursive  递归处理,将指定目录下的所有文件及子目录一并处理。

  --reference=<参考文件或目录>

示例:

[root@localhost scripts]# ll test.txt
-rwxrwxr-x 1 user001 root 276 Jun 26 18:39 test.txt
[root@localhost scripts]# chgrp group1 test.txt
[root@localhost scripts]# ll test.txt
-rwxrwxr-x 1 user001 group1 276 Jun 26 18:39 test.txt

21.6.umask

功能:遮罩权限


root用户:

默认创建目录的权限:755

默认创建文件的权限:644

普通用户:

默认创建目录的权限:775

默认创建文件的权限:664

 

umask 查看当前用户的默认权限

root:

umask

0022

普通用户:

uamsk

0002

 

目录的最大权限:777

文件的最大权限:666

root:

目录的默认权限=0777-umask=0777-0022=0755

文件的默认权限=0666-umask=0666-0022=0644

普通用户:

目录的默认权限=0777-umask=0777-0002=0775

文件的默认权限=0666-umask=0666-0002=0664

 

更改用户的默认权限:

临时更改:

umask 0002 只在当前终端生效

永久生效:

 

vim ~/.bashrc  当前用户家目录里的文件(局部变量)

..

umask 0002

 

# source ~/.bashrc  立刻马上读取文件内容(让其马上生效)

# . ~/.bashrc

  

vim /etc/bashrc 针对所有用户(全局)

...

umask 0066

 

. ~/.bashrc


说明:

当局部变量和全局变量冲突,以局部为准


练习:

1、创建一个文件test,要求它实现user001只读,user002,user003可读可写,user004,user005可读可执行

[root@localhost scripts]# usermod -g group1  user002 
[root@localhost scripts]# usermod -g group1  user003
[root@localhost scripts]# id user002
uid=601(user002) gid=10015(group1) groups=10015(group1)
[root@localhost scripts]# id user003
uid=602(user003) gid=10015(group1) groups=10015(group1)
[root@localhost scripts]# touch test
[root@localhost scripts]# ll test
-rw-r--r-- 1 root root 78184 Jun 27 14:06 test
[root@localhost scripts]# chown user001:group1 test
[root@localhost scripts]# ll test
-rw-r--r-- 1 user001 group1 0 Jun 27 14:28 test
[root@localhost scripts]# chmod u-w,g+w,o+x test
[root@localhost scripts]# ll test
-r--rw-r-x 1 user001 group1 0 Jun 27 14:28 test

2.什么情况下才能删除一个文件或目录?

答:跟这个文件或目录本身的权限无关,跟你对它们的上一级目录是否有写权限有关。你对一个目录有写权限,你就可以删除这个目录里任何文件

 

3.请问下面的情况,我一个普通用户能否删除/test/abc/这个子目录

# ll -d /test
drwxr-xrwx. 3 root root 12288 Jul 16 17:42 /test
# ll /test
drwxr-xr-x. 2 root root 4096 Jul 16 17:40 abc
# ll /test/abc/
-rw-r--r--. 1 root root 0 Jul 16 17:40 1

答案:删除不了,因为如果abc是个空目录就可以,但因为删除不了abc下的1这个文件,所以造成abc也删除不了

 

4、什么情况下修改了一个文件才需要强制保存,什么情况下能够成功强制保存?

答案:如果你对一个文件没有写权限,那么修改后,要保存就会出现强制保存的选项;

     虽然你对这个文件没有写权限,但如果你对文件所在的上一级目录有写权限,则可以强制保存成功,并且保存后,把文件的owner和group属性改成了你自己

     如果对上一级目录没有写权限,则不可以强制保存;但也有一个例外,就是如果这个文件的owner就是你,那么你对它没有写权限,对它上级目录也没写权限,也可以强制保存成功


21.7.特殊权限(s,t)

s位叫特权位,英文的叫法有setuid,setgid,suid,sgid等


1)冒险位(setuid):4000 u+s 临时拥有文件拥有者的权限,作用在属主身上,一般针对命令。皇帝临时给一个用户一个尚方宝剑.只针对前三位

对目录可以加,但是无效,因为目录不是命令,根本不能执行它

demo:
# chmod u+s /usr/bin/vim
# ll /usr/bin/vim
-rwsr-xr-x. 1 root root 1967072 Feb 17  2012 /usr/bin/vim
# chmod 0766 /usr/bin/vim
[root@node1 Desktop]# ll /usr/bin/vim
-rwxrw-rw-. 1 root root 1967072 Feb 17  2012 /usr/bin/vim


小实验:

1,测试passwd命令的s位,去掉其s位,普通用户就不能自己改自己密码了,加上s位就可以了

 

2,/bin/touch这个命令是没有s位的,你可以尝试加上s位,然后用普通用户touch文件,观察效果。做完测试后,记得改回来也就是把s位去掉

 

3,普通用户能关机吗?怎么让普通用户关机

 

可以对关机命令加s位来让普通用户能关机,在rhel6下测试reboot,shutdown可以这样做,init不能这样做

这只是一个理论讨论,实际情况不会这么做的


 

2)强制位(setgid):2000 g+s 针对目录,任何人在该目录下创建的文件或目录强制继承父目录的属组。强制继承家族企业。中间三位

demo:
chmod g+s dir1
chmod 2755 dir1
测试验证
# ll -d
drwxr-sr-x. 5 u01 sysadmin 4096 Apr  6 11:24 .


3)粘制位 :1000 o+t 针对公共目录,在该目录下的文件只有root和文件的拥有者可以删除,其他人不能删除。自己管理自己

demo:
# chmod 1777 dir2
drwxrwxrwt. 2 root root     4096 Apr  6 10:33 dir2
 
# ll -d /tmp
drwxrwxrwt. 24 root root 4096 Apr  6 11:16 /tmp


s位和t位注意的地方:

 

用数字表示

 

前三位上加s        4

中间三位加s    2

后三位加t    1

 

chmod 1777 /tmp

 

s位和t位大小写的区别 

 

        小写的话就表示 有x执行权限

        大写的话就表示 没有x执行权限 


21.8.acl访问控制策略

setfacl:

-R:递归授权,对目录下已经存在的文件有acl策略,但是新建的文件没有acl策略

-d:递归授权,对目录下新建的文件有acl策略,老文件没有

-m:修改acl策略

-x:删除某个用户的权限

-b:删除所有的acl策略

-mask:设置除了其他人和拥有者以外的最大权限

 

下面我们再来继续看一个例子

假如现在我们设置test.sh的mask为read only,那么family组的用户还会有write 权限吗?

 

代码:

[root@zyq-server data]# setfacl -m mask::r test.sh
[root@zyq-server data]# getfacl -c test.sh
user::rwx
user:zyq:rwx                    #effective:r--
group::rw-                      #effective:r--
mask::r--
other::r--
 
demo1:
 
# setfacl -m u:u01:rw file1 
[root@node1 test]# ll
total 8
-rw-rw-r--+ 1 root root 6 Apr  6 11:41 file1
-rw-rw-r--. 1 root root 0 Apr  6 11:33 file2
[root@node1 test]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
user:u01:rw-
group::rw-
mask::rw-
other::r--
 
 
# setfacl -m g:sysadmin:rw file2
[root@node1 test]# getfacl file2
# file: file2
# owner: root
# group: root
user::rw-
group::rw-
group:sysadmin:rw-
mask::rw-
other::r--
 
# setfacl -m m::r file2
# getfacl file2
# file: file2
# owner: root
# group: root
user::rw-
group::rw-            #effective:r--
group:sysadmin:rw-        #effective:r--
mask::r--
other::r--

说明:

属于sysadmin组里的成员就只有r的权限,因为最大权限就是r 

[u01@node1 test]$ echo 777 >>file2
-bash: file2: Permission denied
 
# setfacl -R -m u:u01:rwx dir1
# setfacl -d -m g:sysadmin:rwx .
 
# setfacl -Rd -m u:april:rwx

21.9.隐藏属性

lsattr

chattr

 

# lsattr 1.txt

-------------e- 1.txt

 

# chattr +A 1.txt        --这个属性让文件的access time访问后也不会变化,节省了IO(IO优化);默认情况下rhel5,访问一次atime就会跟着变一次,rhel6下只有当atime等于或早于mtime和ctime之一时,才会访问跟着变,否则不会变。(原因我们在后面讲mount参数时再补充)

 

# lsattr 1.txt

-------A-----e- 1.txt   

 

# stat 1.txt |tail -3        --用cat命令访问这个文件,再用此命令查看access time,会发现不再变化

Access: 2014-07-17 11:12:58.589838878 +0800

Modify: 2014-07-17 11:12:58.589838878 +0800

Change: 2014-07-17 11:13:15.405701371 +0800

 

一个文件加了a属于,重定向覆盖以前的内容不允许,但追加内容是可以的

# lsattr 1.txt

-----a-------e- 1.txt

 

# echo 456 > 1.txt

bash: 1.txt: Operation not permitted

# echo 456 >> 1.txt       

 

# chattr -a 1.txt

# chattr +i 1.txt  --加了i属性,此文件不可被修改,重命名

 


练习一:

1、root用户新建目录/tmp/common,要求目录的所属组为tom

# mkdir /tmp/common

前提是有tom组

# chgrp tom /tmp/common/

或者

# chown .tom /tmp/common/

2、是否允许tom用户在/tmp/common下创建文件tomfile?如果不允许,怎么才能让它创建文件?

不允许,给属组一个w权限

chmod g+w /tmp/common

3、用户jack如果想修改tomfile文件,怎么做?

chmod o+w tomfile

或者

usermod -G tom jack

或者

gpasswd -a jack tom(组)

或者

setfacl -m u:jack:rw tomfile

 

练习二:

1、以普通用户user01身份登录,新建目录/shared/sysadmin,并且属于sysadmin组

# su - user01
$ mkdir /shared/sysadmin -p
# setfacl -m u:user01:rwx /
# chgrp sysadmin /shared/sysadmin

2、要求组成员有读写访问的权限,其他成员没有任何权限

[root@node1 home]# ll -d /shared/sysadmin/-x
drwxrwxr-x. 2 user01 sysadmin 4096 Apr  6 14:44 /shared/sysadmin/
[root@node1 home]# chmod o=--- /shared/sysadmin/
[root@node1 home]# ll -d /shared/sysadmin/

3、要求组成员不可以删除属于其他成员的文件

# ll -d /shared/sysadmin/
drwxrwx--T. 2 user01 sysadmin 4096 Apr  6 14:44 /shared/sysadmin/

4、要求在/shared/sysadmin下面创建的文件全部属于sysadmin组

# ll -d /shared/sysadmin/
drwxrws--T. 2 user01 sysadmin 4096 Apr  6 14:44 /shared/sysadmin/

5、要求harry可写,natash不能读写

# setfacl -m u:harry:rwx /shared/sysadmin/
# setfacl -m u:natash:--- /shared/sysadmin/

本文出自 “烂笔头” 博客,请务必保留此出处http://lanbitou.blog.51cto.com/9921494/1942486

权限管理与切换(二十一)