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 的相关文章

  • 在哪里可以找到并安装 pygame 的依赖项?

    我对 Linux 比较陌生 正在尝试安装 python 的 pygame 开发环境 当我运行 setup py 时 它说我需要安装以下依赖项 我找到并安装了其中之一 SDL 然而 其他人则更加难以捉摸 Hunting dependencie
  • fopen 不返回

    我在 C 程序中使用 fopen 以只读模式 r 打开文件 但就我而言 我观察到 fopen 调用没有返回 它不返回 NULL 或有效指针 执行在 fopen 调用时被阻止 文件补丁绝对正确 我已经验证过 并且不存在与权限相关的问题 任何人
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • 如何有效截断文件头?

    大家都知道truncate file size 函数 通过截断文件尾部将文件大小更改为给定大小 但是如何做同样的事情 只截断文件的尾部和头部呢 通常 您必须重写整个文件 最简单的方法是跳过前几个字节 将其他所有内容复制到临时文件中 并在完成
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • nslookup 报告“无法解析 '(null)': 名称无法解析”,尽管它成功解析了 DNS 名称

    我在 ubuntu 上 并且正在运行 docker 默认桥接网络 我有 Zookeeper kafka 的容器化版本 以及我编写的与 kafka 对话的应用程序 I do a docker exec it
  • Linux 内核标识符中前导和尾随下划线的含义是什么?

    我不断遇到一些小约定 比如 KERNEL Are the 在这种情况下 是内核开发人员使用的命名约定 还是以这种方式命名宏的语法特定原因 整个代码中有很多这样的例子 例如 某些函数和变量以 甚至 这有什么具体原因吗 它似乎被广泛使用 我只需
  • Linux:在文件保存时触发 Shell 命令

    我想在修改文件时自动触发 shell 命令 我认为这可以通过注册 inotify 挂钩并调用来在代码中完成system 但是是否有更高级别的 bash 命令可以完成此任务 尝试 inotify 工具 我在复制链接时遇到问题 抱歉 但 Git
  • Linux 可执行文件与 OS X“兼容”吗?

    如果您在基于 Linux 的平台上用 C 语言编译一个程序 然后将其移植以使用 MacOS 库 它会工作吗 来自编译器的核心机器代码在 Mac 和 Linux 上兼容吗 我问这个问题的原因是因为两者都是 基于 UNIX 的 所以我认为这是真
  • 如何在shell中输出返回码?

    我正在尝试通过调用自定义 shell 脚本sh bin sh c myscript sh gt log txt 2 gt 1 echo 该命令的输出是创建的后台进程的 PID 我想指导 bin sh保存返回码myscript sh到某个文件
  • Linux 中什么处理 ping?

    我想覆盖 更改 linux 处理 ping icmp echo 请求数据包的方式 这意味着我想运行自己的服务器来回复传入的 icmp 回显请求或其他 数据包 但为了使其正常工作 我想我需要禁用 Linux 的默认 ping icmp 数据包
  • docker容器大小远大于实际大小

    我正在尝试从中构建图像debian latest 构建后 报告的图像虚拟大小来自docker images命令为 1 917 GB 我登录查看尺寸 du sh 大小为 573 MB 我很确定这么大的尺寸通常是不可能的 这里发生了什么 如何获
  • 如何通过ssh检查ubuntu服务器上是否存在php和apache

    如何通过ssh检查Ubuntu服务器上apache是 否安装了php和mysql 另外如果安装的话在哪个目录 如果安装了其他软件包 例如 lighttpd 那么它在哪里 确定程序是否已安装的另一种方法是使用which命令 它将显示您正在搜索
  • 我不明白 execlp() 在 Linux 中如何工作

    过去两天我一直在试图理解execlp 系统调用 但我还在这里 让我直奔主题 The man pageexeclp 将系统调用声明为int execlp const char file const char arg 与描述 execl exe
  • 如何减去两个 gettimeofday 实例?

    我想减去两个 gettimeofday 实例 并以毫秒为单位给出答案 这个想法是 static struct timeval tv gettimeofday tv NULL static struct timeval tv2 gettime
  • Linux - 从第二个选项卡获取文本

    假设我们有这样的文件 一些文本11 一些文本12 一些文本13 一些文本21 一些文本22 一些文本23 文本由制表符分隔 我们知道第 1 列中的一些文本 但希望从第 2 列中获取文本 我知道我可以通过以下方式获取线路 grep somet
  • waitpid() 的作用是什么?

    有什么用waitpid 它通常用于等待特定进程完成 或者如果您使用特殊标志则更改状态 基于其进程 ID 也称为pid 它还可用于等待一组子进程中的任何一个 无论是来自特定进程组的子进程还是当前进程的任何子进程 See here http l
  • 子目录中的头文件(例如 gtk/gtk.h 与 gtk-2.0/gtk/gtk.h)

    我正在尝试使用 GTK 构建一个 hello world 其中包括以下行 include
  • 如何在c linux中收听特定接口上的广播?

    我目前可以通过执行以下操作来收听我编写的简单广播服务器 仅广播 hello int fd socket PF INET SOCK DGRAM 0 struct sockaddr in addr memset addr 0 sizeof ad

随机推荐