LINUX-文件的特殊属性

摘要:
② umask值的含义。umask值指的是“需要从Linux文件的默认属性中扣除的权限”。例如,Linux普通文件的最大默认属性为666,目录文件的最大属性为777。如果设置了SGID,二进制文件或目录组的x属性位将变为s。SBIT只能用于目录文件,对普通文件无效。请注意,在设置目录或二进制文件的特殊属性时,必须为这些目录或文件授予可执行权限。

chattr +a file1 只允许以追加方式读写文件 
chattr +c file1 允许这个文件能被内核自动压缩/解压 
chattr +d file1 在进行文件系统备份时,dump程序将忽略这个文件 
chattr +i file1 设置成不可变的文件,不能被删除、修改、重命名或者链接 
chattr +s file1 允许一个文件被安全地删除 
chattr +S file1 一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘 
chattr +u file1 若文件被删除,系统会允许你在以后恢复这个被删除的文件 
lsattr 显示特殊的属性 

=====================

Linux文件特殊属性
Linux文件特殊属性主要包括它的默认权限、隐藏属性和特殊权限(SUID/SGID/SBIT)。
下面我们就来分别讲解它的这些特殊属性。
 
1. Linux文件默认权限:umask
我们在新建立一个文件时,它都有自己的默认属性。它们的默认属性是通过“umask”值来设定的。
那么如何来查看和设置umask值呢?
① 查看umask值
0022
 
上面的命令显示出umask值的两种表现形式。我们看到数字表现出来的有4位数字,第一位数字用来表示特殊权限,我们在后面介绍,第二三四位数字分别用来表示用户/组/其他用户的权限。
在默认权限的属性上,目录文件和普通文件是不同的。因为我们不希望普通文件具有可执行权限,所以,普通文件在默认情况下是没有执行权限的。又因为目录文件需要具有可执行权限才可以进入,所以普通文件的默认属性最大为666,目录文件的默认属性最大为777。
 
② umask值的意义
umask值就是指“Linux文件的默认属性需要减掉的权限”。比如Linux普通文件的最大默认属性是666,目录文件的最大属性是777。但是我们不想要用户在新建立文件时,文件的属性是666或777,那么我们就要设置umask值。Linux系统预置的umask值是022,那么用户在新建立普通文件时,普通文件的属性就是666-022=644,新建立目录文件时,目录文件的属性就是777-022=755。
 
③ umask值设置
我们不想要新建立的普通文件的属性是644,目录文件的属性是755,我们想要新建立普通文件的属性是664,新建立目录文件的属性是775。那么我们就设置umask值为002即可。设置方法就是“umask 002”。
 
2. Linux文件隐藏属性
文件都具有隐藏属性,隐藏属性对于系统安全来说很重要。
① 设置文件隐藏属性
[root@localhost /]#chattr [-R] [-+=] [AacDdijsSu] 文件名
 
常用参数意义:
-R:递归处理。
-:删除某个隐藏属性,其他原本存在的属性不改变。
+:添加某个隐藏属性,其他原本存在的属性不改变。
=:将隐藏属性设置为指定的参数,其他原本存在的属性会被改掉。
A(atime):如果设置了A属性,则这个文件的最后访问时间atime不能被修改。
a(append only):如果设置了a属性,则这个文件只能增加数据,不允许任何进程覆盖或截断这个文件。如果某个目录具有这个属性,那么只能在这个目录下建立和修改文件,而不能删除任何文件。
i(immutable):如果设置了i属性,则不能对这个文件做任何修该。如果某个目录具有这个属性,那么只能修改该目录下的文件,而不能建立和删除文件。
s(secure deletion):如果设置了s属性,则这个文件将从硬盘空间中完全删除。
u(undeletable):与s完全相反。如果设置了u属性,则这个文件虽然被删除了,但是还在硬盘空间中存在,还可以用来还原恢复。
 
② 查看文件隐藏属性
文件既然有隐藏属性,那么我们如何查看这些文件的隐藏属性呢?
[root@localhost /]#lsattr [-RVadlv] 文件名
 
 
[root@localhost /]#lsattr –Ra CaiWu
 
3. Linux文件特殊权限
Linux文件特殊权限主要体现在set UID、set GID、Sticky Bit这三个上面。
要理解这三个特殊权限,就要先理解账号的ID(UID和GID)以及进程等概念。
① SUID
SUID就是Set UID。设置它是为了让普通用户在执行某些程序时,能够暂时具有该程序的拥有者权限。
比如:在Linux系统中普通用户也可以使用passwd命令来修改自己的密码。但是密码文件shadow只有root用户有读权限,其他用户没有任何权限,那么普通用户是怎样通过passwd命令来修改自己的密码呢?我们看下/usr/bin/passwd程序的属性就知道了。
[root@localhost /]# ll /usr/bin/passwd
-rwsr-xr-x 1 root root 22984 Jan 7 2007 /usr/bin/passwd
 
我们发现passwd程序user的x权限位变成了s。那么在这里就是这个s使普通用户有权限来执行这个程序。它让普通用户在执行passwd这个程序时暂时拥有了root的权限。
因此,当某程序user的x权限位变成s时,就是进行了Set UID设置,简称SUID。
SUID仅可用于二进制文件,对于其他普通文件,目录文件和脚本之类的文件是无效的。
 
② SGID
SGID就是Set GID。设置它用来作用于用户组。
如果将SGID设置在二进制文件上,则不论用户是谁,在执行该程序时,它的有效用户组将会变成改程序的用户组所有者;
如果将SGID设置在目录文件上,则在该目录文件内所建立的文件或目录的用户组,将会变成该目录的用户组。
SGID一般用于团队的项目开发上,在系统中很少使用。如果设置了SGID,那么该二进制文件或者目录group的x属性位将会变成s。
 
③ SBIT
SBIT就是Sticky Bit。如果在设置了SBit属性的目录中,用户在该目录下拥有w和x权限,那么当用户在该目录下新建文件时,只有文件拥有者和root才有权利删除。
比如:root在/目录下建立了一个文件夹test,test的权限是0777。在没有加特殊权限前,任何人都可以在test目录下做任何事,包括删除别人建立的文件。当我给test目录设置了SBit属性后,那么bobyuan这个用户在test下新建了一个文件bobtest, 属性是0777;bob这个用户进入test目录下试图删除bobtest,发现没有权限删除。
如果某个目录设置了SBit属性,那么该目录other的x属性位将会变成t。如【drwxrwxrwt】。
SBIT仅可用于目录文件对于普通文件是不生效的。
如果某个文件的user或者group或者other没有设置x属性,但是设置了SUID或者SGID或者GBIT,那么,这些特殊属性将会以大写的S和T表现出来。
 
④ 设置SUID/SGID/SBIT
我们用数字形式来表示这三个特殊属性,他们和r/w/x的数字表现形式类似。
SUID:4
SGID:2
SBIT:1
比如我要设置cat命令的SUID属性,那就可以用chmod 4755来实现。
比如我要设置test目录的SBIT属性,那就可以用chmod 1777来实现。
注意,在设置目录或者二进制文件的特殊属性时,一定要给予这些目录或者文件可执行权限。如果未给予可执行权限,即使设置了特殊属性,也将会是空的,会用大写的S和T表示。
      本文转自yuanbin0710 51CTO博客,原文链接:http://blog.51cto.com/yuanbin/114913,如需转载请自行联系原作者
****************************************************************
=================================================

chattr

    对于一些特殊的文件,为防止用户误操作,可以加特殊属性,示例如下:
    +i:锁定
            示例文件:
                    [root@centos76 data]#ll test.txt
                    -rw-r--r--. 1 root root 48 Mar 12 19:30 test.txt

            +i锁定文件
                    [root@centos76 data]#chattr +i test.txt

            查看文件属性,发现与之前一样
                    [root@centos76 data]#ll test.txt
                    -rw-r--r--. 1 root root 48 Mar 12 19:30 test.txt

            进行验证+i功能是否生效
            重定向内容:
                    [root@centos76 data]#echo 1111 > test.txt
                    ** -bash: test.txt: Permission denied **

            查看一下:
                    [root@centos76 data]#cat test.txt
                    abcdedf
                    abcdedf
                    abcdedf
                    fdedcba
                    fdedcba
                    fdedcba

            重命名:
                    [root@centos76 data]#mv test.txt haha.txt
                    **mv: cannot move ‘test.txt’ to ‘haha.txt’: Operation not permitted**

            删除文件:
                    [root@centos76 data]#rm -f test.txt
                    **mv: cannot remove ‘test.txt’: Operation not permitted**

    +a:只能追加
            示例文件:仍然采用上次测试的test.txt文件
                    [root@centos76 data]#chattr +a test.txt

            重定向内容:   
                    [root@centos76 data]#echo 222 > test.txt
                    **-bash: test.txt: Operation not permitted**

            重命名:   
                    [root@centos76 data]#mv test.txt haha.txt
                    **mv: cannot move ‘test.txt’ to ‘haha.txt’: Operation not permitted**

            删除:
                    [root@centos76 data]#rm -f test.txt
                    **mv: cannot remove ‘test.txt’: Operation not permitted**

            追加内容:
                    [root@centos76 data]#echo 222 >> test.txt
                    [root@centos76 data]#cat test.txt
                    abcdedf
                    abcdedf
                    abcdedf
                    fdedcba
                    fdedcba
                    fdedcba
                    222                

    +A:锁定atime的时间,减少读文件对磁盘IO的影响,以提高性能。
            [root@centos76 data]#chattr +a test.txt

            第一次读取,记录atime的时间
                    [root@centos76 data]#cat test.txt
                    333
                    444
                    555
                    [root@centos76 data]#stat test.txt
                      File: ‘test.txt’
                      Size: 12          Blocks: 8          IO Block: 4096   regular file
                    Device: 803h/2051d  Inode: 83          Links: 1
                    Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
                    Context: unconfined_u:object_r:etc_runtime_t:s0
                    **Access: 2019-03-18 11:12:50.425400248 +0800**
                    Modify: 2019-03-18 11:03:18.770446437 +0800
                    Change: 2019-03-18 11:12:42.139400918 +0800
                    Birth: -
            第二次读取,atime时间没有变化,如下:
                    [root@centos76 data]#cat test.txt
                    333
                    444
                    555
                    [root@centos76 data]#stat test.txt
                    File: ‘test.txt’
                    Size: 12            Blocks: 8          IO Block: 4096   regular file
                    Device: 803h/2051d  Inode: 83          Links: 1
                    Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
                    Context: unconfined_u:object_r:etc_runtime_t:s0
                    **Access: 2019-03-18 11:12:50.425400248 +0800**
                    Modify: 2019-03-18 11:03:18.770446437 +0800
                    Change: 2019-03-18 11:12:42.139400918 +0800

注意:不管是+i/a/A,都会锁定文件的atime时间

提示:由于rm -f做了别名设置,在使用此命令时,会提示mv操作

lsattr 可以查看chattr对应的属性

免责声明:文章转载自《LINUX-文件的特殊属性》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ubuntu Virtualbox菜单栏不见SSL certificate problem unable to get local issuer certificate解决办法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

如何从Linux系统中删除用户账户

在服务器上维护用户就是添加、修改以及删除用户。当一个用户出于某种原因不再需要登录系统时,我们需要删除此用户以避免安全漏洞。在Linux系统上,我们用userdel命令来删除一个用户。推荐学习Linux视频教程。userdel是什么userdel 是一个底层用于删除用户的工具。在 Debian 上,我们通常会使用 deluser 命令。userdel 会查询...

gcc 编译器参数

一、GCC编译过程 参考:http://hi.baidu.com/zengzhaonong/item/c00e079f500adccab625314f-------------------------------------    Pre-Processing   cpp        预处理    Compiling        ccl       ...

Linux多进程开发IV

1.共享内存。允许两个或多个进程共享物理内存的同一块区域(段)。 共享内存是进程用户空间的一部分,因此这种IPC机制需要更少的内核处理。一个进程将数据复制到共享内存中,那么这部分数据就会对其他所有共享同一个段的进程可用。 与管道等要求发送进程将数据从用户空间的缓冲区复制到内核内存和接收进程将数据从内核内存复制进用户空间的缓冲区的做法相比,这种IPC技术...

cent OS 7 安装谷歌浏览器

我直接写一个shell 脚本,  install_google.sh,  bash 命令直接运行就好, 脚本内容如下: (切换root用户执行) set -e  # 出错即退出 echo " [google-chrome]  name=google-chrome  baseurl=http://dl.google.com/linux/chrome/rpm/...

交叉编译工具链(详解)

交叉编译工具链  1、嵌入式开发模型-交叉开发     在嵌入式开发过程中有宿主机和目标机的角色之分:宿主机是执行编译、链接嵌入式软件的计算机;目标机是运行嵌入式软件的硬件平台。                在宿主机执行编译的流程如下:                   2、交叉编译工具链详解 参考: http://www.crifan.com/fi...

tools的作用

1、相对布局中这个包是从哪里来。tools:context=".MainActivity"? 这些tools 属性主要针对模拟器 调试时候显示状态,编译中不起作用。 AndroidStudio会根据xml文件实时的绘制我们的布局文件的样式,但是我们也可以在Acitivity中设置布局文件的样式,因此对于一个xml布局文件,我们要知道哪个Activity会修...