【Linux】权限

本文介绍了Linux系统中的用户分类,包括Root用户、系统用户、普通用户和游客用户。详细讲解了文件权限的读、写、执行概念,并展示了如何使用chmod和umask命令更改文件权限。此外,还讨论了用户切换,如su、sudo命令的使用,以及chown、chgrp和passwd命令的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux 权限

0. 前言

权限无处不在,本文就不废话,我们直接开始!

学习目标

  1. 了解 Linux/Unix 安全模型
  2. 会使用 Linux 权限相关命令

1. 相关概念

本小节介绍 Linux 中,用户的分类以及常见的文件权限

1.1 用户分类

Linux用户可以分为以下几种类型:

  1. Root用户:这是Linux系统中的超级用户,拥有完全的系统管理权限。
  2. 系统用户:这些用户是由系统或应用程序创建的,用于运行服务或进程。
  3. 普通用户:这些用户是由管理员或root用户创建的,拥有有限的系统权限,只能访问其拥有的文件和目录。
  4. 游客用户:这是一个特殊的用户类型,通常用于公共计算机或类似的场景,用户在使用期间可以访问系统的一些功能,但不会留下任何痕迹。

作为开发者,我们平时作为普通用户以及Root用户的场景最多,因此接下来的知识将会围绕这两个用户展开介绍。

id 查看当前用户身份标识信息

[sharry@localhost ~]$ id
uid=1000(sharry) gid=1000(sharry) groups=1000(sharry) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

在Unix安全模型中,一个用户可以拥有文件和目录。当一个用户拥有一个文件或者目录时,该用户将对该文件或目录拥有控制权限。同时,一个用户又归属于一个群组,该群组由一个或多个用户组成,组中的用户对文件和目录的访问权限由其所有者授予。

从上面列举的 id命令执行例子,我们发现,标准输出中的结果有一个uidgid以及groups,通过上面的介绍,不难理解其中的意思:在创建用户账户的时候,用户将被分配一个uid号码,同时被分配一个gid,即被分配到该组id对应的群组。

我们可以切换到Root用户也执行一下id命令:

[sharry@localhost ~]$ su root
Password:
[root@localhost sharry]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

不难发现,普通用户的uidgid是根据不同的Linux系统,从较大于0的一些编号中开始分配的;Root用户则是0号用户,属于0号群组。

详细用户信息
详细的用户信息记录在了 一些不同的文件中,以下列举一些常见的:

  • 用户账户信息:/etc/passwd
  • 用户组定义:/etc/group
  • 用户密码信息:/ect/shadow

实操一下,我们可选取passwd文件看看:


[root@localhost sharry]# echo $(less /etc/passwd)

root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:999:998:User for polkitd:/:/sbin/nologin libstoragemgmt:x:998:995:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin colord:x:997:994:User for colord:/var/lib/colord:/sbin/nologin rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin saned:x:996:993:SANE scanner daemon user:/usr/share/sane:/sbin/nologin gluster:x:995:992:GlusterFS daemons:/run/gluster:/sbin/nologin saslauth:x:994:76:Saslauthd user:/run/saslauthd:/sbin/nologin abrt:x:173:173::/etc/abrt:/sbin/nologin setroubleshoot:x:993:990::/var/lib/setroubleshoot:/sbin/nologin rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin radvd:x:75:75:radvd user:/:/sbin/nologin chrony:x:992:987::/var/lib/chrony:/sbin/nologin unbound:x:991:986:Unbound DNS resolver:/etc/unbound:/sbin/nologin qemu:x:107:107:qemu user:/:/sbin/nologin tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin sssd:x:990:984:User for sssd:/:/sbin/nologin usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin geoclue:x:989:983:User for geoclue:/var/lib/geoclue:/sbin/nologin ntp:x:38:38::/etc/ntp:/sbin/nologin gdm:x:42:42::/var/lib/gdm:/sbin/nologin rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin gnome-initial-setup:x:988:982::/run/gnome-initial-setup/:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin sharry:x:1000:1000:CentOS7-64-SharryVM1:/home/sharry:/bin/bash

1.2 文件权限

与我们学过的操作系统理论知识一致,Linux通常提供文件的读、写以及执行权限。我们通过ls命令并使用其-l选项,就可以列举出文件的读写权限属性:

[sharry@localhost ~]$ > newFile.txt
[sharry@localhost ~]$ ls -l newFile.txt
-rw-rw-r--. 1 sharry sharry 0 Jun  1 02:04 newFile.txt

在这个例子中,最前面的-rw-rw-r--表示这个创建的新文件的文件属性,以下对这个属性进行拆分,对照解释这些属性的表格,文件的权限信息就一目了然了:

  • 拆分:-rw-rw-rw-r--拆为:-以及rw-rw-r--,拆出来的分别顺序对应下面的表格所描述的属性意义,其中rw-rw-r--每3位分别对应其所有者权限、组权限、其他用户权限
  • 表格:
    • 文件类型表
文件类型属性代表的文件类型
-普通文件
d目录
l符号链接
c字符设备文件
b块设备文件
  • 权限属性表
权限属性文件权限目录权限
r允许打开和读取文件允许列出目录下的内容
w允许写文件;当设置了执行权限时,也允许被创建、删除、重命名。
x允许当作程序一样来执行允许进入目录下

举例

  • 组合表格举例

    文件属性含义
    -rwx------普通文件,文件所有者具有读取、写入和执行权限,组成员和其他所有用户都没有访问权限
    -rw-r–r–普通文件,文件所有者有读写权限,文件所有者所在群组成员以及其他用户都可读
    lrwxrwxrwx符号链接(软链接)
    dwxrwx----目录文件,文件所有者和所有者所在群组的成员都可以进入该目录,而且可以创建、重命名和删除该目录下的文件
  • 再执行一下 ls -l

    [sharry@localhost ~]$ ln -s newFile.txt secln
    [sharry@localhost ~]$ ls -l
    total 0
    drwxr-xr-x. 2 sharry sharry  6 Apr 17 18:33 Desktop
    -rw-rw-r--. 1 sharry sharry  0 Jun  1 02:04 newFile.txt
    lrwxrwxrwx. 1 sharry sharry 11 Jun  1 02:27 secln -> newFile.txt
    

2. 权限操作

本节主要介绍常见的命令行更改文件权限、切换用户方式

2.1 更改文件权限

作为开发者,在工作中我们很少会直接用到更改文件权限的命令,但话都说到这了,我们还是了解一下:

2.1.1 chmod 更改文件模式

在学习这个命令之前,我们首先要注意只有文件所有这者和Root超级用户才可以更改文件或目录的模式。

chmod命令通常结合八进制或符号表示文件模式。我们以表格的形式举些例子,读者大佬们应该看看就很快懂了:

八进制表示法

八进制二进制文件模式
0000
2010-w-
7111rwx

以此类推,chmod八进制表示文件模式通常为 0~7,其中常用的值为0、4、5、6、7, 如下执行示例:


[sharry@localhost ~]$ ls
Desktop  Documents  Downloads  Music  newFile.txt  Pictures  Public  secln  Templates  Videos
[sharry@localhost ~]$ ls -l newFile.txt
-rw-rw-r--. 1 sharry sharry 0 Jun  1 02:04 newFile.txt
[sharry@localhost ~]$ chmod 777 newFile.txt
[sharry@localhost ~]$ ls -l newFile.txt
-rwxrwxrwx. 1 sharry sharry 0 Jun  1 02:04 newFile.txt

符号表示法
符号表示法分为三部分:更改会影响谁、要执行哪个操作以及要设置哪种权限

符号表:

符号含义
uuser的简写,表示文件或目录的所有者
g文件所属群组
o其他用户
aall,表示上述行的权限都有

操作表:

操作含义
+添加一种权限
-删除一种权限
=只有指定权限可用

举个例子:

[sharry@localhost ~]$ chmod 600 newFile.txt
[sharry@localhost ~]$ ls -l newFile.txt
-rw-------. 1 sharry sharry 0 Jun  1 02:04 newFile.txt
[sharry@localhost ~]$ chmod u+x,g+rwx,o=r newFile.txt
[sharry@localhost ~]$ ls -l newFile.txt
-rwxrwxr--. 1 sharry sharry 0 Jun  1 02:04 newFile.txt
[sharry@localhost ~]$

2.1.2 umask 设置默认权限

umask命令控制创建文件时指定给文件的默认权限,使用八进制位掩码表示删除哪个位的权限模式。

查看默认umask位掩码

[sharry@localhost ~]$ umask
0002

根据位掩码,设置位掩码并对文件权限进行默认操作

[sharry@localhost ~]$ umask
0002
[sharry@localhost ~]$ > newTest.txt
[sharry@localhost ~]$ ls -l newTest.txt
-rw-rw-r--. 1 sharry sharry 0 Jun  1 20:42 newTest.txt
[sharry@localhost ~]$ umask 0000
[sharry@localhost ~]$ > newTest1.txt
[sharry@localhost ~]$ ls -l newTest1.txt
-rw-rw-rw-. 1 sharry sharry 0 Jun  1 20:43 newTest1.txt

2.2 切换用户

2.2.1 su 切换用户

su命令常用来以另一个用户的身份来使用shell。常用选项为-l-c

举例:


[sharry@localhost ~]$ su -l
Password:
Last login: Thu Jun  1 22:49:55 PDT 2023 on pts/1
[root@localhost ~]# 

# 通过 exit 命令退出到 原先用户的shell
[root@localhost ~]# exit
logout

# 其中,-l 可以省略为 -
[sharry@localhost ~]$ su -
Password:
Last login: Thu Jun  1 23:17:39 PDT 2023 on pts/1
[root@localhost ~]#

-c选项表示不切换登录,但在目标用户的shell执行单个命令:

# 当没有权限时
[sharry@localhost ~]$ ls -l /root/ *
lrwxrwxrwx. 1 sharry sharry  11 Jun  1 02:27 secln -> newFile.txt
......
ls: cannot open directory /root/: Permission denied

# 使用 su -c
[sharry@localhost ~]$ su -c 'ls -l /root/ *'
Password:
lrwxrwxrwx. 1 sharry sharry  11 Jun  1 02:27 secln -> newFile.txt

Desktop:
total 0

Documents:
total 0

Downloads:
total 0

Music:
total 0

Pictures:
total 0

Public:
total 0

/root/:
total 8
-rw-------. 1 root root 2783 Apr 17 18:26 anaconda-ks.cfg
-rw-------. 1 root root 2063 Apr 17 18:26 original-ks.cfg

......

2.2.2 sudo 使用另一个用户的权限

sudo命令在很多方面都类似于 su命令。管理员可以通过配置sudo命令,使系统以一种可控的方式,允许一个普通用户以一个不同的用户身份很执行命令。主要区别在于,通过sudo的配置,用户有些场合会被限制为只能执行特定的几条命令,同时,使用sudo命令并不需要Root用户的密码,只需要输入用户自己的密码进行认证。举个例子:

[sharry@localhost ~]$ sudo backup_script
[sudo] password for sharry:
sharry is not in the sudoers file.  This incident will be reported.

[sharry@localhost ~]$ sudo ls -l /root/*
[sudo] password for sharry:
sharry is not in the sudoers file.  This incident will be reported.

上述命令的执行说明了当前用户并没有分配到 sudoers,我们可以用我们上述提到过的知识为当前用户分配 soders :

[sharry@localhost ~]$ su -
Password:
Last login: Thu Jun  1 23:24:17 PDT 2023 on pts/1
[root@localhost ~]# cd /etc/
[root@localhost etc]# ls | grep sudoers
sudoers
sudoers.d
[root@localhost etc]# chmod u+w sudoers
[root@localhost etc]# vi sudoers

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
sharry  ALL=(ALL)       ALL

[root@localhost etc]# chmod u-w sudoers
[root@localhost etc]# exit

按照上面的示例配置完成后,我们再执行一下sudo

[sharry@localhost ~]$ sudo ls -l /root/ *
lrwxrwxrwx. 1 sharry sharry  11 Jun  1 02:27 secln -> newFile.txt

Desktop:
total 0

Documents:
total 0

Downloads:
total 0

Music:
total 0

Pictures:
total 0

Public:
total 0

/root/:
total 8
-rw-------. 1 root root 2783 Apr 17 18:26 anaconda-ks.cfg
-rw-------. 1 root root 2063 Apr 17 18:26 original-ks.cfg

Templates:
total 0

Videos:
total 0

2.2.3 chown、chgrp更改群组

为了演示效果,我们首先要通过上面小节学习过的sudo命令创建一个新用户,并将当前用户的测试文件更改到新用户群组:

创建新用户

[sharry@localhost ~]$ sudo useradd -r -m -s /bin/bash kevin
[sudo] password for sharry:
[sharry@localhost ~]$ sudo passwd kevin
Changing password for user kevin.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.

更改群组

[sharry@localhost ~]$ > testFile.txt
[sharry@localhost ~]$ sudo cp testFile.txt ~kevin
[sharry@localhost ~]$ sudo ls -l ~kevin/testFile.txt
-rw-r--r--. 1 root root 0 Jun  2 00:10 /home/kevin/testFile.txt
[sharry@localhost ~]$ sudo chown kevin: ~kevin/testFile.txt
[sharry@localhost ~]$ sudo ls -l ~kevin/testFile.txt
-rw-r--r--. 1 kevin kevin 0 Jun  2 00:10 /home/kevin/testFile.txt

以上例子仅举例了chown命令的使用,chgrp命令的使用与chown基本一致,读者可自行尝试。

2.2.4 passwd 更改密码

这个命令在上面小节创建新用户的例子中已经用过了,这个命令非常简单粗暴,选择合适的权限后,执行

passwd [username]

然后按照提示,输入校验密码即可。

3. 总结与补充

通过本文,读者应该对 Linux 中的一些权限相关的知识有一些了解了:
我们首先了解了文件模式的表示对应的权限,然后了解了一些不常用的修改文件权限的方式,最后我们学习了用户身份相关的知识,这方面的知识虽然在文中记录的不多,但实际上可能用得多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值