news 2026/10/2 19:55:11

Linux用户管理入门到实战:登录、用户组与权限配置全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux用户管理入门到实战:登录、用户组与权限配置全解析

1. 写在前面:这节笔记要解决什么问题

Linux用户管理这块,经常被人当成“会敲几个命令就行”的小事。可实际一上手,添加用户、删除用户、切换用户、调整用户组,每一步都可能踩坑。这篇笔记围绕用户登录与注销、用户管理以及用户组来展开,把我在实际使用中整理过的命令、参数和踩坑记录一起写出来,算是《Linux笔记》系列的第三篇。

这篇内容适合谁看?给两类人。一类是刚装好虚拟机、刚开始接触Linux的初学者,另一类是准备运维面试、需要把用户权限这部分知识系统过一遍的兄弟。看完之后,你能搞清楚登录和注销背后的身份验证机制,能独立完成添加、删除、查询用户的操作,能分清su和sudo的关系,也能弄明白“所有者、所在组和其他组”这三个权限维度到底是怎么回事。文中的所有命令我都在CentOS和Ubuntu上实测过,Debian系和RedHat系在细节上会有一点点差异,用到的时候我会单独说明。

有一点提前说清楚:Linux下很多操作需要root权限,我默认你是在自己的测试环境里折腾,别拿生产服务器练手,这是原则问题。

2. 用户登录与注销:从开机到命令行的完整过程

2.1 登录的本质:系统如何验证你的身份

很多人觉得登录不就是输入用户名和密码吗?其实没那么简单。Linux的登录验证过程,核心是核对两份文件:/etc/passwd和/etc/shadow。/etc/passwd保存用户的基本信息,比如用户名、UID、用户组ID、家目录和登录Shell;/etc/shadow保存加密后的密码哈希、密码修改时间、过期时间等敏感字段。/etc/passwd是全局可读的,所以密码绝对不能放在里面,只能放在权限为000的/etc/shadow里。

我们拿一条典型的passwd记录来拆解:

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

用冒号分成7个字段:用户名,密码占位符x,UID,GID,描述信息,家目录,登录Shell。其中UID为0表示超级用户,普通用户的UID一般是1000以后,系统用户像bin、daemon这些通常是1到999。

登录的时候,系统会先用你输入的用户名去/passwd里查找UID,再去/shadow里比对密码哈希。如果都通过,就会调用passwd记录中指定的登录Shell,通常会启动一个bash,同时加载环境变量文件,比如/etc/profile、~/.bash_profile、~/.bashrc这些。这也是为什么有时候你用su切换用户之后,环境变量感觉“不对劲”,多半是Shell加载的初始化文件不对。

2.2 注销与退出:别把关机当成注销

注销和关机是两码事。注销是结束当前登录会话,回到登录界面,系统还在运行;关机是关闭整个系统。在图形界面里,注销通常是“退出账户”,在命令行里,注销方式主要有三种:exit、logout、Ctrl+D。

  • exit:退出当前Shell进程。如果在登录Shell里执行,就相当于注销;如果在子Shell或脚本里执行,只退出当前Shell层。
  • logout:只能用于登录Shell(就是那个直接由登录流程启动的Shell),普通子Shell里执行会提示“not login shell”。
  • Ctrl+D:向终端发送EOF,主动终止当前Shell输入流,效果等同于exit,但习惯上大家更常用exit。

我经常看到有人问“为什么我敲了logout没反应”,多半是你当前处在子Shell里,比如通过su切换用户但没有用su -,或者手动bash进入了一个新的子Shell。这时候用exit才对。

2.3 实操演示:切换虚拟终端与注销登录

Linux默认提供6个文本终端,可以通过Ctrl+Alt+F1到F6切换,F7或更高通常是图形界面。不同的发行版可能略有不同,比如Ubuntu桌面版可能Ctrl+Alt+F1到F6是文本终端,F7回到图形界面。CentOS/RHEL也类似。

比如你现在在tty1,想切到tty2,按Ctrl+Alt+F2;想退出当前登录,直接输入exit。如果想查看当前有哪些登录会话,可以用who命令:

who # 输出示例: # root tty1 2025-01-15 09:32 # zhangsan pts/0 2025-01-15 10:25 (192.168.1.100)

第一列是用户名,第二列是登录终端,tty开头是本地终端,pts开头是远程终端(比如SSH),后面是登录时间和来源IP。这个命令在排查多用户入侵或异常登录时非常实用,我建议你把这个命令记牢。

3. 用户管理:动手添加、删除和查询用户

3.1 添加用户:useradd与adduser的区别

添加用户的命令主要有两个:useradd和adduser。这里先给你提个醒:在RedHat系发行版(CentOS、RHEL、Fedora)里,useradd和adduser基本是同一个命令,只是符号链接或者兼容别名;但在Debian系(Ubuntu、Debian)里,adduser是一个Perl脚本,它会交互式地帮你创建家目录、设置密码、填备注信息,用起来更友好。新手在Ubuntu上直接adduser,在CentOS上老老实实用useradd。

useradd的常用参数,我整理成一张表:

参数作用示例
-m创建家目录useradd -m zhangsan
-s指定登录Shelluseradd -m -s /bin/bash zhangsan
-d指定家目录路径useradd -m -d /home/zhangsan zhangsan
-G指定附加组useradd -m -G wheel zhangsan
-u指定UIDuseradd -m -u 1500 zhangsan
-c添加备注useradd -m -c "Zhang San" zhangsan

只看参数还不行,关键是要理解哪些是必选项。如果你在CentOS上执行useradd zhangsan而不加-m,系统不会自动创建/home/zhangsan目录,这时候用户登录后会没有家目录,可能出现无法写入配置文件的奇怪问题。Ubuntu的useradd默认行为也不一样,默认不会创建家目录,但adduser会创建。

我个人的习惯是,不管在哪个发行版上,都显式加上-m -s /bin/bash,这样行为可预期,不会因为发行版差异翻车。

创建用户之后还要设置密码,否则用户无法登录:

passwd zhangsan

执行后会提示输入两次新密码。注意,密码输入的时候不会显示任何字符,这不是没输入,而是安全设计,别被吓到。

3.2 查询用户信息:id、whoami、finger、w

查询用户信息这个环节容易被忽略,但它其实最能反映你对系统的掌控度。先看id命令:

id zhangsan # uid=1002(zhangsan) gid=1002(zhangsan) 组=1002(zhangsan)

id会输出用户的UID、主组GID和所有附加组。如果你发现用户不在某个组里,用id一眼就能看出来。

whoami是“我是谁”,输出当前有效用户名,适合在脚本里判断当前身份。finger可以查看用户更详细的信息,比如真实姓名、家目录、Shell、最后一次登录时间等,不过有些系统默认没装finger,需要手动安装。

w命令是who的升级版,能显示当前登录用户以及他们正在执行的命令,还能显示load average和uptime。我在排查系统负载异常的时候,第一件事就是跑w,看是不是有人跑了奇怪的进程。

last命令则用来查登录历史,会读取/var/log/wtmp文件,显示用户、终端、登录时间、登出时间、来源IP。如果有人从异常IP登录过,last里能看到。

3.3 修改与删除用户:usermod与userdel

修改用户信息用usermod,它和useradd参数长得几乎一样,区别在于useradd是新建,usermod是修改。常用场景有几个:

  • 修改用户登录Shell:usermod -s /sbin/nologin zhangsan
  • 锁定用户(禁止登录):usermod -L zhangsan
  • 解锁用户:usermod -U zhangsan
  • 修改用户附加组:usermod -G docker zhangsan
  • 修改用户的家目录:usermod -d /new/home -m zhangsan

这里特别注意:用usermod -G docker zhangsan时,如果不加-a(append),会把用户从原有附加组里踢出去,只保留docker组。所以正确的追加方式应该是usermod -aG docker zhangsan。这个坑我踩过不止一次,折腾完发现用户突然不在sudo组里了,排查半天才反应过来。

删除用户用userdel,常用参数是-r,表示连同家目录和邮件目录一起删除:

userdel -r zhangsan

如果不带-r,用户删除后家目录还会残留,时间长了会堆积很多没主的垃圾文件。但反过来,如果你有保留该用户数据的需求,就别带-r。生产环境删除用户前,一定要确认该用户名下是否有系统服务或者计划任务,先检查,再删除。

3.4 实操注意事项:UID、家目录与Shell的坑

用户管理的坑主要来自几个容易被忽略的地方。

第一个是UID冲突。如果你手工指定UID,比如useradd -u 1002 zhangsan,但系统里已经存在一个UID 1002的用户,系统会报错。Linux识别用户其实是靠UID,不是靠用户名。你在ls -l里看到文件所有者显示成数字而不是用户名,大概率就是那个UID对应的用户已经不存在了。

第二个是Shell问题。如果用户被设置为/sbin/nologin或/bin/false,他通过SSH登录会直接被拒绝,提示“This account is currently not available”。这通常用于那些只需要运行服务、不允许人登录的系统账户。如果哪天你发现某个用户登录不了,先用finger 用户名或getent passwd 用户名看一眼他的Shell。

第三个是家目录权限。创建用户后家目录的权限默认是700,只有用户自己能访问。如果你希望组内其他用户能访问,比如共享目录,需要单独调整。这是设计使然,不是bug。我在搭测试环境时,经常要给多个用户开放同一个工作目录,这时候就要用用户组配合目录权限来解决,具体在第5章展开。

4. 切换用户:su和sudo,别再傻傻分不清

4.1 su的基础用法:切换用户与加载环境变量

su(switch user)是我们最常用的切换用户命令。最基础的用法:

su zhangsan # 切换到zhangsan,但保留当前环境变量 su - zhangsan # 切换到zhangsan,并模拟其完整登录环境 su - # 直接切换到root,并加载root环境

有横杠-和没横杠的区别非常关键,新手经常因为没加横杠导致环境变量混乱。例如你当前是root,执行su zhangsan后,你虽然变成了zhangsan的身份,但环境变量PATH、HOME可能还是root的,这时候你敲echo $HOME会发现还是/root,安装或执行某些依赖HOME路径的程序就会出现诡异现象。

而su - zhangsan会重新读取zhangsan的登录初始化文件,PATH变成/usr/local/bin:/usr/bin:/bin这种普通用户路径,HOME变成/home/zhangsan,一切回到“zhangsan正常登录”的样子。所以在切换用户时,我强烈建议你习惯性带上-。

另外,普通用户执行su切换到root时,需要输入root密码;而root切换到其他用户不需要密码。如果你明明知道root密码却提示认证失败,看一下是不是键盘布局或者大小写问题,我就遇到过密码没错但NumLock没开的尴尬。

4.2 sudo的权限委派机制

su的弊端很明显:普通用户一旦知道root密码,就能以root身份干任何事,这不是很好的权限管控方式。sudo的出现解决了这个问题:普通用户输入自己的密码,获得被授予的root权限,而不是共享root密码。

sudo的配置在/etc/sudoers文件里,强烈建议用visudo命令来编辑,因为visudo会做语法检查,避免你写错配置后sudo直接不可用。一个常见配置是把用户加入wheel组(RedHat系)或sudo组(Debian系),该组默认具备sudo权限。所以我们在添加用户时,如果希望它能执行管理命令,可以这样操作:

usermod -aG wheel zhangsan # CentOS/RHEL usermod -aG sudo zhangsan # Ubuntu/Debian

如果你需要更精细的权限,可以在/etc/sudoers里指定:

zhangsan ALL=(ALL) ALL

这行含义是:用户zhangsan可以从任何主机登录,以任何用户身份执行任何命令。还有更精细的,比如只允许重启服务:

zhangsan ALL=(ALL) /usr/bin/systemctl restart nginx

这样zhangsan只能执行指定命令,其他sudo命令一律拒绝。

4.3 实操对比:su - root vs sudo su

很多教程会告诉你直接sudo su切到root,但这个操作其实值得琢磨一下。sudo su的意思是:先用sudo的权限执行su,因为sudo已经把当前用户临时提升为root,所以su不需要再输入root密码,直接变成root。这种方式有没有问题?有。

一是日志层面,/var/log/secure里记录的会变成当前用户通过sudo执行了su,但后续所有操作仍然以root身份进行,审计线索会被模糊掉。如果运维规范强调审计,更推荐的做法是每一条管理命令都加sudo,而不是一次性切到root乱搞。

二是权限管控失效。如果所有普通用户都能sudo su,那sudo的精细授权就名存实亡了。所以好的习惯是:少用sudo su,尽量用sudo command直接执行某条命令。如果需要持续操作,就明确使用su - root并输入root密码,至少在审计上是清晰的。

我在实际工作中,日常管理服务器都是用自己的普通账号加上sudo执行具体命令,只有需要批量修改系统配置、安装软件包时才会su到root。这个习惯能帮你减少很多“误操作把系统搞挂”的风险。

5. 用户组:所有者、所在组和其他组

5.1 用户组的概念:为什么要分组

用户组(group)就是把一堆用户归到一个集合里,方便统一管理权限。Linux的权限模型里,每个用户必须属于一个主组(primary group),同时可以属于多个附加组(supplementary groups)。主组决定用户创建文件时默认的组归属,附加组决定用户能访问哪些额外权限资源。

我们为什么需要用户组?典型场景:一个项目组有三个人,要在服务器上共享一个目录,但又不希望其他用户看到。如果逐个用户给目录授权,权限会非常混乱。正确的做法是:创建一个dev组,把三个人加进去,然后把共享目录的所属组改成dev,目录权限设置为770,这样只有dev组内的用户能读、写、执行,其他用户一概不能访问。

用户组信息保存在/etc/group文件里,每个组一行,格式是:组名:密码占位符:GID:组成员列表,比如dev:x:1005:zhangsan,lisi,wangwu。组成员列表只包含附加组用户,不包含主组成员。

5.2 关键命令:groupadd、usermod -G、gpasswd

创建用户组用groupadd:

groupadd dev

如果需要指定GID,加-g 2000。删除组用groupdel,但前提是该组不是任何用户的主组。如果你删一个正在使用的主组,系统会报错,这是保护机制。

把用户加入组,可以用usermod,也可以用gpasswd:

usermod -aG dev zhangsan gpasswd -a zhangsan dev # 和上面等效

把用户移出组:

gpasswd -d zhangsan dev

注意usermod -G不带-a是覆盖式修改,前面第3章已经提过,这里再说一遍:日常维护中,除非你真的想清空用户的附加组,否则不要丢-a。另外一个隐藏知识点:用户加入新组之后,如果当前已经登录,组权限不会立即生效,必须重新登录或者使用newgrp命令激活。

5.3 文件权限三元组中的所有者、所在组和其他组

理解了用户组,才能看懂Linux文件权限的长列表。随便找一个文件跑ls -l,你会看到类似这样的输出:

-rw-r--r-- 1 root root 1234 Jan 15 10:00 test.txt

权限位rw-r--r--共9个字符,按3个一组划分:所有者(user),所在组(group),其他用户(other)。所有者就是文件创建者,所在组就是文件归属的用户组,其他组就是除前两者之外的所有用户。每个组有r(读)、w(写)、x(执行)三个权限位。第5.1节的例子,共享目录权限770,表示所有者和所在组都有rwx权限,其他用户什么都没有(0)。

修改文件所有者和所在组的命令是chown和chgrp:

chown zhangsan:dev test.txt # 修改所有者为zhangsan,所在组为dev chgrp dev test.txt # 只修改所在组 chown :dev test.txt # 同上,只修改所在组

修改权限用chmod,既可以用数字(r=4, w=2, x=1),也可以用符号:

chmod 770 test.txt chmod u+rwx,g+rwx,o-rwx test.txt # 效果一样

5.4 实操示例:创建组并分配用户实现目录隔离

我在这里给你演示一个完整的操作流程,这也是我在搭项目环境时常用的一个模板。假设我要在/data/project下建共享目录,让dev组里的三个用户可以访问,其他用户禁止访问。

# 1. 创建用户组 groupadd dev # 2. 创建三个用户并加入dev组 useradd -m -s /bin/bash zhangsan useradd -m -s /bin/bash lisi useradd -m -s /bin/bash wangwu usermod -aG dev zhangsan usermod -aG dev lisi usermod -aG dev wangwu # 3. 创建共享目录并设置属组和权限 mkdir -p /data/project chown root:dev /data/project chmod 770 /data/project # 4. 验证 ls -ld /data/project # drwxrwx--- 2 root dev 6 Jan 15 11:00 /data/project

这样设置后,dev组三名成员都能在/data/project里创建和修改文件,其他用户连进入目录的权限都没有。但有个细节要注意:默认情况下,用户在共享目录里新建的文件,用户主组如果是dev,新建文件的所在组就是dev;如果用户主组是zhangsan自己,新建文件的所在组就是zhangsan,而不是dev,这样组内其他人就没法改了。

所以如果希望所有人在共享目录里创建的文件都自动归dev组,需要设置目录的setgid位:

chmod 2770 /data/project

权限数字前多出来的2就是setgid位。设置后,任何人在该目录创建新文件,文件的所在组自动继承为dev组。这个细节非常实用,也是很多运维面试喜欢考的隐藏点。

6. 常见问题与排查技巧实录

6.1 用户创建后无法登录

表现:用户用SSH登录,一直提示密码错误,或者密码正确但连接被拒绝。排查步骤:

  1. 用getent passwd 用户名确认用户存在。
  2. 用passwd -S 用户名查看用户状态,L开头说明被锁定了(passwd -u解锁)。
  3. 检查/etc/shadow里密码字段是否显示为!或*,是的话说明没有正常设置密码。
  4. 检查用户Shell是否被设为/sbin/nologin,如果是且确实需要登录,用usermod -s /bin/bash改回来。

还有一个容易被忽略的:SSH服务如果限制了AllowUsers,就算系统账号正常也登不进去,检查/etc/ssh/sshd_config里有没有AllowUsers或AllowGroups配置。

6.2 切换用户后提示符没有变化

表现:执行su zhangsan后,命令行提示符依然是之前的root或用户名,敲whoami却显示新用户,令人困惑。

原因:su不带-不会切换环境变量,PS1提示符变量也没有被重新加载。解决办法不是去改PS1,而是切换时使用su - zhangsan。如果你确实想保留当前环境,又想清晰看到身份,可以手动执行bash加载login shell配置,但更好的选择还是用su -。

我见过很多新手在这上面纠结,其实只要记住:需要完整登录环境就用带横杠的su,只需要快速切换身份执行命令就临时用不带横杠的su,然后命令执行完exit回来。

6.3 删除用户后文件归属显示为数字UID

表现:删除用户后,ls -l显示文件所有者和所在组变成一串数字。

原因:系统只通过UID和GID来识别用户和组,删除用户后,UID和GID在用户数据库里不存在了,系统没法反查名字,只能显示原始数字。如果这个文件还有保留价值,可以把它的属主改为现有用户:

chown -R zhangsan:zhangsan /path/to/file

如果文件确实不需要了,直接删除即可。这其实也是提醒我们,删除用户前一定要先盘点它遗留的文件,特别是/var/spool、/home和临时目录下的东西。

6.4 用户加入组后权限不生效

表现:执行usermod -aG docker zhangsan后,zhangsan已经登录,但执行docker命令还是提示权限不足。

原因:用户会话在启动时就已经确定了Groups成员关系,新加入的组需要重新登录才能生效。解决办法是退出当前会话重新登录,或者使用newgrp docker快速切换当前Shell的有效组。对于没有安装newgrp的环境,直接重新SSH登录即可。

这个问题的本质是内核在创建进程时把附加组ID列表固化到了进程里,不会动态更新。所以如果你在写自动化脚本需要立即生效,可以考虑用sg docker -c 'command'来指定组执行命令。

6.5 误删了用户组导致用户状态异常

表现:某个用户报错id: cannot find name for group ID 1002,或者用户组信息丢失。

原因:可能你删除了某个用户指定的主组。系统不会阻止这种行为,但这个用户的GID已经指向不存在的组,显示时就会出现找不到组名的情况。修复方法:先用id确认现有GID,再创建一个新的组号为原GID的组,或者直接修改用户主组:

groupadd -g 1002 oldgroup usermod -g oldgroup username

我更推荐后者,逻辑清晰也不会引发文件归属混乱。如果用户已经有很多文件归属旧GID,重新建组能让这些文件的组归属恢复显示。

7. 几个值得长期坚持的实操习惯

最后分享几个我在实际使用中慢慢养成的习惯,这些不是命令手册上会写的,但确实能帮你少走弯路。

第一,添加用户永远显式指定-m -s /bin/bash,这样家目录一定存在,Shell一定可用,不受发行版默认策略影响。如果你创建的是系统账户(比如跑Nginx的账户),那就用-r参数,系统账户不建家目录、不给交互Shell,权限尽量最小。

第二,凡是修改用户组的操作,统一使用usermod -aG,把“追加”写进肌肉记忆。覆盖式-G只有在你想重置用户附加组时才用,而且要格外小心。

第三,在生产环境操作前先备份关键配置文件,尤其是/etc/passwd、/etc/shadow、/etc/group、/etc/sudoers。Linux用户管理虽然灵活,但一旦改错,轻则普通用户登不进去,重则root权限丢失。我通常在批量操作前执行:

cp -p /etc/passwd /etc/passwd.bak.$(date +%Y%m%d) cp -p /etc/shadow /etc/shadow.bak.$(date +%Y%m%d) cp -p /etc/group /etc/group.bak.$(date +%Y%m%d) cp -p /etc/sudoers /etc/sudoers.bak.$(date +%Y%m%d)

第四,多练多试。用户管理是Linux里最基础也最核心的一块,你可以拿虚拟机反复折腾,创建用户、加组、改权限、删用户,把每个命令的输出仔仔细细看一遍。熟了之后,后面学文件权限、进程权限、容器权限都会轻松很多。

第五,遇到权限相关的问题,先看id输出,再看文件权限位,最后看进程是什么身份启动的。这个排查顺序可以解决90%以上的“明明有权限但操作不了”的疑难杂症。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/2 19:55:08

FlexSim发生器四种用法详解:从基础参数到复杂供料建模

在FlexSim里做仿真,十有八九是从拖一个发生器开始的。但很多人用了一年发生器,还只会调Inter-Arrival Time那一个参数,结果一遇到复杂的供料节奏就卡壳,要么手工改表、要么写一堆触发器,绕了大远路。这篇文章想聊的就是…

作者头像 李华
网站建设 2026/10/2 19:55:03

Windows软件卸载不干净?火绒卸载工具深度清理残留全攻略

1. 为什么卸载个软件这么难:先搞清残留从哪来 先说个最扎心的场景:你用 Windows 自带的“卸载程序”删掉某个软件,打开 C 盘一看,目录还躺着几十 MB 旧文件;再打开注册表编辑器,一搜软件名字,还…

作者头像 李华
网站建设 2026/10/2 19:54:26

Android Studio 模拟器 HAXM 报错:硬件加速方案与冲突排查

1. 先把报错看明白:它到底在抱怨什么你一觉醒来打开 Android Studio,点那个绿色的运行按钮,AVD 窗口没弹出来,反而在 Event Log 里刷了一行红字:intel haxm is required to run this AVD. HAXM is not installed. Inst…

作者头像 李华
网站建设 2026/10/2 19:54:22

云计算第一次作业实战指南:从概念到云主机部署全攻略

收到“云计算第一次作业”这个题目的时候,大部分人的第一反应其实是懵的:云计算这个概念还没完全吃透,老师就已经要求写报告、做实验了。我刚学云计算那会儿也一样,面对云平台的控制台,按钮一大堆,根本不知…

作者头像 李华
网站建设 2026/10/2 19:52:24

分布式锁原理与实战:Redis、ZooKeeper与数据库方案对比及避坑指南

分布式锁听起来像个老生常谈的技术点,但面试挂在这上面的人一抓一大把。早几年我做电商订单系统的时候,库存扣减和防重复支付两件事就把我折腾得不轻:服务从单体拆成多实例部署之后,原来顺手好用的synchronized和ReentrantLock突然…

作者头像 李华
网站建设 2026/10/2 19:52:19

Windows 11任务栏位置修改:TaskbarAl注册表键值详解

1. 为什么Windows 11任务栏位置成了“不可触碰的禁区”?Windows 11发布初期,微软就明确锁死了任务栏的左右居中三态切换能力——它只允许居中,且不提供系统级开关。这不是疏忽,而是设计决策:微软想用统一视觉语言强化“…

作者头像 李华