如果你跟着这个练习系列走到第三次,说明你已经过了“装好Linux之后不知道练什么”的阶段。前两次练习,我默认你已经完成了系统安装、网络配置、基础命令熟悉这些热身动作,对终端不再陌生,也踩过几次权限不够的坑。这次我把练习主题定在“用户、权限与文件管理”,恰好是热词里出镜率最高的几个点:新建用户、删除文件夹、find查找、scp传输,以及面试里最爱问的权限题。这期练完,你基本能独立处理一台Linux服务器上最常见的日常运维场景,而不是只会敲几个命令看个热闹。
1. 环境准备与任务拆解
1.1 练习环境与工具选择
这次练习我在虚拟机里重新部署了一台CentOS Stream 9,内存分配了4G,硬盘50G,安装时选择“最小化安装”,只带了基础工具链。为什么不用带桌面环境的版本?因为服务器日常操作基本都在命令行完成,桌面环境不仅占用资源,还会让你下意识想用鼠标去点,失去了练习的意义。如果你手头是Ubuntu 22.04或者其他发行版也没关系,这期内容除了个别包管理器命令不同,其余全部通用。
连接方面我用的是MobaXterm,虽然Xshell也常用,但MobaXterm自带的SFTP面板和本地终端配色在演示文件传输时更直观。如果你还没有趁手的终端工具,用Windows自带的SSH客户端也行:ssh 用户名@IP地址,一样能练,只是体验差一些。另外提醒一句,虚拟机记得在一开始就建好快照,方便练习过程里把系统搞坏了随时回滚,这个习惯在真实服务器操作中同样重要。
1.2 本次练习的任务清单
定任务之前,我翻了下这个阶段新手最容易在工作中遇到的场景,整理成五个任务,难度递增:
| 任务编号 | 任务内容 | 对应真实场景 | 涉及核心命令 |
|---|---|---|---|
| 1 | 新建用户并设置密码 | 给新同事开通服务器账号 | useradd、passwd、chage |
| 2 | 创建用户组并将用户加入组 | 按项目组划分服务器权限 | groupadd、usermod、id |
| 3 | 部署项目目录并配置权限 | 多人协作开发时隔离数据 | chown、chmod、setfacl |
| 4 | 用find命令做文件治理 | 清理日志、找回丢失文件 | find、grep、-exec |
| 5 | 用scp完成远程文件传输 | 备份、发布、服务器间拷贝 | scp、ssh-keygen |
完成这五个任务,你实际上已经走完了一个初级运维最常接触的完整链路:从账号开通、权限划分、文件整理到远程分发。热词里的“linux常用命令大全运维”看着很长,真正高频的其实也就是这些命令的组合使用。下面挨个说清楚怎么做、为什么这么做。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心原理:为什么“用户+权限”是理解Linux的第一道坎
2.1 用户体系背后的三个文件
很多人用 useradd 创建用户,以为输完命令就完事了。但Linux里用户管理本质是操作三个文本文件:/etc/passwd、/etc/shadow、/etc/group。
/etc/passwd 每一行代表一个用户,字段用冒号分隔,一共7段。我举例说明:
code复制dev01:x:1001:1001::/home/dev01:/bin/bash
第一个字段是用户名,第二个字段是密码占位符(真正密码在shadow里,这里统一显示x),第三个是UID,第四个是GID,第五个是备注,第六个是家目录,第七个是登录shell。你可以用 cat /etc/passwd | grep dev01 验证一下。/etc/shadow 存的是加密后的密码和密码策略信息,比如密码最后修改时间、过期时间、宽限期,这个文件默认只有root能读,权限是 000,也就是连root都要靠root身份才能看,普通用户连读的权限都没有。
我见过不少新手会手动去改 /etc/passwd 来创建用户,不是说绝对不行,而是容易改错字段导致用户无法登录。实际上useradd命令就是在帮你安全地操作这些文件,同时还会自动创建家目录、生成默认环境变量文件。理解这三个文件的作用有两个意义:一是排查用户登录问题时你不至于两眼一抹黑;二是面试时如果被问到“简述Linux用户管理原理”,你可以从文件层面回答而不只是背命令。
2.2 权限模型:读、写、执行到底谁说了算
Linux的权限模型是“三组权限、三个对象”:每组权限分读(r=4)、写(w=2)、执行(x=1),三个对象分别是属主(u)、属组(g)、其他用户(o)。用 ls -l 看到的 -rw-r--r--,第一位是文件类型,后面9个字符每3个一组,正好对应属主、属组、其他用户。
数字权限的原理其实是二进制的映射:rwx 就是7,rw- 是6,r-- 是4。很多人会背 755、644 这两个常见组合,但你要理解为什么:文件默认权限是 644,也就是属主可读写、其他人只读;目录和可执行文件常用 755,属主可读可写可进,其他人只读可进。
这里有个特别容易踩坑的点:目录的执行权限,含义是“能否进入该目录”。如果一个目录只有读权限没有执行权限,你虽然能看到目录里的文件名,但 cd 进不去,访问里面任何文件都会提示 Permission denied。反过来,如果只有执行权限没有读权限,你能进去但看不到目录里有什么,只能凭确切文件名访问。这个机制可以理解为进入一栋楼的门禁卡——读权限是楼里有没有楼层索引,执行权限是你有没有资格刷卡进楼。
2.3 特殊权限和ACL:解普通权限之不够用
普通权限只有三组,不够用怎么办?比如我要求:张三能读文件A,李四只能读写文件A,王五什么都干不了,但文件A的属主和属组都不能改。这时候普通chmod就无能为力,需要用ACL(Access Control List)给不同用户单独设置权限。ACL可以理解为在传统权限基础上额外贴了一张“白名单”,用 setfacl 命令操作,getfacl 查看。
特殊权限则是执行权限位的扩展,比如 setuid(4)、setgid(2)、sticky bit(1)。Setuid应用于可执行文件时,用户执行这个文件会临时获得文件属主的身份,最典型的是 /usr/bin/passwd,普通用户修改密码时要临时获得root身份去写shadow文件,靠的就是setuid。这个机制也是面试里“Linux提权”话题的起点——运维视角里提权是必要功能,但配置不当就是安全漏洞,所以平时看到哪些文件带setuid权限心里要有数,用 find / -perm -4000 可以全部列出来。
3. 实操过程:从新建用户到ACL权限控制的完整演练
3.1 新建用户与密码策略
现在开始实际操作。我用三台虚拟设备模拟了一个小团队场景:开发人员dk01、运维人员ops01,两个人需要一台服务器上的应用目录,同时各有一个独立私有目录。首先创建用户:
bash复制useradd dk01
useradd ops01
passwd dk01
passwd ops01
passwd 执行时会让你输入两次密码,输入过程不回显属于正常现象,别以为卡住了。创建完用 id dk01 查看用户信息,能看到uid、gid和所属组。如果显示 uid=1001(dk01) gid=1001(dk01) groups=1001(dk01),说明用户和同名组都已自动创建。
这里有个容易忽略的细节:useradd 创建用户后,家目录是从 /etc/skel 目录拷贝模板生成的。你可以往 /etc/skel 里放一个自定义的 welcome.txt,以后每次新建用户都会自动带上这个文件。我第一次发现这个机制的时候挺惊喜,批量初始化用户环境非常方便。
密码策略方面,新用户首次登录后应该强制改密码,这个需求用一条命令搞定:
bash复制chage -d 0 dk01
-d 0 的意思是把用户上次修改密码的日期设为“历史上的今天”,这样用户下次登录时系统会强制要求修改密码。运维面试题里“如何强制用户下次登录修改密码”就是这个答案。我用 chage -l dk01 验证过策略已生效,其中“Last password change”显示为 password must be changed。
3.2 用户组和项目目录权限配置
接下来处理协作场景。公司有个web项目,需要dk01和ops01共同维护,目录放在 /srv/webapp,但这个目录不能让其他人看到。第一步是创建用户组并加入两个用户:
bash复制groupadd webteam
usermod -aG webteam dk01
usermod -aG webteam ops01
注意 -aG 里的 -a 一定要加,它表示“追加”,不加的话会把用户从原来的附属组里移除。我见过有人手滑执行了 usermod -G webteam dk01,结果dk01的附加组全被清了。加完组后用 id dk01 验证,输出里会多出 groups=1001(dk01),1002(webteam)。
然后创建项目目录:
bash复制mkdir -p /srv/webapp
chown root:webteam /srv/webapp
chmod 750 /srv/webapp
这三条命令的意图是:目录属主是root、属组是webteam,权限 750 表示root拥有全部权限,webteam组成员拥有读和执行权限,其他用户完全无法访问。这样普通用户就看不到 /srv/webapp 里的内容了。如果你用 ls -ld /srv/webapp 查看,输出应该是 drwxr-x---,属主root、属组webteam。
再往细了想,同一个项目组里,dk01应该对 /srv/webapp 有读写权限,ops01理论上只需要读,不需要写。但传统权限模式下,同一个组要么一起读、一起写,要么一起只读,没法再细分。这时候ACL出场:
bash复制setfacl -m u:dk01:rwx /srv/webapp
setfacl -m u:ops01:rx /srv/webapp
setfacl -m d:u:dk01:rwx /srv/webapp
setfacl -m d:u:ops01:rx /srv/webapp
前两条是给已存在的目录设置ACL权限,后两条里的 d: 表示默认ACL,作用是在这个目录下新建的文件和子目录会自动继承对应的ACL规则。这一点特别实用,不然每次新建文件都要重新设置权限。
配置完用 getfacl /srv/webapp 查看,会看到类似 user:dk01:rwx 的额外条目。因为ACL的存在,ls -l 显示权限位时末尾会多一个 + 号,例如 drwxr-x---+。
3.3 find命令进行文件治理
用户建好、权限配好,服务器跑上一阵子之后,面临的就是文件治理问题。日志文件越积越多、磁盘空间报警、某个大文件不知道藏在哪个目录,这些都是真实场景。find命令在热词里出镜率极高,不是没有原因。
bash复制find /var/log -name "*.log" -type f
按名称查找特定文件。-name 支持通配符,-type f 表示只查普通文件,-type d 查目录。我常用 find / -type f -size +500M 找大文件,比如:
bash复制find / -xdev -type f -size +500M -exec ls -lh {} \;
-xdev 的意思是不要跨文件系统查找,避免遍历到 /proc、/sys 这类虚拟目录拖慢速度甚至卡死。-exec ls -lh {} \; 是对找到的每个文件执行ls命令,{} 是当前文件的占位符,\; 是命令结尾标记,注意分号要转义。
要清理7天前的日志文件,经典组合是:
bash复制find /var/log -name "*.log" -type f -mtime +7 -exec rm -f {} \;
-mtime +7 表示修改时间超过7天。这里要提醒一下,在真实服务器上执行rm之前,建议先跑一遍不带 -exec rm 的版本,把结果列出来确认没有误伤。更好的做法是先 -exec ls -l {} \; 看看,确认无误后再执行删除。面试题“如何批量删除7天前的文件”考察的就是这个,务必自己动手敲一遍。
find结合grep还能做文件内容检索,比如在配置目录里找出所有包含某个关键词的文件:
bash复制find /etc -type f -name "*.conf" -exec grep -l "listen" {} \;
3.4 scp远程传输与免密登录
最后一项练习是scp文件传输。我准备了两台虚拟机,目标是把刚才 /srv/webapp 下的一个备份文件传到另一台机器上。scp基本用法:
bash复制scp /srv/webapp/backup.tar.gz root@192.168.1.20:/data/
执行后会要求输root密码,传输完成显示进度条。如果是把远端文件拉回本地,方向反过来就行:
bash复制scp root@192.168.1.20:/data/deploy.tar.gz /tmp/
其实运维里更常用的是rsync,支持增量同步、断点续传,但scp胜在简单直接,所有Linux系统默认自带,不需要额外安装。练习阶段把scp学会,已经能覆盖大部分日常传输需求。
反复输密码有点烦,而且脚本里没法交互输入密码。所以免密登录也是必练项目,原理是用公钥认证代替密码认证:
bash复制ssh-keygen -t rsa -b 4096
ssh-copy-id root@192.168.1.20
第一条命令生成密钥对,一路回车即可。第二条把本机公钥安装到目标机器的 ~/.ssh/authorized_keys 里。配完之后 scp 直接不再问密码。我踩过的坑是:ssh-keygen 生成时如果已经存在同名密钥,会覆盖掉旧密钥,所以生成前先确认 ~/.ssh 目录下有没有 id_rsa。另外,重启之后如果发现免密失效,大概率是家目录或者 .ssh 目录权限太开,系统为了安全会忽略权限过大的密钥文件。解决办法是:
bash复制chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
4. 常见问题与排查技巧实录
4.1 权限相关高频报错
练习过程中我故意在几个地方埋了坑,方便做排查演示。
第一个是 Permission denied。排查思路要有层次:先看文件本身的属主和权限位,ls -l;再看当前用户是否属于文件属组,id;如果还不行,看父目录权限。很多时候文件本身权限没问题,但父目录缺少执行权限导致无法进入。我见过有人给文件配了777还是提示权限不足,最后发现是家目录权限被改成了700,其他用户根本进不去。
第二个是删除文件时提示 Operation not permitted。这个报错看起来像权限问题,但其实是文件被设置了不可变属性。用 lsattr 查看文件属性,如果看到 i 标志,说明文件被 chattr +i 锁住了,需要先解锁再删除:
bash复制chattr -i file.txt
rm -f file.txt
这个知识点在热词里对应“linux删除文件夹命令”的深层版本。比如 rm -rf 删除失败时,第一步查权限,第二步查属性,顺序错了会绕很久。
第三个是ACL导致的安全问题。有一次我给目录设置默认ACL后,发现新建文件权限比预期松,排查原因是默认ACL与普通权限同时存在时,权限取两者并集。建议每次改完ACL都用 getfacl 检查一遍,不要只看 ls -l。
4.2 用户登录和sudo问题
新建用户后无法登录,先检查shell是否有效:cat /etc/passwd | grep 用户名,如果shell显示 /sbin/nologin 那就不是给人登录用的账号。另外一种情况是家目录没创建,useradd 时用了 -M 参数就不会建家目录,登录时虽然能进但会提示找不到家目录。用 usermod -d /home/dk01 -m dk01 可以修复。
sudo使用报错是另一个高频问题。新用户想用sudo,需要把用户加入wheel组(CentOS/RHEL系)或者sudo组(Ubuntu系):
bash复制usermod -aG wheel dk01
sudo visudo
sudo还是su,这个面试题也总被问到:su是切换用户,需要目标用户的密码;sudo是以其他身份执行命令,默认验证的是当前用户密码,而且可以通过 /etc/sudoers 精确控制命令权限。生产环境中应尽量用sudo而不是分发root密码。
温习一下用户相关的面试题,比如“/etc/passwd文件每一列代表的含义”“如何批量创建10个用户”“普通用户如何拥有root权限执行某些命令”等,这些都是热词里“linux面试题”方向的常见问题。能把这篇文章里的用户、权限、找文件、传文件的逻辑说清楚,初级运维面试的基础关基本就过了。
4.3 实操中容易忽视的隐藏坑
还有一些不太起眼但实际会踩到的坑。比如 rm -rf 删除大目录时,命令执行完没有输出,你以为没成功,其实是因为默认没有 -v 参数,不会打印删除过程。可以用 rm -rfv 观察进度,但生产环境不建议加 -v,输出太多反而刷屏。
再比如find命令查找“7天前修改的文件”,新手容易用 -mmin 和 -mtime 混在一起。-mmin +60 是60分钟前,-mtime +7 是7天前,两者单位不同。加号表示“大于”,减号表示“小于”,正好是边界时用时间点判断,尽量避免模糊查询。
scp传输大文件中断,很多人第一反应是重传一遍,其实应该改用rsync断点续传:
bash复制rsync -avz --progress /srv/webapp/backup.tar.gz root@192.168.1.20:/data/
中断后再次执行同样的命令,rsync会自动跳过已传完的部分,只传剩余数据。这也是为什么实际运维中rsync比scp更受青睐的原因。
5. 练习收尾:从手动操作到脚本化
做完上面所有练习之后,我强烈建议你再往前走一步:把整个流程串成一个shell脚本。比如编写一个 user_init.sh,接收用户名参数,自动创建用户、设置密码策略、加入指定组、复制项目模板文件。这一步的意义不在于写多复杂的代码,而在于强迫自己梳理整个操作流程的逻辑顺序。
写脚本时要注意几个细节:每条关键命令后面加 && 或判断返回值,防止某一步失败后继续往下走导致状态不一致;用户存在时要提示而不是直接报错;密码可以用 chpasswd 方式批量设置。我第一次写这类脚本的版本大概四五行的样子,很多坑都是跑通了之后回看代码才发现的。
脚本化之后,你手里其实就有了一份可复现的“环境初始化工具”。以后不管换几台服务器,执行一条命令就能把用户和权限按标准配好。热词里搜“linux常用命令大全”虽然一抓一大把,但真正能形成肌肉记忆的还是你亲手敲过、踩过坑、最后整理成脚本的那些。
这次练习如果顺利跑完,建议你顺手看看 /etc/sudoers 里 Defaults 配置项的注释,再琢磨一下“为什么sudo权限要精细化授权”。把边界思维带进去,你的Linux操作水平会进入下一个阶段。
