Linux - 用户和权限

本贴最后更新于 1837 天前,其中的信息可能已经水流花落

Linux 中的用户

在 Linux 中有三类用户他们分别是:

第一类:root(超级管理员),UID 为 0,这个用户有极大的权限,可以直接无视很多的限制,包括读写执行的权限。

第二类:系统用户,UID 为 1~499。一般是不会被登入的。

第三类:普通用户,UID 范围一般是 500~65534。这类用户的权限会受到基本权限的限制,也会受到来自管理员的限制。不过要注意 nobody 这个特殊的帐号,UID 为 65534,这个用户的权限会进一步的受到限制,一般用于实现来宾帐号。

查看用户和组信息

(1)/etc/passwd

文件中保存了用户的信息,可以通过查看该文件来查看用户的信息,在该文件中,用户的信息将会有七个字段,他们分别代表了用户的各个信息。

  • 第一个字段:用户名
  • 第二个字段:用户是否需要密码验证(x)代表需要,不写代表不需要
  • 第三个字段:用户的 id,如果重复了,就以最小的为准
  • 第四个字段:组 id
  • 第五个字段:是注释
  • 第六个字段:该用户的/home 目录
  • 第七个字段:用户登录的命令解释器。(/sbin/nologin 意味不可登录,/bin/bash 意味可以登录)

一般来说,只有 root 用户的 uid 是为 0 的。如果一个普通用户的 uid 修改为 0 的话,那么他只要以普通用户的用户名和密码登录,系统就会自动切换到 root 用户。因此系统其实最主要是根据用户的 id 来判断用户的角色的,而不是通过改用户名。

(2)/etc/shadow

文件中保存了用户和用户密码的信息,可以通过查看该文件来获取某个用户的密码。该文件一共有九个字段,他们分别是:

  • 第一个字段:用户名
  • 第二个字段:通过 sha-512 加密(二次加密,在经过第一次加密后,第二次加入随机数再次加密)的密码
  • 第三个字段:最后一次修改密码距离 1970 年 1 月 1 日的天数间隔
  • 第四个字段:密码最短有效期
  • 第五个字段:密码最长有效期
  • 第六个字段:密码过期前几天进行警告
  • 第七个字段:账户过期后,被锁定的天数
  • 第八个字段:账号失效时间距离 1970 年 1 月 1 日的天数间隔
  • 第九个字段:未分配功能

如果是 * 表示该用户禁用,!! 表示用户密码未初始化,如果为空,表示空密码。可以通过 chage 修改用户的密码策略,当然也可以通过修改 shadow 文件(不建议!!!)

chage [选项] 用户名

-m:密码可更改的最小天数。为零时代表任何时候都可以更改密码。
-M:密码保持有效的最大天数。
-w:用户密码到期前,提前收到警告信息的天数。
-E:帐号到期的日期。过了这天,此帐号将不可用。
-d:上一次更改的日期。
-i:停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。
-l:例出当前的设置。由非特权用户来确定他们的密码或帐号何时过期。

(3)/etc/group

查看组信息,组信息的显示有四个字段

  • 第一个字段:组名
  • 第二个字段:组密码占位符 --> x
  • 第三个字段:组 id
  • 第四个字段:组成员

一个用户只能有一个主要组,最多可以有 31 个附加组。主要组是用户创建文件时默认的所有组,附加组主要用于权限管理。不论用户属于哪个组,用户都能拥有该组的权限。

特殊组 wheel:

在 Linux 中有一个特殊组 wheel,wheel 组就类似于一个管理员的组。在 linux 中,即使我们有系统管理员 root 的权限,也不推荐用 root 用户登录。一般情况下用普通用户登录就可以了,在需要 root 权限执行一些操作时,再 su 登录成为 root 用户。但是,任何人只要知道了 root 用户的密码,就都可以通过 su 命令来登录为 root 用户--这无疑为系统带来了安全隐患。所以,将普通用户加入到 wheel 组中,被加入的这个普通用户就成了管理员组内的用户了,然后可以修改配置文件使得只有 wheel 组内的用户可以切换到 root 用户。

4)id

id 命令可以用来查看某个用户是否存在与系统中。

id 用户名

管理用户和组信息

用户管理

(1)useradd

通过 useradd 命令,我们可以为系统新建一个用户

c< 备注 >  加上备注文字。备注文字会保存在 passwd 的备注栏位中。

-d< 登入目录 >  指定用户登入时的起始目录。

-D  变更预设值.

-e< 有效期限 >  指定帐号的有效期限。

-f< 缓冲天数 >  指定在密码过期后多少天即关闭该帐号。

-g< 群组 >  指定用户所属的群组。

-G< 群组 >  指定用户所属的附加群组。

-m  自动建立用户的登入目录。

-M  不要自动建立用户的登入目录。

-n  取消建立以用户名称为名的群组.

-r  建立系统帐号。

-s   指定用户登入后所使用的 shell。

-u  指定用户 ID。

新建用户的过程中,系统做了什么?

useradd 只是创建了一个用户名,如 (useradd + 用户名 ),它并没有在/home 目录下创建同名文件夹,也没有创建密码,除了添加一个新用户之外什么都没有。因此利用这个用户登录系统,是登录不了的,为了避免这样的情况出现,可以用 (useradd -m + 用户名)的方式创建,它会在/home 目录下创建同名文件夹,然后利用( passwd + 用户名)为指定的用户名设置密码。

网上很多人都说 useradd 用户后,会生成自己的家目录什么的,但是我在自己的 ubuntu 上发现并没有,用这个命令创建一个用户后,还有很多需要自己去完善的东西,才能真正的使用这个用户。

(2)adduser

adduser,这个命令实际是一个 perl 脚本,是 useradd 等类似底层命令的更友好的前端,它会用交互性的方式建立新用户,使用它可以指定新用户的家目录,登录密码,是否加密主目录等等,它会:

1:建立一个新目录作为家目录

2:建立同名新组

3:把用户的主要组设为该组(除非命令选项覆盖以上默认动作,比如–disall-homdirecry 之类)

4:从/etc/SKEL 目录下拷贝文件到家目录,完成初始化

5:建立新用户的密码

6:如果其存在的话,还会执行一个脚本。

用户创建时,默认的属性(比如 UID,GID,是否创建家目录,创建邮箱等)都是通过/etc/login.defs 文件控制的,修改此文件的属性,会影响以后创建的所有用户。也可以创建用户时指定参数修改,这样只对当前创建用户有效

另外,adduser 的可用参数与上面的 useradd 一致。

总结:新建用户,系统应该做得事。

  1. 新建用户时,系统会将 /etc/skel 中的目录及文件拷贝到新建用户的家目录中
  2. 在 /var/spool/mail 中,新建用户名的邮箱
  3. 在 /etc 下的 passwd 、shadow 、group 文件中,增加用户信息

(3)userdel

通过 userdel 可以删除系统中的用户。

userdel  -r  用户名  #删除用户一定记得加 -r 参数 !!
  • 不加 -r 参数,只删除 passwd、shadow 和 group 文件中的用户信息,/home 目录下的文件不删除,/var/spool/mail/ 下的文件不删除
  • 加 -r 参数,删除 passwd、shadow 和 group 文件中的用户信息,同时删除用户的家目录和邮箱

(4)passwd

passwd  add   #给a用户设置密码

(5)usermod

usermod 可用来修改用户帐号的各项设定。

usermod [-LU][-c <备注>][-d <登入目录>][-e <有效期限>][-f <缓冲天数>][-g <群组>][-G <群组>][-l <帐号名称>][-s <shell>][-u <uid>][用户帐号]

可用参数

-c< 备注 >  修改用户帐号的备注文字。

-d 登入目录 >  修改用户登入时的目录。

-e< 有效期限 >  修改帐号的有效期限。

-f< 缓冲天数 >  修改在密码过期后多少天即关闭该帐号。

-g< 群组 >  修改用户所属的群组。

-G< 群组 >  修改用户所属的附加群组。

-l< 帐号名称 >  修改用户帐号名称。

-L  锁定用户密码,使密码无效。

-s  修改用户登入后所使用的 shell。

-u  修改用户 ID。

-U  解除密码锁定。

-a  默认情况下,当用户已经存在附加组时,再添加附加组则会把之前的附加组给替换了,加 -a 参数,则不替换原来的附加组,意味着该用户可以有多个附加组。

虽然 usermod 和 passwd 这两个命令都可以锁定和解锁用户,但是还是有区别的。区别之一就是 passwd 命令操作完后会有提示。还有一个区别就是 passwd 的权限比 usermod 大,使用 usermod 锁定的用户可以用 passwd 来解锁,但是使用 passwd 锁定的用户不能用 usermod 来解锁

组管理

1)groupadd

groupadd 命令用于创建一个新的工作组,新工作组的信息将被添加到系统文件中。

相关文件:

  • /etc/group 组账户信息。
  • /etc/gshadow 安全组账户信息。
  • /etc/login.defs Shadow 密码套件配置。

用法

groupadd [-g gid [-o]] [-r] [-f] group

可用参数

-g:指定新建工作组的 id;

-r:创建系统工作组,系统工作组的组 ID 小于 500;

-K:覆盖配置文件 "/ect/login.defs";

-o:允许添加组 ID 号不唯一的工作组。

-f,--force: 如果指定的组已经存在,此选项将失明了仅以成功状态退出。当与 -g 一起使用,并且指定的 GID_MIN 已经存在时,选择另一个唯一的 GID(即-g 关闭)。

(2)groupdel

需要从系统上删除群组时,可用 groupdel(group delete)指令来完成这项工作。倘若该群组中仍包括某些用户,则必须先删除这些用户后,方能删除群组。

用法

groupdel [群组名称]

可选参数

-r , --remove 删除主目录和邮件池

(3)groupmod

需要更改群组的识别码或名称时,可用 groupmod 指令来完成这项工作。

用法

groupmod [-g <群组识别码> <-o>][-n <新群组名称>][群组名称]

可选参数

-g < 群组识别码 >  设置欲使用的群 id。

-o  重复使用群组 id。

-n < 新群组名称 >  设置欲使用的群组名称。

(4)groupmems

更改和查看组成员(只有 root 可以执行)

用法

groupmems [options] [-g GROUPNAME] 

可选参数

-a 用户名 将一个用户添加到组成员列表

-d 用户名 从组成员列表中删除用户

-g 组 名 超级用户可以指定修改哪个组的组成员列表

-l -g 组名 列出组成员

-p -g 组名 从组成员列表中删除所有用户

what’s sudo and su

sudo

sudo 是一种权限管理机制,依赖于/etc/sudoers,其定义了授权给哪个用户可以以管理员的身份能够执行什么样的管理命令;

格式:sudo -u USERNAME COMMAND

默认情况下,系统只有 root 用户可以执行 sudo 命令。需要 root 用户通过使用 visudo 命令编辑 sudo 的配置文件/etc/sudoers,才可以授权其他普通用户执行 sudo 命令。

su

su 为 switch user,即切换用户的简写。

格式为两种:

su -l USERNAME(-l 为 login,即登陆的简写)

su USERNAME

如果不指定 USERNAME(用户名),默认即为 root,所以切换到 root 的身份的命令即为:su -root 或 su -,su root 或 su。

su USERNAME,与 su - USERNAME 的不同之处如下:

su - USERNAME 切换用户后,同时切换到新用户的工作环境中。

su USERNAME 切换用户后,不改变原用户的工作目录,及其他环境变量目录。

su -

su -,su -l 或 su --login 命令改变身份时,也同时变更工作目录,以及 HOME,SHELL,USER,LOGNAME。此外,也会变更 PATH 变量。用 su -命令则默认转换成成 root 用户了。

而不带参数的“su 命令”不会改变当前工作目录以及 HOME,SHELL,USER,LOGNAME。只是拥有了 root 的权限而已。

su -使用 root 的密码,而 sudo su 使用用户密码

文件与目录的权限

在 Linux 中有严格的权限等级,不同的用户可能对与同一文件拥有不同权限。那么怎么查看文件的权限呢?我们一般可以使用 ls -l 查看当前目录下的各个文件的权限。

ls -l 命令的输出结果类似如下:

drwxr-xr-x 2 huny huny   4096 11月 10 20:01 Demo
drwxr-xr-x 3 huny huny   4096 11月 10 14:30 GpssWorld
-r--r--rw- 1 huny huny      0 11月  7 21:13 test
-rw-r--r-- 1 huny huny   1080 11月  6 20:52 vimTest.txt
drwxr-xr-x 3 huny huny   4096 11月  5 09:29 安卓实验课
-rw-r--r-- 1 huny huny 178333 11月  7 21:35 深度截图_20191107213501.png

在这个输出中,前面的最前面的一个 - d 代表文件的不同类型,后面的 rwxr-xr-x 这种形式的表示文件的权限情况。rwxr-xr-x 这里面其实是九个字符,前三个代表了文件属主的权限,中间三个代表了文件属组的权限,后面三个代表了其他用户的权限。然后后面的数字代表了文件的链接数。接着的 huny huny,其中的第一个是文件所属的用户,第二个是所属的组。接着是文件的大小,时间,和文件名。

文件类型

在 Linux 中一共有七中文件类型:

  • -:普通文件
  • d:目录文件
  • b:块设备文件
  • c:字符特殊文件
  • l:符号连接(类似与 windows 的快捷方式)
  • f:命名管道
  • s:套接字文件

知道什么符号代表什么文件过后,我们就可以去看该文件的权限类型了(同意权限针对不同的文件类型表达的意思不一样。)

文件权限

Linux 中的权限可以用字符来表示,也可以用数字来表示

权限 对应数字 意义
r 4 可读
w 2 可写
x 1 可执行

对目录来说

r:可以查询目录下的文件(ls ll 命令)

w:具有修改目录结构的权限,比如新建文件和目录,删除此目录下文件和目录(cp mv touch rm 命令)

x:目录有执行权限但是不能运行,可以进入目录(cd 命令)

对文件来说最高权限是 x,对于目录来说最高权限是 w,一般给目录赋予权限 0 ,5(rx),7(rxw),赋予 4 ,1, 6 都是没有意义的。对于文件能否删除,首先要对目录具有执行权限,同时对文件也具有执行权限。

如何修改文件权限

chmod

chmod 命令可以用来变更文件或目录的权限。

用法:chmod [options] mode files

mode : 权限设定字串,格式如下 :

[ugoa...][[+-=][rwxX]...][,...]

其中:

  • u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。u 用户 g 组 o 其它 a 所有用户(默认)
  • + 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
  • r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。

其他参数说明:

  • -c : 若该文件权限确实已经更改,才显示其更改动作(-c,--changes 只输出被改变文件的信息)
  • -f : 若该文件权限无法被更改也不要显示错误讯息(--silent,--quiet,当 chmod 不能改变文件模式时,不通知文件的用户)
  • -v : 显示权限变更的详细资料
  • -R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递回的方式逐个变更)--recursive 可递归遍历子目录,把修改应到目录下所有文件和子目录
  • --help : 显示辅助说明、输出帮助信息。
  • --version : 显示版本
  • --reference=filename 参照 filename 的权限来设置权限
  • -v,--verbose 无论修改是否成功,输出每个文件的信息

例子:

chmod u+r 文件名          #给属主加读权限
chmod a+x 文件名          #给所有用户和其他人加执行权限
chmod g-w file1          #file1的属组去掉写权限)
chmod o=x 文件名          #其他用户只有执行权限
chmod a=- 文件名          #去除所有用户的权限
chmod ug=rw,o=r file      #给属主属组读写权限,给其他用户读权限
chmod 644 file                #给属组读写权限,其他用户和属组为读权限)

chown

用来改变文件或目录的所有者和所属用户组

用法:chown [-cfhvR] [--help] [--version] user[:group] file...

参数说明:

  • user : 新的文件拥有者的使用者 ID
  • group : 新的文件拥有者的使用者组(group)
  • -c : 显示更改的部分的信息
  • -f : 忽略错误信息
  • -h :修复符号链接
  • -v : 显示详细的处理信息
  • -R : 处理指定目录以及其子目录下的所有文件
  • --help : 显示辅助说明
  • --version : 显示版本

例子:

chown root:root  vimTest.txt      #将vimTest.java的属主和属组改为root:root

chgrp

可以单独更改属组

用法:chgrp [-cfhRv][--help][--version][所属群组][文件或目录...] 或 chgrp [-cfhRv][--help][--reference=<参考文件或目录>][--version][文件或目录...]

参数说明:

 -c 或--changes 效果类似"-v"参数,但仅回报更改的部分。

  -f 或--quiet 或--silent  不显示错误信息。

  -h 或--no-dereference  只对符号连接的文件作修改,而不更动其他任何相关文件。

  -R 或--recursive  递归处理,将指定目录下的所有文件及子目录一并处理。

  -v 或--verbose  显示指令执行过程。

  --help  在线帮助。

  --reference=< 参考文件或目录 >  把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同。

  --version  显示版本信息。

例子:

chgrp root vimTest.txt          #将vimTest.java的属组改为root
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    944 引用 • 943 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...