当前位置: 首页 > news >正文

Linux:账号和权限管理(一)


文章目录

  • 用户账号和组账号概述
    • 用户账号
    • 组账号
    • UID和GID
  • 管理账号文件
    • 用户账号文件:/etc/passwd
      • 字段说明
    • 用户密码文件:/etc/shadow
      • 字段说明
  • 无密码登录
  • shell环境(面试题)(默写至少3个)
    • 1. Shell环境
    • 2. 系统命令
  • 添加用户账号-useradd
    • 解释
    • 格式
    • 常用选项
    • 示例
  • 为用户账号设置密码-passwd
    • 说明
    • 格式
    • 常用选项
    • 示例
  • 修改用户账号属性-usermod
    • 格式
    • 常用选项
    • 示例
  • 出现-bash-4.2$的解决方法
  • 删除用户账号-userdel
    • 格式
    • 常用选项
  • 用户账号的初始配置文件:profile
    • .bash和.bash_profile的区别
    • .bashrc
    • .bash_profile
    • 区别
    • 示例内容
      • .bashrc
      • .bash_profile
  • 组账号文件:group、gshadow
    • 示例
    • 字段说明
  • 添加组账号-groupadd
    • 格式
    • 常用选项
    • 示例
  • 添加删除组成员-gpasswd
    • 格式
    • 常用选项
    • 示例
  • 删除组账号-groupdel
    • 格式
    • 示例
  • 查询用户所属的组-groups
    • 格式
  • 查询用户身份标识-id
    • 格式


用户账号和组账号概述

Linux基于用户身份对资源访问进行控制。

用户账号

  • 超级用户
    • root用户是Linux操作系统中默认的超级用户账号,对本主机拥有最高的权限。系统中超级用户是唯一的。超级用户并不是按照名称来定义的,而是通过UID为0来标识。
  • 普通用户
    • root用户或其他管理员用户创建,权限受到限制,一般只在用户自己的宿主目录中拥有完整权限。
  • 程序用户
    • 在安装Linux操作系统及部分应用程序时,会添加一些特定的低权限用户账号。这些用户一般不允许登录到系统,仅用于维持系统或某个程序的正常运行,如bindaemonftpmail等。
  • su命令
    • 作用:只是切换到指定用户的身份。若不指定用户名默认root 用户。
    • 环境变量:shell环境、环境变量、工作目录等不会切换。
    • 使用场景:适用于需要临时获取另一个用户权限,但不需要完全进入其环境的场景。
  • su -命令
    • 作用:完全切换到指定用户。(切换同时加载用户的登录环境)若不指定默认用户名默认root用户。
    • 环境变量:shell、环境变量等都会切换到该用户,包括工作目录也会切换到该用户的主目录。再如也会执行目标用户的登录脚本。
    • 使用场景:适用于需要完全切换到另一个用户的环境,包括其环境变量和目录的场景。

组账号

  • 基本组(私有组)
    • 每个用户都有一个基本组,通常为创建用户时指定的组。
    • /etc/passwd文件中第4字段记录的即为该用户的基本组GID号。
  • 附加组(公共组)
    • 用户除了基本组以外,还可以加入一个或多个附加组。这些附加组用于进一步分配权限。

UID和GID

  • UID (User IDentity, 用户标识号)
    • 管理员: root,UID为0。
    • 程序用户: UID范围为1-499(CentOS 6以前),1-999(CentOS 7以后)。
    • 普通用户: UID范围为500+(CentOS 6以前),1000+(CentOS 7以后)。
  • GID (Group IDentify, 组标识号)
    • 每个组都有一个唯一的GID,用于标识该组。
    • 对守护进程和用户进行权限分配。

一个用户可以属于多个组。

管理账号文件

在早期的UNIX操作系统中,用户帐号的密码信息是保存在passwd文件中的,不法用户可以很容易的获取密码字串并进行暴力破解,因此存在一定的安全隐患。后来经改进,将密码转存入专门的shadow文件中,而passwd文件中仅保留密码占位符“x”

用户账号文件:/etc/passwd

保存用户名称、宿主目录、登录Shell等基本信息。

基于系统运行和管理需要,所有用户都可以访问passwd文件中的内容,但是只有root用户才能进行更改。

示例行

root:x:0:0:root:/root:/bin/bash

字段说明

字段1:用户帐号的名称

字段2:用户密码占位符“x”

字段3:用户帐号的UID号

字段4:所属基本组帐号的GID号

字段5:用户全名(登录用户名)

字段6:宿主目录

字段7:登录Shell信息(/bin/bash为可登陆系统,/sbin/nologin和/bin/false为禁止用户登陆系统)

用户密码文件:/etc/shadow

保存用户的密码、账号有效期等信息

默认只有root用户能够读取内容,且不允许直接编辑该文件中的内容。

示例行

root:$6$VyOUGqOCSv5HILM1wagZC/FwGfnrtJFnIT:18445:0:99999:7:::

字段说明

字段1:用户帐号的名称

字段2:使用MD5加密的密码字串信息,当为”*”或”!”时表示此用户不能登录到系统。若该字段内容为空,则该用户无须密码即可登录系统

字段3:上次修改密码的时间,表示从1970年01月01日算起到最近一次修改密码时间隔的天数

字段4:密码的最短有效天数,自本次修改密码后,必须至少经过该天数才能再次修改密码。默认值为0,表示不进行限制

字段5:密码的最长有效天数,自本次修改密码后,经过该天数以后必须再次修改密码。默认值为99999,表示不进行限制

字段6:提前多少天警告用户密码将过期,默认值为7

字段7:在密码过期之后多少天禁用此用户

字段8:帐号失效时间,指定了用户作废的天数(从1970年01月01日起计算)为空,表示账号永久可用
字段9:保留字段(未使用)

无密码登录

所有用户(普通用户和伪用户)的密码都是"!!“或”*",代表没有密码是不能登录的。

密码项为"!!“或”*"

  • 普通用户"!!":表示账户还没有设置密码。新创建的用户如果不设定密码,密码项会是"!!",不能登录。

    执行命令useradd newuser后,新用户newuser的密码项会是"!!"。

  • 伪用户"*":通常用于系统账户,表示账户无法使用密码登录。(伪用户是系统中的特殊账户,通常用于系统进程和服务,而不是实际登录。)

  • 用户间切换仍需密码:虽然密码项为"!!“表示用户没有密码,实际上普通用户之间的切换仍然需要密码验证。即使某个用户的密码项为”!!",也不能在没有密码的情况下登录。

删除密码使可以无密码登录

  • 删除密码:使用passwd -d username可以删除指定用户的密码,使得用户可以在不需要密码的情况下登录。

    删除示例: sudo passwd -d newuser ,此时newuser就可以在不需要密码的情况下登录,但这会降低系统的安全性。

    删前删后字段:删除密码前 newuser:!!:18733:0:99999:7::: ,删除密码后 newuser::18733:0:99999:7::: ,密码项变为空值,即可无密码登录。

shell环境(面试题)(默写至少3个)

Linux系统中的Shell环境多种多样,它们为用户提供了与操作系统交互的接口。

1. Shell环境

  1. /bin/bash:Bash(Bourne Again SHell),是最常用的Shell之一,也是大多数Linux系统默认的Shell。允许用户在命令行界面下输入命令并执行,提供丰富的命令和脚本语言功能,兼容许多其他的Unix Shell。
  2. /bin/sh:Bourne Shell或其符号链接,通常指向系统默认的Shell(如Bash或Dash)。提供基本的命令行和脚本功能,广泛用于系统脚本和任务。
  3. /bin/zsh:Z Shell,是一种功能丰富的Shell环境,具有强大的定制和扩展能力。提供先进的自动补全、语法高亮和脚本编写功能,常被高级用户和开发者使用。
  4. /bin/tcsh:Tenex C Shell,是C Shell的增强版本,提供脚本编写和命令处理能力。具有类似C语言的语法结构,适用于复杂脚本和系统管理任务。
  5. /bin/dash:Debian Almquist Shell,轻量级的Shell,速度快,资源占用少。主要用于系统脚本,确保脚本在最小的系统资源消耗下运行。
  6. /bin/ksh:Korn Shell,具有高级编程特性,适用于复杂脚本和自动化任务。提供强大的命令行编辑和脚本编写功能,是一种兼具传统和现代特性的Shell环境。

2. 系统命令

  • /sbin/nologin:用于禁止用户登录的程序。当某个用户的登录Shell设置为/sbin/nologin时,系统会拒绝该用户登录并显示一条信息。
  • /sbin/sync:用于将文件系统缓存中的数据写入磁盘,确保数据的一致性和完整性。
  • /bin/false:一个什么都不做,立即返回非零退出状态的命令。也被用来禁止用户登录。当用户尝试登录时,系统会立即结束会话,且用户不会收到任何错误或提示信息。
  • /bin/ls:用于列出目录内容的命令。
  • /bin/cp:用于复制文件或目录的命令。
  • /bin/mv:用于移动或重命名文件或目录的命令。
  • /bin/rm:用于删除文件或目录的命令。

可以通过echo $SHELL命令来查看当前正在使用的Shell环境;

通过cat /etc/shells命令来查看当前系统安装的所有Shell种类。

添加用户账号-useradd

解释

在/etc/passwd 文件和/etc/shadow 文件的末尾增加该用户账号的记录。

若未明确指定用户的宿主目录,则在/home日录下自动创建与该用户账号同名的宿主目录,并在该目录中建立用户的各种初始配置文件。

若没有明确指定用户所属的组,则自动创建与该用户账号同名的基本组账号,组账号的记录信息将保存到/etc/group 和/etc/gshadow 文件中。

格式

useradd [选项]... 用户名

常用选项

  • -u:指定用户的UID号,要求该UID号码未被其他用户使用。
  • -d:指定用户的宿主目录位置(当与-M一起使用时,不生效)。
  • -e:指定用户的账户失效时间,可使用YYYY-MM-DD的日期格式。
  • -g:指定用户的基本组名(或使用GID号),对应的组名必须已存在。
  • -G:指定用户的附加组名(或使用GID号),对应的组名必须已存在。
  • -M:不建立宿主目录。
  • -s:指定用户的登录Shell,(比如/bin/bash为可登陆系统,/sbin/nologin和/bin/false为禁止用户登陆系统)。

示例

不添加任何属性和权限控制添加用户lisi

useradd test1      #创建用户id test1           #查看用户信息

输出以下内容(用户ID,组ID,附加组ID)

uid=1001(test1)gid=1001(test1)=1001(test1)

用户态最高权限是root,内核态不是,最高权限的身份也不会维护在passwd里。

查看文件中显示信息(tail也可以)

cat /etc/passwd | grep test  #过滤test行 

输出以下内容,没有指定登录shell默认/bin/bash

test1:x:1001:1001::/home/test1:/bin/bash

添加一个新的用户:

用户的用户名为test2;UID为1002;主目录为/opt/test;所属主组为group3;附加组为group03;登录shell为/bin/bash。

useradd -u 1002 -d /opt/test -g group3 -G group03 -s /bin/bash test2

若提示组不存在,要先新建组

groupadd group3
groupadd group03groupadd -g 88 group33 ##-g 88:指定新组的GID为88

可以查看组列表

tail -f /etc/group

为用户账号设置密码-passwd

说明

  • root用户
    • 可以使用 passwd 命令指定用户名作为参数,对指定用户的密码进行管理。
  • 普通用户
    • 只能使用 passwd 命令修改自己的密码。

格式

passwd [选项]... 用户名

常用选项

  • -d:清空指定用户的密码,使其仅使用用户名即可登录系统。
  • -l:锁定用户账户,锁定的用户账号将无法通过文字界面登录(图形化界面可能仍可登录)。
  • -S:查看用户账户的状态,检查账户是否被锁定。
  • -u:解锁用户账户,使其可以重新登录系统。

示例

  • 修改用户 username 的密码:

    passwd username
    
  • 从标准输入读取密码并设置用户 username 的密码(需要 root 权限):

    echo "123" | passwd --stdin username
    

修改用户账号属性-usermod

用于修改用户账号的属性。

格式

usermod [选项]... 用户名

常用选项

  • -u:指定用户的UID号。格式usermod -u uid号 username 。要求该UID号未被其他用户使用。
  • -d:修改用户的宿主目录位置。
  • -e:修改用户的账户失效时间,使用 YYYY-MM-DD 的日期格式。
  • -g:修改用户的基本组,使用组名或GID号。
  • -G:添加用户到附加组,使用组名或GID号。
  • -s:指定用户的登录 Shell。
  • -L:锁定用户账户,使其无法登录。
  • -U:解锁用户账户,使其可以重新登录。

示例

[root@localhost ~]# usermod -u 1003 test  # 修改用户的UID  
[root@localhost ~]# usermod -d /home/test test  # 修改用户的宿主目录   
[root@localhost ~]# usermod -s /sbin/nologin test  # 指定用户的登录Shell
#注:通常/nologin位于/sbin/ 
[root@localhost ~]# usermod -L test  # 锁定用户账户  
[root@localhost ~]# usermod -U test  # 解锁用户账户

出现-bash-4.2$的解决方法

-bash-4.2表示使用的是bash shelli程序的版本号是4.2,$表示当 前用户是普通用户

[root@localhost home]#cp /etc/skel/.bashrc /home/test/ 
[root@localhost home]#cp /etc/skel/.bash_profile /home/test/ 
[root@localhost home]#chown test:test /home/test/.bash_profile 
[root@localhost home]#chown test:test /home/test/.bashrc 

删除用户账号-userdel

格式

userdel [-r] 用户名 

常用选项

  • -r:将该用户的宿主目录一并删除**(常用)**

  • -f:强制删除用户账户,尤其删除一个正在使用中的用户账户。

    注意:可能会导致一些问题,如正在运行的进程无法正确清理其资源。

提示删除用户被占用,但是又没有登录此用户,可能是因为在终端内切换用户导致,此行为会开启多个终端,可以使用ctrl+D退出当前终端。

用户账号的初始配置文件:profile

/etc/profile是系统的全局配置文件,对所有用户都有效。包含一些系统级别的环境变量和默认的系统级别的 shell 配置。

用户登录到系统时,系统会首先执行/etc/profile文件,然后再执行该用户的个人配置文件(如.bashrc、.bash_profile等)。

vim /etc/profilealias cat='cat -n' #别名设置(一般不用)source /etc/profile

简要说明

  • source:在当前shell环境中执行指定文件的内容。
  • /etc/profile:一个全局配置文件,包含系统范围内的环境变量和启动脚本设置。

.bash和.bash_profile的区别

.bashrc.bash_profile 是两个常见的 shell 配置文件,主要用于配置用户的 shell 环境。

.bashrc

  • 位置:位于用户的主目录下,路径为 ~/.bashrc
  • 执行时机:每次启动一个新的交互式非登录 shell 时(例如打开一个新终端窗口或在终端中运行 bash 命令)。
  • 作用:设置命令行提示符、别名、函数、环境变量等。
  • 典型内容:包含命令别名、环境变量定义、函数定义等。

.bash_profile

  • 位置:位于用户的主目录下,路径为 ~/.bash_profile
  • 执行时机:每次启动一个新的登录 shell 时(例如用户登录、通过 SSH 连接到服务器、在终端中运行 bash --login 命令)。
  • 作用:初始化用户环境,设置路径、环境变量、启动程序等。
  • 典型内容:通常包含对 .bashrc 文件的引用、环境变量定义、路径设置等。

区别

  1. 执行时机
    • .bashrc:每次启动一个新的交互式非登录 shell 时执行。
    • .bash_profile:每次启动一个新的登录 shell 时执行。
  2. 常见用法
    • .bashrc:用于配置与交互式 shell 相关的设置,如别名和命令行提示符。
    • .bash_profile:用于设置环境变量、启动程序等。
  3. 典型内容
    • .bashrc:常见内容包括命令别名、函数定义、环境变量等。
    • .bash_profile:常见内容包括调用 .bashrc、设置 PATH 变量、环境变量等。

示例内容

.bashrc

# 设置命令别名
alias ll='ls -la'# 定义环境变量
export EDITOR=nano

.bash_profile

# 调用 .bashrc 文件
if [ -f ~/.bashrc ]; then. ~/.bashrc
fi# 设置 PATH 变量
export PATH=$PATH:$HOME/bin

组账号文件:group、gshadow

/etc/group:保存组帐号基本信息

/etc/gshadow:保存组帐号的密码信息

示例

grep "postfix" /etc/groupmail:x:12:postfix
postfix:x:89:

字段说明

字段1:组帐号的名称

字段2:占位符“x”

字段3:组账号的GID号

字段4:组账号包含的用户成员(一般不包括基本组对应的用户帐号),多个成员之间以逗号",”分隔

添加组账号-groupadd

格式

groupadd [-g GID] 组账号名

常用选项

  • -g:指定 GID号

示例

#添加组账号
[root@localhost ~]# groupadd test
[root@localhost ~]# tail -f/etc/group
#指定GID号添加组账号
[root@localhost ~]# groupadd -g 88 group111
[root@localhost ~]# tail -f/etc/group

添加删除组成员-gpasswd

格式

gpasswd [选项]... 组账号名 

常用选项

-a:向组内添加一个用户

-d:从组内删除一个用户成员

-M:定义组成员列表,以逗号分隔

示例

[root@localhost ~]# useradd aaa
[root@localhost ~]# useradd bbb
#将用户yht、hcy和qzz加入到dn用户组中
[root@localhost ~]# gpasswd -M aaa,bbb,ccc group111
[root@localhost ~]# cat /etc/group
#添加用户到组
[root@localhost ~]# gpasswd -a test1 group001
[root@localhost ~]# cat /etc/group | grep group001

删除组账号-groupdel

格式

groupdel 组账号名

示例

groupdel test
grep "test" /etc/group

查询用户所属的组-groups

格式

groups [用户名]

注:没有 id [用户名] 显示的详细

查询用户身份标识-id

格式

id [用户名]

相关文章:

  • css 数字平铺布局
  • uni-app关于跨域问题(十七)
  • Go语言使用cobra开发第一个命令行程序
  • 【redis】springboot 用redis stream实现MQ消息队列 考虑异常ack重试场景
  • The C programming language (second edition,KR) exercise(CHAPTER 7)
  • 苹果手机清理软件:让你的iPhone保持最佳状态
  • JavaScript前端面试题——fetch
  • 上海冷链配送新篇章 华鼎冷链科技以卓越服务餐饮品牌
  • 技术汇总笔记7:switch 嵌套用法 和 改进 (条件分支相关内容)
  • Excel文件处理excel内容
  • FastAPI技巧
  • HTML-03.新浪新闻-标题-样式2
  • Arco Design 之Table表格
  • 【医学影像】无痛安装mamba
  • 字节实习面试
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • go语言学习初探(一)
  • mockjs让前端开发独立于后端
  • Redis 懒删除(lazy free)简史
  • TCP拥塞控制
  • 给第三方使用接口的 URL 签名实现
  • 构造函数(constructor)与原型链(prototype)关系
  • 计算机在识别图像时“看到”了什么?
  • 类orAPI - 收藏集 - 掘金
  • - 转 Ext2.0 form使用实例
  • gunicorn工作原理
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​Linux·i2c驱动架构​
  • #{}和${}的区别是什么 -- java面试
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • #预处理和函数的对比以及条件编译
  • $jQuery 重写Alert样式方法
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (原创)可支持最大高度的NestedScrollView
  • (转)重识new
  • .NET CORE 第一节 创建基本的 asp.net core
  • .net 发送邮件
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——
  • [51nod1610]路径计数
  • [Android] 修改设备访问权限
  • [CareerCup] 17.8 Contiguous Sequence with Largest Sum 连续子序列之和最大
  • [Cloud Networking] Layer Protocol (continue)
  • [CSDN首发]鱿鱼游戏的具体玩法详细介绍
  • [Dxperience.8.*]报表预览控件PrintControl设置
  • [Flutter] extends、implements、mixin和 abstract、extension的使用介绍说明
  • [FxCop.设计规则]8. 也许参数类型应该是基类型
  • [Java安全入门]三.CC1链