从零开始学Linux(八)

📅 2026/7/9 12:19:24 👁️ 阅读次数 📝 编程学习
从零开始学Linux(八)

上一篇文章把环境变量从概念到操作整个过了一遍,从全局变量和局部变量的区别到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文件,查看时一定要加sudo,sudo这个命令就相当于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用来快速修改默认的用户登录shell,chfn用来修改/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是4,w是2,x是1,所以rwx就是7,rw-就是6,r-x就是5,r--就是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 u+x filename给所有者增加执行权限。

改变文件的所属关系用的是chown命令,用登录名或UID来指定文件的新属主,用法是chown [options] username:groupname filename。只有root用户才能够改变文件的所有者,文件的所有者可以改变文件的所属组,但前提是所有者必须是原所属组和目标所属组的成员。

实现共享文件的方法是把其他用户拉进该文件所在的组,用usermod -G命令更改用户所在组,这样这个组内所有成员享有同等的文件权限。我在实际操作中创建了一个新组,把几个用户加进去,然后在一个目录下用chown和chmod调整了权限设置,让组内成员可以互相访问文件。

把今天的内容和前面几天的串在一起看,之前经常碰到的Permission denied问题现在终于有了答案。每次用sudo其实就是临时获得了root的权限去执行命令,而文件权限的rwx三位控制着谁能读谁能写谁能执行。之前在ls -l输出里看到的那一串rwx符号,现在能读懂了,从属主到属组到其他用户,每一组三位分别代表什么权限,一目了然。后续在使用Linux的过程中肯定会频繁地和这些权限打交道,不管是部署应用还是管理多用户环境,这套权限体系都是绕不开的基础。希望这篇文章能给正在理解用户管理和文件权限的同学一些参考,有问题欢迎来交流。