Linux权限详情---id、chmod、umask、su、chown、chgrp、passwd

2023-05-16

Linux不仅是多重任务处理(multitasking)系统,还是多用户(multiuser)系统。这是说,虽然一台标准计算机可能只包含一个键盘和一台显示器,但是它仍然可以同时被一个以上的用户使用。远程用户可以通过ssh(安全shell)登录并且操作这台计算器。
本节主要介绍如下命令:

    1. id:显示用户身边标识
    1. chmod:修改文件的模式
    1. umask:设置文件的默认权限
    1. su: 以另一个用户的身份运行shell
    1. chown: 更改文件的所有者
    1. chgrp: 更改文件所属群组
    1. passwd: 更改用户密码

1.所有者、组成员和其它所有用户

在UNIX安全模型中,一个用户可以拥有(own)文件和目录。当用户拥有一个文件或目录时,它将对该文件或目录的访问权限具有控制权。反过来,用户又归属于一个群组(group),该群组由一个或多个用户组成,组中用户对文件和目录的访问权限由其所有者授予。除了可以授予群组访问权限外,文件所有者也可以授予所有用户一些访问权限。
使用id命令可以获得用户身份标识的相关信息,以下为Ubuntu的输出

$ id
uid=1000(nvidia) gid=1000(nvidia) groups=1000(nvidia),4(adm),24(cdrom),27(sudo),29(audio),30(dip),44(video),46(plugdev),108(i2c),118(lpadmin),124(gdm),130(sambashare),998(weston-launch),999(gpio)

以下是Fedora系统的输出:

$ id
uid=1005(lixj) gid=1005(lixj) groups=1005(lixj)

在Fedora系统中,普通用户账户是从500开始编号的,而ubuntu中是1000开始编号的。
在Linux系统中,用户账户定义在文件/etc/passwd中,用户组定义在/etc/group中.在创建用户账户和群组时,这些文件随着文件/etc/shadow的变化而变化,文件/etc/shadow中保存了用户的密码信息。
/etc/passwd文件中定义了对应用户的用户名、uid、gid、账户的真实姓名、主目录以及登录shell信息.

2.读取、写入和执行

对于文件和目录的访问权限是按照读访问、写访问以及执行访问来定义的。
当我们查看ls -l命令的输出结果时,输入如下:

$ ls -l model.py
-rw-rw-r-- 1 lixj lixj 126979 May 20 19:26 model.py

最前边的10个字符表示的是文件属性(file attribute),其中第一个字符是指的文件类型(file type),表一列出了常见的文件属性。
表1 文件属性分类

属性文件类型
-普通文件
d目录文件
l符号链接。注意对于符号链接文件,剩下的文件类型属性始终是rwxrwxrwx,它是个伪属性值.符号链接指向的文件的属性才是真正的文件属性
c字符设备文件.该文件类型表示以字节流形式处理数据的设备,如终端或调制解调器.
b块设备文件.该文件类型表示以数据块方式处理数据的设备,如硬盘驱动或光盘驱动

文件属性剩下的9个字符称为文件模式(file mode),分别表示文件所有者、文件所在群组以及其它所有用户对文件的读取、写入和执行权限.

表2 权限属性

属性文件目录
r允许打开和读取文件如果设置了执行权限,那么允许列出目录下内容
w允许写入或者截短文件;如果也设置了执行权限,那么目录中的文件允许被创建、被删除和被重命名但是该权限不允许重命名或者删除文件。是否能重命名和删除文件由目录权限决定
x允许把文件当作程序一样来执行,用脚本语言写的程序文件必须被设置为可读,以便能被执行}允许进入目录下

表3 一些文件属性设置的例子

文件属性含义
-rwx------普通文件,文件所有者具有读取、写入和执行权限。组成员和其它所有用户都没有任何访问权限
-rw-------普通文件,文件所有者具有读取、写入权限,无执行权限。组成员和其它所有用户都没有任何访问权限
-rw-r–r--普通文件,文件所有者具有读取和写入权限,组成员和其它所有用户有读取权限
-rwxr-xr-x普通文件,文件所有者具有读取、写入和执行权限。其它所有用户也可以读取和执行该文件

2.1 chmod——更改文件模式

注意,只有文件所有者和超级用户才可以更改文件或者目录的模式。chmod命令支持两种不同的更改文件模式的方法——八进制数字表示法符号表示法
八进制数字表示法
八进制数字对应着3个二进制数字,刚好可以和用来存储文件模式的结构方式一一映射。
表4 以二进制和八进制方式表示文件模式

八进制二进制文件模式
0000
1001–x
2010-w-
3100r–
4011-wx
5101r-x
6110rw-
7111rwx

例如

$ chmod 600 foo.txt

通过600给foo.txt文件所有者赋予读写权限,并取消组用户和其它所有用户的所有权限.

符号表示法
符号表示法分为3部分:更改会影响谁、要执行哪个操作和要设置哪种权限。可以通过字符u、g、o和a组合来指定要影响的权限
表5 chmod命令符号表示法

符号含义
uuser,表示文件或者目录的所有者
ggroup,文件所属群组
oothers,其它所有用户
aall,‘u’,‘g’,'o’三者的组合

若没有指定字符,则默认为all.操作符“+”表示添加一种权限,“-”表示删除一种权限,“=”表示只有指定的权限可以使用,其它所有权限被删除.
表6 chmod命令符号表示法实例

符号含义
u+x对文件所有者添加可执行权限
u-x删除文件所有者的可执行权限
+x为文件所有者、所属群组和其它所有用户添加可执行权限,等价于a+x
o-rw除了文件所有者和所属群组用户外,删去其余所有用户的读写权限
go=rw除了文件所有者之外,所属群组和其它所有用户具有读写权限.若所属群组和其它所有用户原来具有执行权限,则删除执行可执行权限
u+x,go=rx为文件所有者添加可执行权限,同时设置所属群组和其它所有用户具有读权限和可执行权限

2.2 umask设置默认权限

umask命令控制着创建文件时指定给文件的默认权限,使用八进制表示法来表示从文件模式属性中删除一个位掩码。例如

$ rm -f foo.txt
$ umask
0002
$ > foo.txt
$ ls -l foo.txt
-rw-rw-r-- 1 lixj lixj 0 2020-06-07 17:09 foo.txt

当前掩码值是0002(另一个可能的是0022),是以八进制掩码表示形式。
可以发现,文件所有者和组都获得了读写权限,但其他所有用户只获得了读权限,原因在于掩码。
忽略掉掩码的第一个0,看下表可明白掩码的含义

原始文件模式rw-rw-rw-
掩码000000000010
结果rw-rw-r–

可以修改默认的掩码,但是大部分时候不需要

$ umask 0000

3.更改身份

我们经常需要获得超级用户的特权来执行一些管理任务,但是也可以“变成”另一个普通用户来执行这些任务。主要有三种方法

  • 注销系统并以其他用户身份重新登录系统
  • 使用su命令
  • 使用sudo命令

3.1 su——以其他用户和组ID的身份来运行shell

su命令用来以另一个身份来启动shell,该命令的一般形式为:

su [-[l]] [user]

如果包含’-l’选项,那么得到的shell会话界面将是用于指定用户的登陆shell界面,这就意味着,该指定用户的运行环境将被加载,而其工作目录也将更改为该指定用户的主目录.-l可以缩写为-
如果没有指定用户,那么默认假定为超级用户。

$ su -
Password:
#

输入超级用户密码后,提示符的末尾将由$变为#

# exit
$

退出如上.
也可以使用su命令来执行单个命令,而不需要开启一个新的交互式命令界面

su -c 'command'

命令需要用单引号引起来,这很重要

3.2 sudo——以另一个用户的身份执行命令

sudo命令在很多方面都类似于su命令。不同之处在于,管理者可以通过配置sudo命令,使系统以一种可控的方式,允许一个普通用户以一个不同的用户身份(通常是超级用户)执行命令。用户可能被限制为只能执行一条或者几条特定的命令,而对其它命令没有执行权限。另一个重要区别是,使用sudo命令时,用户只需要输入自己的密码来认证.还有一个重要区别是,sudo命令不需要启动一个新的shell环境,而且也不需要加载另一个用户的运行环境,因此不需要把命令用单引号引起来。
要查看sudo命令可以授予哪些权限,可以通过-l选项来查看

$  sudo -l
Matching Defaults entries for nvidia on nvidia-desktop:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User nvidia may run the following commands on nvidia-desktop:
    (ALL : ALL) ALL

3.3 chown——更改文件所有者和所属群组

chown命令用来更改文件或者目录的所有者和所属群组,需要超级用户权限。语法为:

chown [ower][:[group]] file ...

表7 chown命令参数实例

参数结果
bob把文件所有者从当前用户改为用户bob
bob:users把文件所有者从当前用户更改为bobm并把文件所属群组更改为users组
:admins把文件所属群组更改为admins组,文件所有者不变
bob:bob登录系统时所属组
$ sudo chown tony: ~/tony|myfile.txt

4.更改用户密码

要更改用户自己的密码,只需要输入passwd命令,按照提示修改即可

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux权限详情---id、chmod、umask、su、chown、chgrp、passwd 的相关文章

  • 我们如何在使用循环时调用 ansible playbook 中的变量

    我有两个文件 其中这些文件包含server names and server IP s 我想更改 替换一些特定的server names and IP addressees根据要求在两个文件中 这与这篇文章 因为它被要求开设一个新职位 ht
  • Pthreads - 高内存使用率

    我正在用 C 编写一些东西 在 256Mb 系统上的 Linux 中创建大量 Pthread 我通常有 200Mb 的免费空间 当我使用少量线程运行该程序时 它可以工作 但是一旦我让它创建大约 100 个线程 它就会出现错误 因为系统内存不
  • 如何在 Vim 中突出显示 Bash 脚本?

    我的 Vim 编辑器自动突出显示 PHP 文件 vim file php HTML 文件 vim file html 等等 但是当我输入 vim file在里面写一个Bash脚本 它不会突出显示它 我如何告诉 Vim 将其突出显示为 Bas
  • PIL 的 Image.show() 带来*两个*不同的查看器

    在 python shell 中处理图像时 我使用 image show 其中 image 是 Image 的实例 很久以前什么也没发生 但在定义了一个名为 xv 的 Mirage 符号链接后 我很高兴 最近几天 show 将显示 Imag
  • Linux中如何避免sleep调用因信号而中断?

    我在 Linux 中使用实时信号来通知串行端口中新数据的到达 不幸的是 这会导致睡眠呼叫在有信号时被中断 有人知道避免这种行为的方法吗 我尝试使用常规信号 SIGUSR1 但我不断得到相同的行为 来自 nanosleep 联机帮助页 nan
  • Linux 内核使用的设备树文件 (dtb) 可视化工具? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以图形化表示Linux内核中使用的硬件设备树的工具 我正在尝试了解特定 Arm 芯片组
  • 如何在C(Linux utf8终端)中打印“盒子抽屉”Unicode字符?

    我正在尝试显示 方框图范围 2500 257F 中的 Unicode 字符 它应该是标准 utf8 Unicode 标准 版本 6 2 我根本做不到 我首先尝试使用旧的 ASCII 字符 但 Linux 终端以 utf8 显示 并且没有显示
  • 为什么 OS X 和 Linux 之间的 UTF-8 文本排序顺序不同?

    我有一个包含 UTF 8 编码文本行的文本文件 mac os x cat unsorted txt foo foo 津 如果它有助于重现问题 这里是文件中确切字节的校验和和转储 以及如何自己生成文件 在 Linux 上 使用base64 d
  • Linux shell 从用户输入中获取设备 ID

    我正在为一个程序编写安装脚本 该程序需要在其配置中使用 lsusb 的设备 ID 因此我正在考虑执行以下操作 usblist lsusb put the list into a array for each line use the arr
  • 如何在 Linux 和 C 中使用文件作为互斥体?

    我有不同的进程同时访问 Linux 中的命名管道 并且我想让此访问互斥 我知道可以使用放置在共享内存区域中的互斥体来实现这一点 但作为一种家庭作业 我有一些限制 于是 我想到的是对文件使用锁定原语来实现互斥 我做了一些尝试 但无法使其发挥作
  • BASH:输入期间按 Ctrl+C 会中断当前终端

    我的 Bash 版本是 GNU bash version 4 3 11 1 release x86 64 pc linux gnu 我有一段这样的代码 while true do echo n Set password read s pas
  • Crontab 每 5 分钟一次 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我如何告诉 crontab 每 5 分钟运行一次 但从每小时的第二分钟开始 换句话说 我想在以下时间执行我的脚本minute 5 2 例如 我的脚本应
  • 如何并行执行4个shell脚本,我不能使用GNU并行?

    我有4个shell脚本dog sh bird sh cow sh和fox sh 每个文件使用 xargs 并行执行 4 个 wget 来派生一个单独的进程 现在我希望这些脚本本身能够并行执行 由于某些我不知道的可移植性原因 我无法使用 GN
  • /sys/device/ 和 dmidecode 报告的不同 CPU 缓存大小

    我正在尝试获取系统中不同缓存级别的大小 我尝试了两种技术 a 使用 sys device 中的信息 这是输出 cat sys devices system cpu cpu0 cache index1 size 32K cat sys dev
  • 嵌入清单文件以要求具有 mingw32 的管理员执行级别

    我正在 ubuntu 下使用 i586 mingw32msvc 交叉编译应用程序 我很难理解如何嵌入清单文件以要求 mingw32 具有管理员执行级别 对于我的例子 我使用了这个hello c int main return 0 这个资源文
  • 在汇编中使用 printf 会导致管道传输时输出为空,但可以在终端上使用

    无输出 https stackoverflow com questions 54507957 printf call from assembly do not print to stdout即使在终端上 当输出不包含换行符时也有相同的原因
  • grep 排除文件的数组参数

    我想从我的文件中排除一些文件grep命令 为此我使用参数 exclude excluded file ext 为了更容易阅读 我想使用包含排除文件的 bash 数组 EXCLUDED FILES excluded file ext 然后将
  • 批量删除文件名中包含 BASH 中特殊字符的子字符串

    我的目录中有一个文件列表 opencv calib3d so2410 so opencv contrib so2410 so opencv core so2410 so opencv features2d so2410 so opencv
  • 适用于 Linux 的轻量级 IDE [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 C 中使用单个消息队列是否可以实现双向通信

    我希望服务器向客户端发送一些消息 并让客户端确认它 我被分配了这个任务 我可以在 C linux 中使用单个消息队列来完成它还是我需要创建两个 谢谢 是的 可以使用 sysV 消息队列来做到这一点 从您之前的问题来看 您正在使用该队列 您可

随机推荐