从零开始学Linux(八) 📅 2026/7/9 12:09:03 上一篇文章把环境变量从概念到操作整个过了一遍从全局变量和局部变量的区别到export导出、unset删除再到PATH的修改和数组变量的使用总算是把环境变量这块搞清楚了。今天继续往下推进课程到了用户管理和文件权限这一章。说实话这部分内容对我来说一直是个模糊地带平时在虚拟机里操作的时候经常遇到Permission denied的提示要么就是sudo一下能解决要么就是切到root用户但具体是什么原因导致权限不够、root和普通用户到底差在哪里我从来没真正搞明白过。这次借着课程的机会把用户管理、用户组和文件权限整个体系从头到尾理了一遍。Linux安全系统的核心是用户账户。每个能进入Linux系统的用户都会被分配一个唯一的用户账户用户对系统中各种对象的访问权限取决于他们登录系统时用的账户。用户权限是通过创建用户时分配的用户ID来跟踪的这个ID就是UID每个用户都有唯一的UID。但在登录系统时用的不是UID而是登录名登录名是用户用来登录系统的字符串同时会关联一个对应的密码。Linux系统使用/etc/passwd文件来将用户的登录名匹配到对应的UID值。root用户账户是Linux系统的管理员固定分配给它的UID是0。除了root之外还有系统用户Linux系统会为各种各样的功能创建不同的用户这些用户并不是真的用户而是系统上运行的各种服务进程访问资源用的特殊账户UID值通常在500以下。所有运行在后台的服务都需要用一个系统用户账户登录到Linux系统上。普通用户创建账户时大多数Linux系统会从500开始分配UID。/etc/passwd文件中的每行用户信息都以冒号作为分隔符划分为7个字段分别是用户名、用户密码x表示加密实际密码保存在/etc/shadow文件中、用户的UID、用户的组ID、用户的描述性信息、用户HOME目录的位置、用户的默认shell。只有root用户才能访问/etc/shadow文件查看时一定要加sudosudo这个命令就相当于root给普通用户的一份特权让普通用户也可以查看权限受制的文件内容。/etc/shadow文件中同样以冒号作为分隔符划分为9个字段包括用户名、加密后的密码、密码修改相关的时间信息等。可以直接登录root用户来绕过sudo的限制使用su root或su -命令然后输入root密码即可登录退出root用户用exit。添加新用户有两种命令useradd和adduser。useradd命令使用系统的默认值以及命令行参数来设置用户账户可以一次性创建新用户账户及设置用户HOME目录结构系统默认值被设置在/etc/default/useradd文件中。使用useradd -m username能在添加新用户时为新用户的HOME目录里放置默认的系统文件这些文件来自/etc/skel目录。使用-m参数新建一个用户后新用户下的系统配置文件与根目录下的系统配置文件完全相同包括修改日期都一致但是新用户home目录下配置文件的所有者是新用户自己。如果使用useradd命令时不加任何参数创建出来的用户将是默认三无用户一无HOME目录二无密码三无系统Shell但创建出来的用户是确实存在的cat /etc/passwd可以看到。而adduser命令创建用户的过程更像是一种人机对话默认参数下系统会提示输入各种信息然后根据这些信息创建新用户。删除用户用的是userdel命令。默认情况下userdel只会删除/etc/passwd文件中的用户信息而不会删除系统中属于该账户的任何文件。加上-r参数userdel会删除用户的HOME目录以及邮件目录但系统上仍可能存有已删除用户的其他文件所以在删除用户的HOME目录之前一定要检查清楚有没有重要文件。修改用户信息用的是usermod命令可以在创建完新用户后修改用户信息用法是usermod [options] username参数大部分跟useradd一样-c修改备注字段-e修改过期日期-g修改默认的登录组-l修改用户账户的登录名-L锁定账户使用户无法登录-p修改账户的密码-U解除锁定。passwd命令可以改当前登录用户的密码root用户可以使用passwd username修改任意用户密码-e选项能强制用户下次登录时修改密码。chpasswd命令能从标准输入自动读取登录名和密码对的列表给密码加密然后为用户账户设置并且可以同时更改多个用户的密码。还有chsh、chfn和chage这三个工具chsh用来快速修改默认的用户登录shellchfn用来修改/etc/passwd文件的备注字段chage用来管理用户账户的有效期。用户组方面组的作用是方便管理用户同一组内不同用户之间的文件可能是互相可读的。有些Linux发行版为每个用户单独创建一个组这样可以更安全一些。可以使用grep USERNAME /etc/group或tail /etc/group查看用户组信息。/etc/group文件有4个字段分别是组名、组密码、GID、属于该组的用户列表。groupadd命令可在系统上创建新组创建新组时默认没有用户被分配到该组需要用usermod -G把指定用户添加进这个新组中。修改已有组用groupmod命令-g参数修改GID-n参数修改组名。理解文件权限是今天的重头戏。ls -l命令可以用来查看Linux系统上的文件、目录和设备的权限。第一字段的第一个字符代表了文件对象的编码类型-代表文件d代表目录l代表链接c代表字符型设备b代表块设备n代表网络设备。之后有3组三字符的编码每一组定义了3种访问权限r代表对象是可读的w代表对象是可写的x代表对象是可执行的-代表没有某种权限。这3组分别对应文件的属主、属组和其他用户。八进制模式的安全性设置是把这3个rwx权限的值转换成二进制值再用一个八进制值来表示r是4w是2x是1所以rwx就是7rw-就是6r-x就是5r--就是4。umask命令用来显示和设置所创建文件和目录的默认权限。umask的后三位值是个掩码它会屏蔽掉不想授予该安全级别的权限。对文件来说全权限的值是666对目录来说则是777。文件一开始的权限是666减去umask值022之后剩下的文件权限就成了644。我试了一下umask命令查看当前系统的默认掩码然后用touch创建了一个新文件再用ls -l查看权限确实是644验证了umask的作用。chmod命令用来改变文件和目录的安全性设置用法是chmod [options] [mode] [file]。mode参数可以使用八进制模式或符号模式进行安全性设置。-R选项可以让权限的改变递归地作用到file的子文件和子目录上。八进制模式就是直接用三个数字来设置权限比如chmod 755 filename。符号模式则是用u/g/o/a代表所有者/所属组/其他用户/所有用户用/-/表示增加/移除/设置权限后面跟rwx。比如chmod ux filename给所有者增加执行权限。改变文件的所属关系用的是chown命令用登录名或UID来指定文件的新属主用法是chown [options] username:groupname filename。只有root用户才能够改变文件的所有者文件的所有者可以改变文件的所属组但前提是所有者必须是原所属组和目标所属组的成员。实现共享文件的方法是把其他用户拉进该文件所在的组用usermod -G命令更改用户所在组这样这个组内所有成员享有同等的文件权限。我在实际操作中创建了一个新组把几个用户加进去然后在一个目录下用chown和chmod调整了权限设置让组内成员可以互相访问文件。把今天的内容和前面几天的串在一起看之前经常碰到的Permission denied问题现在终于有了答案。每次用sudo其实就是临时获得了root的权限去执行命令而文件权限的rwx三位控制着谁能读谁能写谁能执行。之前在ls -l输出里看到的那一串rwx符号现在能读懂了从属主到属组到其他用户每一组三位分别代表什么权限一目了然。后续在使用Linux的过程中肯定会频繁地和这些权限打交道不管是部署应用还是管理多用户环境这套权限体系都是绕不开的基础。希望这篇文章能给正在理解用户管理和文件权限的同学一些参考有问题欢迎来交流。