你可能不知道的一些linux文件权限管理方法

为什么需要权限管理?

1.计算机资源有限,我们需要合理的分配计算机资源。

2.Linux是一个多用户系统,对于每一个用户来说,个人隐私的保护是十分重要的

目录的 rwx 权限

当前用户:vagrant:vagrant

创建 testdir 目录,进入 testdir 目录内。创建文件 test。

$ mkdir testdir
$ cd testdir
$ touch test

修改 testdir 权限为 000,尝试执行 ls testdir

$ chmod 000 testdir
$ ls testdir/
ls: cannot open directory testdir/: Permission denied

修改 testdir 权限为 400,尝试执行 ls testdir

$ chmod 400 testdir
ls -l testdir/
ls: cannot access testdir/test: Permission denied
total 0
-????????? ? ? ? ? ? test

结果:能够读取目录下文件列表,但是看不到具体文件信息(权限、大小、用户组、时间等),尽管当前用户是 /testdir/test 的拥有者且具有 rwx 权限。

拥有目录的 r 权限可以读取目录下的文件列表。

继续,尝试进入 testdir 目录。

$ cd testdir/
-bash: cd: testdir/: Permission denied

看来 r 权限并不能让我们具有进入目录。

我们增加一个 x 权限试试。

~$ chmod 500 testdir/
~$ cd testdir/
~/testdir$ ls -l
total 0
-rw-rw-r-- 1 vagrant vagrant 0 Nov 19 08:16 test

成功进入。

拥有目录的 x 权限能够让我们进入到目录下。在此工作目录下,我们可以查看文件列表及文件的属性信息。

尝试删除 test 文件或者新建文件 test1。

~/testdir$ rm test
rm: cannot remove ‘test': Permission denied
~/testdir$ touch test1
touch: cannot touch ‘test1': Permission denied

拥有目录的 r x 权限并不能允许我们改变目录的内容。目录里的文件列表可以看做是目录的内容。

拥有目录的 w 权限可以对目录的内容进行增删。

~/testdir$ chmod 700 .
~/testdir$ rm test
~/testdir$ touch test1
~/testdir$ ls -l
total 0
-rw-rw-r-- 1 vagrant vagrant 0 Nov 19 08:30 test1

umask

在上面的例子里,我们创建的新文件的权限是 664(-rw-rw-r--),为什么默认权限会是 664,我如果想改变新文件的默认权限怎么办?

控制台输入 umask:

$ umask
0002

umask 是权限的补码。文件的默认权限是 666 - umask。

如果我们创建的文件不想让其他用户有 r 权限,则修改补码为 0006 即可。

~/testdir$ umask 0006
~/testdir$ touch test2
~/testdir$ ls -l | grep test2
-rw-rw---- 1 vagrant vagrant 0 Nov 19 08:38 test2

为什么文件的默认权限不是 777 - umask 呢?因为新建的文件默认不具有可执行权限,所以只考虑 rw 权限的话,这波操作自然是 666 了。

目录默认具有 x 权限,当 umask 是 0002 时,创建的目录的默认权限应该是 777 - 0002 = 775:

~/testdir$ mkdir dir1
~/testdir$ ls -l | grep dir1
drwxrwxr-x 2 vagrant vagrant 4096 Nov 19 08:39 dir1

特殊权限

SUID

一般来说文件权限是 rwx。我们查看一下 passwd(修改密码命令)的权限:

~/testdir$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 47032 May 16 2017 /usr/bin/passwd

细心点你会发现它的用户权限的 x 位竟然是 s。这个权限叫 SUID,仅对二进制程序有效。

当用户具有该文件的执行权限时,执行该文件会短暂的获取该文件所有者权限的支持。

比如:所有用户的密码存在 /etc/shadow 这个文件里,且该文件的权限默认是 -r-------- root root,仅root 用户具有强制写入权限,那为什么普通用户还能修改自己的密码呢?就是因为 passwd 命令具有 SUID 权限,用户执行该命令时会获得文件所有者 root 的权限支持,从而修改自己的密码。

SGID

当 group 的 x 位置变成 s 时,说明该文件具有 SGID 权限。

SGID 权限对二进制程序有效。类似 SUID,用户在具有文件的 x 权限时,执行该文件,会获取该文件所属用户组的权限支持。

除了二进制程序外,SGID也可以设置在目录上。

若用户对该目录具有 SGID 权限:

用户在此目录下的有效用户组将会变成该目录的用户组。

如果用户具有该目录的 w 权限,则用户在此目录下创建的文件的用户组与此目录的用户组相同。

该权限对于项目开发很重要。

SBIT

该权限目前只对目录有效:

当用户对此目录具有 w,x 权限,用户在该目录下创建文件夹或目录后,仅自己和 root 才有权限删除该文件。

Others 的 x 权限位若为 t,则说明文件夹具有 SBIT 权限。

比如 /tmp 目录:

$ ls -l / | grep tmp
drwxrwxrwt 4 root root 4096 Nov 19 09:09 tmp
$ sudo -s
# touch test
root@vagrant-ubuntu-trusty-64:/tmp# exit
exit
vagrant@vagrant-ubuntu-trusty-64:/tmp$ rm test
rm: remove write-protected regular empty file ‘test'? y
rm: cannot remove ‘test': Operation not permitted

如何设置以上三种权限

如果在普通的权限设置的“三个数字”前再加一个数字,那前面这个数字就代表这几个权限了:

  • 4 为 SUID
  • 2 为 SGID
  • 1 为 SBIT

比如:

# chmod 777 /tmp
# ls -l / | grep tmp
drwxrwxrwx 4 root root 4096 Nov 19 09:17 tmp
# chmod 1777 /tmp
# ls -l / | grep tmp
drwxrwxrwt 4 root root 4096 Nov 19 09:17 tmp
End。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • Linux命令行快速技巧之定位一个文件的方法

    我们都会有文件存储在电脑里 -- 目录.相片.源代码等等.它们是如此之多.也无疑超出了我的记忆范围.要是毫无目标,找到正确的那一个可能会很费时间.在这篇文章里我们来看一下如何在命令行里找到需要的文件,特别是快速找到你想要的那一个. 好消息是 Linux 命令行专门设计了很多非常有用的命令行工具在你的电脑上查找文件.下面我们看一下它们其中三个:ls.tree 和 find. ls 如果你知道文件在哪里,你只需要列出它们或者查看有关它们的信息,ls 就是为此而生的. 只需运行 ls 就可以列出当下目

  • Python通过paramiko远程下载Linux服务器上的文件实例

    如下所示: #!/usr/local/bin/python # encoding:utf-8 import paramiko import os HOST_IP='59.110.12.72' REMOTE_PATH='/proc' REMOTE_FILENAME='meminfo' LOCAL_PATH='./proc' USERNAME='niu' PASSWORD='123456' def remote_scp(host_ip,remote_path,local_path,file_name

  • python 读取Linux服务器上的文件方法

    使用Python语句,读取Linux远端服务器上的文件打印到控制台的代码实现: 下载包:paramiko import paramiko #服务器信息,主机名(IP地址).端口号.用户名及密码 hostname = "" port = 22 username = "" password = "" client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.Au

  • Linux shell查找文件显示行号和对应区间的内容

    概述 有时候我们需要在一个文件大小不断变化的日志文件里,找寻一些错误信息.这个时候我们可以用如下的小技巧,找出错误日志的内容. CAT的时候显示行号 cat -n cart.log | grep "支付失败" SED找到错误日志的内容 sed -n '1000,2000p' cart.log 由于我们通过CAT命令已经知道行号了,只需要使用SED,输入一个行号的大概范围,就可以详细的展示上下文的日志内容了. 小技巧 如果公司里没有完善的查看日志的工具,例如ELK.那么借助上面的小工具,

  • Linux下制作给ARM开发板使用的文件系统

    1.Busybox源码请网上自行下载,编译方法请参考百度. 2.交叉编译工具链的设置也请先设置好. 如果以上1.2没有问题,那么可以使用以下脚本,制作一个给ARM开发板使用的文件系统. 可以自行定制使用,加入自己的Test demo. #!/bin/bash #yuanxin.yang develop 2015-07-05 #文件系统和Busybox的路径====>可自己定制 FILESYSTEM=/Softwave/filesystem #定义自己制作的文件系统存放的位置 BUSYBOX=/S

  • Linux内核设备驱动之虚拟文件系统笔记整理

    /******************** * 虚拟文件系统VFS ********************/ (1)VFS介绍 虚拟文件系统VFS作为内核的子系统,为用户空间程序提供了文件系统的相关接口. VFS使得用户可以直接使用open()等系统调用而无需考虑具体文件系统和实际物理介质. VFS提供了一个通用的文件系统模型,该模型囊括了我们所能想到的文件系统的常用功能和行为.通过这个抽象层,就可以实现利用通用接口对所有类新的文件系统进行操作. a.调用模型 write(): 用户空间 --

  • Linux awk将文件某列按照逗号分隔的例子

    概述 当我们在处理线上故障的时候,经常会从数据库表查询出某个列. select product_id from order where user_id = 111; 查询出来的结果形式如下: 1 2 3 4 5 这个时候,我们通常会以 product_id in (1,2,3,4,5) 的形式去查找商品表,找出商品的详细信息.那么如何得到这个(1,2,3,4,5)呢.一种简单的做法就是利用awk. cat temp.txt | awk 'BEGIN{ORS=","} {print $0

  • Linux中查看指定文件夹内各个子文件夹内的文件数量

    count脚本 #!/bin/sh numOfArgs=$# if [ $numOfArgs -ne 1 ]; then echo -e "Usage: \nbash $0 dirForCount" exit -1 fi # args ROOTDIR=$1 # core part find $ROOTDIR -maxdepth 1 -type d | sort | while read dir; do count=$(find "$dir" -type f | wc

  • Linux系统中 /etc/fstab 文件的深入解读

    前言 [root@localhost ~]# cat /etc/fstab # # /etc/fstab # Created by anaconda on Sat Nov 3 12:03:31 2018 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more in

  • Linux内核设备驱动之proc文件系统笔记整理

    /***************** * proc文件系统 *****************/ (1)/proc文件系统的特点和/proc文件的说明 /proc文件系统是一种特殊的.由软件创建的文件系统,内核使用它向外界导出信息,/proc系统只存在内存当中,而不占用外存空间. /proc下面的每个文件都绑定于一个内核函数,用户读取文件时,该函数动态地生成文件的内容.也可以通过写/proc文件修改内核参数 /proc目录下的文件分析  /proc/$pid 关于进程$pid的信息目录.每个进程

随机推荐