递归地修改权限
chmod -R
很多Linux命令可以递归地应用于文件和目录,chmod命令也不例外。使用-R(或–recursive)选项能够在短时间内修改数百个文件系统对象的权限。
$ pwd
/home/scott/pictures/libby$ ls -lF
drwxrw---- 2 scott scott ... by_pool/
-rw-r--r-- 1 scott scott ... libby_arrowrock.jpg
-rw-r--r-- 1 scott scott ... libby.jpg
drwxrw---- 2 scott scott ... on_floor/
$ ls -l *
-rw-r--r-- 1 scott scott ... libby_arrowrock.jpg
-rw-r--r-- 1 scott scott ... libby.jpgby_pool:
-rw-r--r-- 1 scott scott ... libby_by_pool_02.jpg
-rwxr-xr-x 2 scott scott ... lieberman_pool.jpgon_floor:
-rw-r--r-- 1 scott scott ... libby_on_floor_01.jpg
-rw-r--r-- 1 scott scott ... libby_on_floor_02.jpg
$ chgrp -R family *
$ chmod -R 660 *
chmod: 'by_pool': Permission denied
chmod: 'on_floor': Permission denied
如果文件是可执行的,那么它就可以作为程序来运行;但目录也必须是可执行的,才能允许用户访问其内部,读取它的文件和子目录。上面运行的chmod -R 660 *命令删除了所有内容(包括文件和目录)的x权限。当chmod命令报告它已经完成执行时,因为它不能读取目录中的内容(这些目录不再是可执行的),所以不能成功完成操作。
可以使用通配符来运行chmod命令,让它只修改特定类型的文件,如下所示:
$ chmod -R 660 *.jpg
这个命令修改的只是图像,而不是目录,所以不会有任何问题。但是如果文件类型不止一种,这样的操作不得不为每种文件都运行一次chmod命令。
如果子目录里面还有很多子目录,或者需要处理的文件太多,使用find命令会更好。用find命令先找出所有文件(不是目录),然后再修改它们的权限。
需要特别注意的是,当递归地修改权限时,一定要小心。或许你得到的结果并不是自己原来想要的,偶尔还会造成无法访问某些文件或子目录。
设置和清除suid
chmod u[±]s
主要介绍的是r、w和x。suid,它只适用于可执行文件,不能用于目录。
在设置suid以后,用户就可以使用拥有者的权限执行这个文件了,就好像是程序的拥有者在运行它一样。使用suid的一个常见例子是passwd命令的权限设置,这个命令可以让用户设置和修改他们的密码。
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root ... /usr/bin/passwd
可以看到passwd设置了suid权限,因为在用户的x权限位置,现在有一个s权限。passwd的拥有者是root用户,但是有必要让普通用户也能运行这个命令,否则他们就不能修改自己的密码。为了让所有人都能执行passwd命令,需要为用户、组及系统的其他用户都设置x权限。将passwd设成suid root,这样所有人都能以root用户的权限运行这个命令。
说明:或许你已经看到用s或S都可以表示设置了suid。在设置suid之前,如果拥有者已经具有执行权限(x),就会看到s;而S则表示在设置suid之前,拥有者没有执行的权限。最终的结果是一样的,但是字母的大小写能够告诉你最初的情形是什么样的。
有两种办法可以用于设置和取消suid,即字母表示法和数字表示法。字母表示法如下所示:
$ pwd
/home/scott/bin
$ ls -l
-rwxr-xr-- 1 scott admins ... backup_data
$ chmod u+s backup_data
$ ls -l
-rwsr-xr-- 1 scott admins ... backup_data
现在admins组的任何成员都能够运行backup_data脚本,好像他们就是用户scott一样。但是要注意,任何非admins组的成员都不能运行这个程序,因为他们只有程序的读权限。如果有必要让系统中的每个用户都能够作为scott来运行backup_data脚本,那么就应该把权限设置成-rwsr-xr-x。
使用u-来代替u+即可删除suid。
$ ls -l
-rwsr-xr-- 1 scott admins ... backup_data
$ chmod u-s backup_data
$ ls -l
-rwxr-xr-- 1 scott admins ... backup_data
使用八进制权限表示法设置suid要更复杂些,这是因为它在原来使用的数字权限表示法中引入了新的一位数字。回想一下,数字权限表示法使用了3个数字,第一个数字表示拥有者的权限,第二个表示组用户的权限,第三个则表示其他人的权限。其实在拥有者数字的左边还有第四个数字。只不过在绝大多数情况下,这个数字为0,所以没有必要显示或使用它。换句话说,chmod 644 libby.jpg和chmod 0644 libby.jpg是完全相同的。只有在修改suid(或sgid、sticky bit)时,才需要第四位数字。
要将suid的数字设置为4,可以按如下所示的方法来修改backup_data:
$ pwd
/home/scott/bin
$ ls -l
-rwxr-xr-- 1 scott admins ... backup_data
$ chmod 4754 backup_data
$ ls -l
-rwsr-xr-- 1 scott admins ... backup_data
要删除suid,只要将这一位数字设置为0,就能将权限设置回默认状态,不设置suid权限。
$ ls -l
-rwsr-xr-- 1 scott admins ... backup_data
$ chmod 0754 backup_data
$ ls -l
-rwxr-xr-- 1 scott admins ... backup_data
说明:作为普通用户,一般很少需要将程序的权限修改为suid。它的使用通常都与root用户拥有的程序有关,但是对此有所了解仍然是件好事情,以备在偶尔需要时能派上用场。