linux中的sticky bit

  • 今天看到有个目录的权限是rwxrwxrwt 很惊讶这个t是什么,怎么不是x或者-呢?搜了下发现:

这个t代表是所谓的sticky bit。

  • sticky bit: 该位可以理解为防删除位. 一个文件是否可以被某用户删除, 主要取决于该文件所属的组是否对该用户具有写权限. 如果没有写权限, 则这个目录下的所有文件都不能被删除, 同时也不能添加新的文件. 如果希望用户能够添加文件但同时不能删除文件, 则可以对文件使用sticky bit位. 设置该位后, 就算用户对目录具有写权限, 也不能删除该文件.

要删除一个文件,你不一定要有这个文件的写权限,但你一定要有这个文件的上级目录的写权限。也就是说,你即使没有一个文件的写权限,但你有这个文件的上级目录的写权限,你也可以把这个文件给删除,而如果没有一个目录的写权限,也就不能在这个目录下创建文件。

如何才能使一个目录既可以让任何用户写入文件,又不让用户删除这个目录下他人的文件,sticky就是能起到这个作用。stciky一般只用在目录上,用在文件上起不到什么作用。

在一个目录上设了sticky位后,(如/home,权限为1777)所有的用户都可以在这个目录下创建文件,但只能删除自己创建的文件(root除外),这就对所有用户能写的目录下的用户文件启到了保护的作用。

可以通过chmod o+t tmp 来设置tmp目录的sticky bit,而且/tmp目录默认是设置了这个位的

stick bit一般是用于目录上的,用于文件意义不大

那么原来的执行标志x到哪里去了呢? 系统是这样规定的, 如果本来在该位上有x, 则这些特殊标志显示为小写字母 (s, s, t). 否则, 显示为大写字母 (S, S, T)

总结如下:如果某个目录设置了sticky bit(是在other用户的权限上设置的,设置后可执行位从x变成了t),那么用户在该目录下可以创建文件(当然前提是用户具有写权限和可执行权限,如 果具有可执行权限,设置sticky bit后是t;如果没有可执行权限的话,设置sticky bit后是T),而且可以删除自己创建的文件,但是,不能删除其他用户创建的文件,这样就起到了一种保护作用了。

The most common use of the sticky bit is on directories residing within filesystems for Unix-like operating systems. When a directory‘s sticky bit is set, the filesystem treats the files in such directories in a special way so only the file‘s owner, the directory‘s owner, or root can rename or delete the file. Without the sticky bit set, any user with write and execute permissions for the directory can rename or delete contained files, regardless of the file‘s owner. Typically, this is set on the /tmp directory to prevent ordinary users from deleting or moving other users‘ files. This feature was introduced in 4.3BSD in 1986, and today it is found in most modern Unix-like systems.

可以参考如下文章:

众所周知,Linux的文件权限如: 777;666等,其实只要在相应的文件上加上UID的权限,就可以用到加权限人的身份去运行这个文件。所以我们只需要将bash复制出来到另一个地方, 然后用root加上UID权限,只要用户运行此Shell就可以用用root的身份来执行任何文件了

一个文件都有一个所有者, 表示该文件是谁创建的. 同时, 该文件还有一个组编号, 表示该文件所属的组, 一般为文件所有者所属的组.

如果是一个可执行文件, 那么在执行时, 一般该文件只拥有调用该文件的用户具有的权限. 而setuid, setgid 可以来改变这种设置.

setuid: 设置使文件在执行阶段具有文件所有者的权限. 典型的文件是 /usr/bin/passwd. 如果一般用户执行该文件, 则在执行过程中, 该文件可以获得root权限, 从而可以更改用户的密码.

setgid: 该权限只对目录有效. 目录被设置该位后, 任何用户在此目录下创建的文件都具有和该目录所属的组相同的组.

sticky bit: 该位可以理解为防删除位. 一个文件是否可以被某用户删除, 主要取决于该文件所属的组是否对该用户具有写权限. 如果没有写权限, 则这个目录下的所有文件都不能被删除, 同时也不能添加新的文件. 如果希望用户能够添加文件但同时不能删除文件, 则可以对文件使用sticky bit位. 设置该位后, 就算用户对目录具有写权限, 也不能删除该文件.

下面说一下如何操作这些标志:

操作这些标志与操作文件权限的命令是一样的, 都是 chmod. 有两种方法来操作,

1) chmod u+s temp -- 为temp文件加上setuid标志. (setuid 只对文件有效)

chmod g+s tempdir -- 为tempdir目录加上setgid标志 (setgid 只对目录有效)

chmod o+t temp -- 为temp目录加上sticky标志 (sticky一般只用于目录)

2) 采用八进制方式. 对一般文件通过三组八进制数字来置标志, 如 666, 777, 644等. 如果设置这些特殊标志, 则在这组数字之外外加一组八进制数字. 如 4666, 2777等. 这一组八进制数字三位的意义如下,

abc

a - setuid位, 如果该位为1, 则表示设置setuid

b - setgid位, 如果该位为1, 则表示设置setgid

c - sticky位, 如果该位为1, 则表示设置sticky

设置完这些标志后, 可以用 ls -l 来查看. 如果有这些标志, 则会在原来的执行标志位置上显示. 如

rwsrw-r-- 表示有setuid标志

rwxrwsrw- 表示有setgid标志

rwxrw-rwt 表示有sticky标志

那么原来的执行标志x到哪里去了呢? 系统是这样规定的, 如果本来在该位上有x, 则这些特殊标志显示为小写字母 (s, s, t). 否则, 显示为大写字母 (S, S, T)

  • linux目录读权限、执行权限和写权限

今天看APUE时说目录的读权限和执行权限是不同的,以前没怎么注意过,今天研究了下。

  • 当用户对某个目录只有读权限时,那么该用户可以列出该目录下的文件列表(即可以使用ll来列出目录下的文件),但是不能进入该目录(即不能cd 目录名 来进入该目录),即如果该目录是用户访问路径的某个组成部分的话,到这里是访问不了的。
  • 当用户对某个目录只有执行权限时,该用户是可以进入该目录的(即可以通过cd 目录名 来进入该目录),因为一个用户要想进入一个目录,就必须具有可执行权限才可以。但该用户是不能列出这个目录下的文件列表的(即不能使用ll等命令列出该目录下的信息)
  • 当用户具有写权限时,用户可以在当前目录增加或者删除文件,但需要几个前提:1、需要有可执行权限2、要想删除文件,那么sticky bit位是没有设置的

总结下下面的几种情况:

rwx===可以进入该目录(x)、可以列出该目录中的文件(r)、可以在该目录中增加或者删除文件(w和x)

rwt===可以进入该目录,可以列出该目录中的文件,可以在该目录中增加文件,但不能删除其他用户的文件,自己的文件可以删除

rw-===可以列出该目录中的文件列表,但无法进入该目录(因为不具有可执行权限)同时也无法在目录中增加或者删除文件,因为如果要想在一个目录中增加或者删除文件必须要求具有写权限和可执行权限才可以。估计这样的权限列表不太常见

r-x===这种权限列表很常见。可以进入该目录,可以列出该目录中文件列表,但不可以在该目录中增加或者删除文件

-wx==这种估计也不常见。可以进入该目录,可以在该目录中增加或者删除文件,但不可以列出该目录中的文件列表

其他的情况例如r--、-w-、--r、---等就很容易分析了。

时间: 2024-10-27 07:59:30

linux中的sticky bit的相关文章

Linux中的默认权限与隐藏权限(文件、目录)

一个文件(或目录)拥有若干个属性,包括(r/w/x)等基本属性,以及是否为目录(d)与文件(-)或连接文件(l)等属性.此外,Linux还可以设置其他系统安全属性,使用chattr来设置,以lsattr来查看,最重要的是可以设置其不可修改的特性,即便是文件的拥有者都不能进行修改.这个属性相当重要,尤其是在安全机制方面(security). 文件默认权限:umask 当建立一个新的文件或目录时,它的默认属性是与umask有关的.通常,umask就是指定当前用户在建立文件或目录时的属性默认值.那么,

Linux中的特殊权限

什么是特殊权限: 在Linux中,常用的权限有:读.写.执行:这3个权限可以在大多数情况下保证数据的安全并满足我们的使用,但是在某些特殊情况下,我们必须用到一些特殊权限来完成某些工作,例如常用的修改密码命令"passwd":普通用户可以使用passwd命令来修改自己的密码,但是passwd程序并没有给other用户执行权限,为什么普通用户可以执行呢?这就是特殊权限的作用,只需要给passwd程序加上SUID权限,其他的用户就可以以程序的属主权限进行执行:也就是说一个普通用户以root管

Android系统篇之----Android中的run-as命令引出升降权限的安全问题(Linux中的setuid和setgid)

一.前言 最近一周比较忙,没时间写东西了,今天继续开始我们今天的话题:run-as命令,在上周的开发中,遇到一个问题,就是在使用run-as命令的时候出现了一个错误,不过当时因为工作进度的问题,这问题就搁浅没有解决,用了其他一个曲线救国的方式去解决的.那么咋们今天闲来说说Android中的run-as命令吧. 二.遇到的问题&解决问题 Android中我们知道如果设备没有root,我们想看一个应用的沙盒数据(/data/data/目录内容),在以前的方式很难办到,一般人都是选择root之后,去查

Linux中find命令用法全汇总,看完就没有不会用的!

Linux 查找命令是Linux系统中最重要和最常用的命令之一.查找用于根据与参数匹配的文件指定的条件来搜索和查找文件和目录列表的命令.查找可以在各种条件下使用,您可以通过权限,用户,组,文件类型,日期,大小等可能的条件查找文件.         通过这篇文章,我们以实例的形式分享我们的日常Linux查找命令体验及其用法.在本文中,我们将向您展示Linux中最常用的35查找命令示例.我们将该部分分为五个部分,从基本到提前使用find命令. 第一部分:查找名称查找文件的基本查找命令 第二部分:根据

Linux中文件权限、用户和用户组管理

1.文件权限 2.文件和目录rwx权限说明 文件rwx权限: r  :  可读,具有读取文件内容的权限(),如果没有r,vi/vim编辑器提示无法编辑(可强制编辑),echo可以追加或重定向. w :  可写,具有修改文件内容的权限 x  :  可执行,具有执行文件的权限. 需满足:文件本身具有可执行权限:普通用户还需具有r权限:root用户只要x权限就可执行.linux中可执行文件:*.sh     *.py     *.perl等等. 目录rwx权限: r  :  可读,查看目录下面文件及子

linux中常用时间和字符串之间相互转化

在Linux中经常会遇到时间和字符串相互转化的情形,有两个函数专门对应相应的转化. 1.时间转字符串函数strftime 函数原型:size_t strftime(char *s,size_t maxsize,char *format,conststruct tm *timeptr) strftime函数对timeptr指向的tm结构所代表的时间和日期进行格式编排,其结果放在字符串s中.该字符串的长度被设置为(最少)maxsize个字符.格式字符串format用来对写入字符串的字符进行控制,它包

详解 linux中的grub

grub是什么: grub是引导操作系统的程序,它会根据自己的配置文件,去引导内核,当内核被加载到内存以后, 内核会根据grub配置文件中的配置,找到根分区所使用的文件系统对应的驱动,通过根分区文件系统 对应的驱动,挂载根分区,从而达到启动操作系统的目的. 在了解grub以前,请先大体上了解一下centos5/6的启动过程,然后再理解grub就更容易了, 还记的我们以前总结过的centos5系统启动流程吗,如下图,此处我们重点讨论下图红框中的步骤. centos5/6中使用grub作为bootl

Linux中的crontab命令用法

Crontab 在linux中,crontab的用来设置定期执行指定的命令,我们可以用它来指定一些需要重复的事情,Linux系统的用户只需将想要定期要执行的命令序列加到crontab文件中,操作系统即会按用户配置的时间执行这些命令序列.向crontab文件里添加指令之前,需要检查下crontab服务是否已启动和是否开机自动启动: [查看状态] Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的 可以使用service crond status进行查看状态,下图是我在ce

centos linux中怎么查看和修改计算机名/etc/sysconfig/network

centos linux中怎么查看和修改计算机名 查看计算机名:在终端输入hostname 修改的话 hostname +计算机名(重启后失效)要永久修改的话要修改配置文件/etc/sysconfig/network修改hostname=你要改的名字