四、文件与目录的默认权限和隐藏权限

1.文件默认权限:umask

当建立一个新的文件或目录的时候,它的默认权限跟umask有关,umask就是指定“目前用户在监理文件或目录时候的权限默认值”,那么如何得知或者设定umask呢?

[root@study ~]# umask

0022             <==与一般权限有关的是后面三个数字

[root@study ~]# umask -S

u=rwx,g=rx,o=rx

查询的方式有两种,如上所示。一是直接输入umask,然后显示出数字形态的权限设定。一种是加入-S,就会以符号类型的方式显示出权限。

预设情况如下:

(1)若用户建立为“文件”,则预设没有可执行权限,亦只有rw两个权限,所以最大为666,即-rw-rw-rw-。

(2)若用户建立为“目录”,由于x与是否可以进入该目录有关,所以所有权限均开放,即为777,预设权限如下:drwxrwxrwx。

要注意的是,umask指的是该默认值需要减掉的权限。我们举例umask值为022,那么用户建立文件和目录时权限如下:

预设权限实际权限
建立文件-rw-rw-rw-(666)-rw-r–r–
建立目录drwxrwxrwx(777)drwxr-xr-x

如果想要修改umask的值,只需要执行下面的语句即可:

umask xxx

例如我想要给新建的文件同用户组用户都可以编辑的时候,那么我们就不能拿掉group里面的w权限,所以我们需要设计umask为002(包括但不限于这个,只需要拿掉group中的w即可)。

umask 002

2.文件隐藏属性chattr, lsattr

(1)chattr

注意:chattr指令只能在Ext2/Ext3/Ext4 Linux 传统文件系统上面完整生效,其他的文件系统可能就无法完整的支持这个指令。

[root@study ~]# chattr [+-=][ASacdistu] 文件或目录名称

选项与参数:

+:增加某一个特殊参数,其他原本存在参数则不动。

-:移除某一个特殊参数,其他原本存在参数则不动。

=:设定一定,且仅有后面接的参数。

A:当设定了A这个属性时,若你有存取此文件(或目录)时,他的访问时间atime将不会被修改,可避免I/O较慢的机器过度的存取磁盘。(目前建议使用文件系统挂载参数处理这个项目)

S:一般文件是异步写入磁盘的(原理请参考前一章sync的说明),如果加上S这个属性时,当你进行任何文件的修改,该更动会『同步』写入磁盘中。

a:当设定a之后,这个文件将只能增加数据,而不能删除也不能修改数据,只root才能设定这属性

c:这个属性设定之后,将会自动的将此文件『压缩』,在读取的时候将会自动解压缩,但是在储存的时候,将会先进行压缩后再储存(看来对于大文件似乎蛮有用的!)

d:当dump程序被执行的时候,设定d属性将可使该文件(或目录)不会被dump备份。

i:这个i可就很厉害了!他可以让一个文件『不能被删除、改名、设置连接也无法写入或新增数据!』对于系统安全性有相当大的帮助!只有 root 能设定此属性。

s:当文件设定了s属性时,如果这个文件被删除,他将会被完全的移除出这个硬盘空间,所以如果误删了,完全无法救回来了喔!

u:与s相反的,当使用u来配置文件案时,如果该文件被删除了,则数据内容其实还存在磁盘中,可以使用来救援该文件喔!

注意:

(1)属性设定常见的是a与i的设定值,而且很多设定值必须要身为root才能设定。

(2)xfs文件系统仅支援 AadiS而已。

这个指令非常重要,特别是在系统的数据安全上面。由于这些属性都是隐藏的属性,所以需要使用下面的lsattr才能看到这个属性。

另外,如果是log file这种登录文件,就更需要+a这个属性,它可以增加,但不能修改或者删除旧的数据,非常适合log file。

(2)lsattr

[root@study ~]# lsattr [-adR] 文件或目录

选项与参数:

-a :将隐藏文件的属性也展示出来;

-d :如果接的是目录,仅列出目录本身的属性而非目录内的文件名;

-R :连同子目录的数据也一并列出来!

 

如图4.1所示,第一行新建了一个名为attrtest的文件,第二行展示其隐藏属性(使用lsattr),看到其并没有设置chattr能够设置的属性,然后给其设置一个i属性(无法新增、修改、删除),然后执行一下删除操作,发现就连root用户都无法删除,这个时候使用lsattr查看下其隐藏属性,发现确实为i。最后删除其i属性,然后再次利用lsattr查看其属性,发现已经没有了i属性,并且可以被成功删除。

使用这两个指令要特别小心,否则可能会出现很大的困扰。

图4.4 chattr和lsattr演示

(3)文件特殊权限:SUID, SGID, SBIT

我们在terminal中执行ls -l /会发现有两个文件夹会有下面的结果:

drwxrwxrwt. 14 root root 4096 Jun 16 01:27 /tmp

-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd

这个s和t就是SUID/SGID的东西。

Set UID简称SUID,它有这样的功能:

①SUID 权限仅对二进制程序(binary program)有效;

②用户对于该程序需要具有x的可执行权限

③本权限仅在执行该程序的过程中有效 (run-time);

④用户将具有该程序拥有者(owner)的权限。

Set GID简称SGID。与SUID不同,SGID是针对文件或目录来设置的。SGID有如下功能:

①SGID对二进制程序有用;

②程序用户对于该程序来说,需具备x的权限

③用户在执行的过程中将会获得该程序用户组的支持。

SGID用在目录上的时候,它具有以下功能:

①用户若对于此目录具有r与x的权限时,该用户能够进入此目录;

②用户在此目录下的有效群组(effective group)将会变成该目录的群组;

③用途:若用户在此目录下具有 w 的权限(可以新建文件),则用户所创建的新文件的用户组与此目录的用户组相同。

Sticky Bit,简称SBIT,目前只针对目录有效。它对于目录的作用是:当用户在该目录下建立文件或目录时,仅有自己与root才有权力删除该文件

(4)SUID/SGID/SBIT权限设定

SUID为4,SGID为2,SBIT为1。设定的时候,数字在RWX数字之前

特别要说一个例子,如下所示:

[root@study tmp]# chmod 7666 test; ls -l test <==空的SUID/SGID权限-rwSrwSrwT 1 root root 0 Jun 16 02:53 test

原因:

因为s与t都是取代x这个权限的,但是我们下达的是7666。也就是说,user/group/others都没有x这个可执行的标志。所以,这个S和T代表的就是“空”。

除了数字表示法,也可以用符号法来处理。SUID是u+s,SGID是g+s,SBIT是o+t。

(5)查看文件类型:file

如果想知道某个文件的基本数据,例如它是ASCII、data,还是binary文件,且其中有没有使用到动态函数库等信息,就可以利用file命令来查看。例如图4.5所示。

图4.5 file查看举例

五、命令与文件的查询

我们常常需要知道那个文件放在哪里,才能够对该文件进行一些修改或维护等动作。有些时候某些软件配置文件的文件名是不变的,但是各分发版本放置的目录则不同。此时我们就需要利用一些搜索命令将该配置文件的完整文件名找到,这样才能进行修改。

1.脚本文件的文件名查询

我们知道在终端模式当中,连续输入两次[tab]按键就能够知道用户有多少命令可以下达。但是我们不知道这些命令的完整文件名放在哪里。这个时候,我们就可以通过which或type来寻找。

(1)which(寻找“执行文件”)

[root@study ~]# which [-a] command

选项或参数:

-a :将所有由 PATH 目录中可以找到的命令均列出,而不止第一个被找到的命令名称。

如图5.1所示的举例。

图5.1 which举例

注意,这个命令是根据“PATH”这个环境变领所规范的路径去搜索“执行文件”的文件名

(2)type

type将在后续来讲,在此就不说了。

2.文件名的查找

通常来说,find命令不常用,因为速度很慢。一般常用的是whereis和locate,前者是只找系统中某些目录底下的文件,而后者是利用数据库来搜索文件名

(1)whereis

[root@study ~]# whereis [-bmsu] 文件或目录名

选项与参数:

参数功能参数功能
-l列出whereis会去查询的几个主要目录-b只找二进制格式的文件
-m只找在说明文件manual路径下的文件-s只找source来源文件
-u搜索不在上述项目当中的其他特殊文件

如图5.2所示,第一个例子是找出ifconfig这个文件名,第二个例子是找出跟passwd的文件名,第三个例子是在man page中找到passwd的文件名。

 

图5.2 whereis演示

whereis只是查询/bin/sbin、/usr/share/man下的man page文件等几个比较特定的目录。具体想知道whereis查了多少目录,可以使用whereis -l来确认。

(2)locate/updatedb

[root@study ~]# locate [-ir] keyword

选项与参数:

-i:忽略大小写的差异;

-c:不输出文件名,仅计算找到的文件数量

-l:仅输出几行的意思,例如输出五行则是 -l 5

-S:输出locate所使用的数据库文件的相关信息,包括该数据库记录的文件/目录数量等

-r:后面可接正规表示法的显示方式

我们要记住无论是whereis还是locate都是有局限性的。whereis只能在所能够检索的目录下检索文件,所以目录之外的文件搜索不到;而locate只能在建立的数据库中查找(数据库在/var/lib/mlocate),而这个数据库并不是实时更新,是定期更新,所以有可能刚建立的文件并不能搜索到。

解决locate的方法就是使用updatedb命令来手动更新数据库。使用方法非常简单,直接输入“updatedb”,然后回车即可。然后updatedb就会去读取/etc/updated.conf这个配置文件的设置,去搜索文件名,然后更新数据库。

如图5.3所示,是locate的演示。

图5.3 locate演示

(3)find

[root@study ~]# find [PATH] [option] [action]

选项与参数:

1.与时间有关的选项:共有-atime, -ctime与-mtime。我们以-mtime说明:

-mtime n :n为数字,意义为在n天之前的“一天之内”被更动过内容的文件;

-mtime +n :列出在n天之前(不含n天本身)被更动过内容的文件文件名;

-mtime -n :列出在n天之内(n天本身)被更动过内容的文件文件名。

-newer file :file 为一个存在的文件,列出比file还要新的文件文件名

2. 与用户或组名有关的参数:

-uid n:n为数字,这个数字是用户的账号ID,亦即UID,这个UID是记录在/etc/passwd 里面与账号名称对应的数字。

-gid n:n为数字,这个数字是组名的ID,亦即GID,这个GID记录在/etc/group。

-user name:name为用户账号名称。

-group name:name 为组名。

-nouser:寻找文件的拥有者不存在于/etc/passwd的人。

-nogroup :寻找文件的用户组不存在于/etc/group的文件。

3. 与文件权限及名称有关的参数:

-name filename:搜寻文件名为filename的文件。

-size [+-]SIZE:搜寻比 SIZE 还要大(+)或小(-)的文件。(这个SIZE的规格有:c代表byte,k代表 1024bytes。所以,要找比50KB 还要大的文件,就是“-size +50k”。)

-type TYPE:搜寻文件的类型为TYPE的。(类型主要有:一般正规文件(f),设备文件(b, c),目录(d),连接文件(l),socket (s),及 FIFO(p)等属性。)

-perm mode:搜寻文件权限等于mode的文件,这个mode为类似 chmod的属性值。

-perm -mode:搜寻文件权限必须要全部包括mode的权限的文件。例如,我们要搜索0744的文件,使用“-perm -0744”。但是当一个文件的权限为4755时,也会被列出来,因为 -rwsr-xr-x 的属性已经囊括了 -rwxr–r– 的属性了。

-perm /mode:搜寻文件权限包含任一mode的权限的文件。例如,我们搜索-rwxr-xr-x,即-perm /755时,但一个文件属性为-rw——-也会被列出来,因为他有 -rw….的属性。

4. 额外可进行的动作:

-exec com:com为其他指令,-exec后面可再接额外的指令来处理搜索到的结果。

-print:将结果打印到屏幕上,这个操作是预设操作。

find的特殊功能就是能够进行额外的动作。我们将下面的例子以图解来说明。

find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \;

图5.4 解释说明

该例子中特殊的地方有{}以及\;还有-exec这个关键词,这些东西的意义为:

①{}代表的是find找到的内容,如上图所示,find的结果会被放置到{}位置中;

②-exec一直到\;是关键词,代表find额外动作的开始(-exec)到结束(\;),在这中间的就是find指令内的额外动作。在本例中就是ls-l{}

③因为;在bash环境下是有特殊意义的,因此利用反斜杠来转义。

六、权限与命令间的关系(非常重要)

1.让用户能进入某目录成为“可工作目录”的基本权限为:

(1)可使用的命令:例如cd等变换工作目录的命令;

(2)目录所需权限:用户对这个目录至少需要具有 x 的权限

(3)额外需求:如果用户想要在这个目录内利用ls查阅文件名,则用户对此目录还需要r的权限。

2.用户在某个目录内读取一个文件的基本权限是:

(1)可使用的命令:例如本章谈到的 cat, more, less等等

(2)目录所需权限:用户对这个目录至少需要具有x权限;

(3)文件所需权限:用户对文件至少需要具有 r 的权限才行

3.让用户可以修改一个文件的基本权限为何?

(1)可使用的命令:例如nano或未来要介绍的vi编辑器等;

(2)目录所需权限:用户在该文件所在的目录至少要有 x 权限;

(3)文件所需权限:用户对该文件至少要有r,w权限

4.让一个用户可以建立一个文件的基本权限为何?

目录所需权限:用户在该目录要具有wx的权限,重点在w

5.让用户进入某目录并执行该目录下的某个命令之基本权限为何?

(1)目录所需权限:用户在该目录至少要有x的权限;

(2)文件所需权限:用户在该文件至少需要有x的权限。