Linux第二次作业通关:用户管理、权限分配与Shell脚本实战解析
最近又被好几个同学问同一个问题Linux第二次正式作业到底怎么做感觉一堆命令都会敲但作业一交就被打回。说实话这个阶段翻车太正常了。第一次正式作业通常只要求“认识Linux环境”无非是打开虚拟机、敲几个ls、cd、pwd跟Linux混个脸熟。第二次画风突变用户管理、权限分配、文件操作、文本处理、自动化脚本全上来了从“会敲命令”变成“能用命令解决一套实际问题”难度直接上了两层楼。这篇内容不端着讲理论我直接按“作业模块拆解、必考命令补课、完整实操示例、高频翻车点排查”的顺序走一遍。我批过不少次作业也带学生做过类似的模拟项目X会把老师真正看的东西讲清楚。适合三类人看正在为Linux第二次正式作业头秃的学生想系统补一遍Linux基础的同学以及刚转运维、总被权限和脚本坑的初学者。1. 第二次正式作业到底在考什么1.1 四个高频模块的典型形态虽然不同学校的题目五花八门但万变不离其宗第二次正式作业基本围绕四个模块转。我把它们整理成一张速览表方便你对号入座模块典型要求核心命令高频易错点用户与组管理创建/删除用户、按角色分组、设置密码useradd、usermod、userdel、groupadd、passwd创建用户忘了建家目录usermod不带-aG把用户从附加组里挤出来文件权限与属主控制目录/文件的读写执行权限修改属主属组chmod、chown、chgrp、umask无脑chmod 777符号模式和数字模式混用文本处理与重定向筛选日志、统计字段、修改配置grep、sed、awk、sort、uniq、wc、重定向管道方向写反awk/sed里的引号和转义搞错基础Shell脚本写脚本完成自动化操作比如备份、清理、统计bash脚本、变量、if/for、echo、$?没写shebang变量赋值“”两边多打空格脚本不设执行权限1.2 为什么第二次作业就要“上强度”很多同学不理解第一次作业还是“照着敲”第二次怎么就要求“自己组合”了因为从教学编排看第一次作业考察的是记忆力第二次开始考察理解力。真实工作里没有任何需求会直白地告诉你“用哪个命令”全是一条条分下来的把这些日志归档、给新员工配好环境、限制某部门只能读不能写。你一拆解发现不就是“用户管理权限脚本”三件套的组合吗老师出第二次作业的潜台词也很明确单条命令背得再熟组合起来不会排错就是白学。所以作业里通常埋着几个“坑”比如要求把某个目录设为组内成员可写、其他人无权访问或者要求脚本把昨天的日志压缩成带日期的文件。能不能做出来练的是Linux思路而不是背诵速度。后面我给的实操步骤也是按这种“组合式题目”展开的你拿自己的作业题来套即可。2. 核心知识点补课与实操要点这一章先不急给整套答案我们把高频考到的基础点逐个过一遍。为什么讲得细因为后面实操示例里用的全是这些底子而作业翻车九成都是基础点没扣死。你自己写作业时也可以把下面几小结当成考前速查手册。2.1 用户与组管理只会useradd会吃大亏我见过最多的写法就是“sudo useradd alice”然后就没了。这样创建的用户默认没有家目录shell大概率也不是bash后面你“su - alice”进去会发现连.bashrc都没有写作业时很容易被判漏做。稳妥的做法是明确指定各参数sudo useradd -m -s /bin/bash -G dev alice sudo passwd alice-m表示创建家目录-s指定登录shell-G把用户加到附加组里。这里有个细节后面要改密码用passwd改组用usermod改注释信息用chfn先分清这几个命令的职责再敲下去才不会乱。还有usermod很多人把用户加到新组时写成“usermod -G dev alice”这个操作会把用户之前的所有附加组全部覆盖掉。正确姿势是加-a参数追加sudo usermod -aG dev alice查用户结果用id alice最直观能看到uid、gid和所属组。另外别忽略userdel作业里常要求“删除某用户并清理家目录”用“sudo userdel -r alice”比只删账户更完整。最后提醒一个冷门考点/etc/passwd、/etc/group、/etc/shadow三个文件分别管什么很多老师喜欢在实验报告里走一道顺手记住没坏处。2.2 文件权限能算出764也看得懂ls -l权限是第二次作业的重灾区。“chmod 777”几乎是大家的肌肉记忆但作业题最怕你对着一个“协作项目目录”直接777。你要做的是先看懂ls -l那串字符再熟练地用数字法算权限。那串-rw-r--r--总共有10个位置第1位表示类型-是普通文件d是目录l是软链接后面每3位为一组分别代表属主、属组、其他用户的rwx权限。r、w、x分别对应4、2、1所以rw-r--r--换成数字是644。举一个典型需求让组内成员能读写、其他人只能读目录则要求能进入sudo chown -R alice:dev /data/project sudo chmod -R 764 /data/project764属主7rwx、属组6rw-、其他人4r--。但注意目录的x权限代表“能否进入”对目录设4别人虽然能看到文件名列表但进入目录会失败。如果你想“其他人既能读文件又能进目录”目录就得设5r-x。这就是权限题最烦人的地方文件和目录的x含义不一样。做的时候一定先把需求拆开单独给文件一套、目录一套再决定数字。umask也常被拉出来考它有本事让你“明明建了文件权限却和想的不一样”。默认umask一般是022表示新建文件要减掉组和其他用户的写权限所以普通文件默认644、目录默认755。如果作业要求临时放宽/收紧用“umask 027”这类命令改当前会话即可exit后恢复默认。你还可以用“umask -S”查看符号模式能直接看出当前默认权限长什么样。2.3 grep、sed、awk文本处理三兄弟别只会grep日志类作业几乎离不开这三个。grep是筛选sed是编辑awk是切列三者协同能搞定绝大部分文本活。先把各自最常用的场景过一遍。grep用得多的是过滤关键字加上-E支持扩展正则-v反向匹配-c计数-n显示行号。作业里“找出所有ERROR级别日志”这种题正确姿势可能是grep -E ERROR|FATAL app.logsed常见的两个场景一个是行内替换一个是按范围输出。取第10到第20行并打印sed -n 10,20p app.log。把文件里的“old”统一改成“new”并用-i写回文件sed -i s/old/new/g config.confawk最常干的事是按分隔符切字段。默认按空白切$1、$2就是第一列、第二列$NF是最后一列。想统计日志里每个错误码出现的次数可以这样组合awk {print $9} access.log | sort | uniq -c | sort -rn关于awk/sed还有两个容易踩坑的细节。第一grep/sed/awk里的正则表达式建议用单引号包起来防止被shell展开变量第二sed里s命令的分隔符可以换成#这种处理路径类替换比用/省去一地转义。你不会想看到一整行“sed -i s//data/logs//data/bak/g”这种地狱式写法的。2.4 Shell脚本从“命令串”到“可交付脚本”的关键一步不管作业有没有明确要求脚本很多题目最终都需要用脚本把步骤固化下来。脚本能不能拿高分主要看四件事。第一是shebang也就是第一行的#!/bin/bash别省少了它在某些执行方式下会莫名其妙。第二是变量赋值的书写var/data/logs等号两边不能有空格有空格就会被解析成“执行命令var”。第三是条件判断和循环这是脚本里最容易出逻辑错误的地方。一个检查目录是否存在、不存在就创建的典型片段#!/bin/bash LOG_DIR/data/logs if [ ! -d $LOG_DIR ]; then mkdir -p $LOG_DIR fi这里有个新手最爱犯的错误if后面的括号和内容之间必须有空格[不是一个语法符号它是一个命令所以写成[$LOG_DIR]或者[$LOG_DIR]都会报错。建议以后都用双引号把变量包起来能防住“路径带空格”这种坑。第四是脚本的“排错能力”。我强烈建议在脚本头部加上set -euxo pipefail。-e表示任一命令出错就退出避免错误堆积-u表示用到未定义变量就报错-o pipefail让管道中间的失败也能被捕获。调试时用bash -x script.sh跑一遍每一行实际执行的命令都会打印出来你马上就能看出是哪个变量没赋上、哪条命令没走通。3. 一次完整作业的实操复盘模拟项目X下面是真正的“抄作业”环节。我不能照着你们学校的具体题目写因为不同学校不一样但我可以参照最常见的题目形态搭一个模拟项目X把完整过程演一遍。这个模拟项目X的需求是这样的模拟某公司运维环境完成三件事为三名新员工创建账号并分组规范指定目录的访问权限编写日志备份脚本将项目日志按日期归档统计日志中各错误码出现次数并输出。你拿到自己的题目时只要按同样的流程拆解把角色名、路径、统计字段换掉就能套用。3.1 需求拆解与目录规划先别急着敲命令。我们把题面翻译成可执行的清单创建员工账号alice、bob、carol三个用户都需要家目录登录shell为bash。分组分为dev组和ops组alice和bob进devcarol进ops。目录规划/data/project给dev组读写/data/opsdata给ops组读写公共文件其他人只能读。备份脚本每天把/app/logs下的日志按日期打包到/data/backup。统计脚本统计/var/log/app/error.log里各错误码出现次数。这样的需求几乎能覆盖第二次作业80%的知识点。目录结构上统一挂到/data下方便权限控制也方便你在实验报告里描述“我们采用/data作为根业务目录”。规划的时候就要想好后面对应的权限数字不要建完目录再倒回去改。3.2 创建用户和组并验证先建组再建用户顺序别反否则用户加组时要额外补一步sudo groupadd dev sudo groupadd ops sudo useradd -m -s /bin/bash -G dev alice sudo useradd -m -s /bin/bash -G dev bob sudo useradd -m -s /bin/bash -G ops carol sudo passwd alice sudo passwd bob sudo passwd carol验证结果用id注意检查每个用户的uid、gid和Groups包含预期id alice # uid1001(alice) gid1001(alice) groups1001(alice),1004(dev)这里有个我看过无数遍的血泪提醒如果创建完用户后意识到“忘了加组”千万别用usermod -G dev alice这会把alice的私有组从Groups列表里挤掉。正确写法是usermod -aG dev alice。-a和-G是一对搭档一个是追加一个是覆盖必须连用。我就见过有人去掉-a自检时id一查发现私有组没了急得满头大汗其实一条命令就能救回来。3.3 目录创建与权限落位sudo mkdir -p /data/project /data/opsdata /data/backup /app/logs /var/log/app sudo chown -R alice:dev /data/project sudo chown -R carol:ops /data/opsdata sudo chown -R alice:dev /app/logs sudo chown -R carol:ops /var/log/app权限上要求目录内新建文件保持“组内可编辑”最省心的用法是设定目录的setgid位。这样不管组内谁创建文件文件的属组都自动继承目录的属组而不会变成创建人自己的私有组。这在多人协作场景里很常用也是作业里的隐藏加分项sudo chmod 2770 /data/project sudo chmod 2770 /data/opsdata sudo chmod 2750 /data/backup2770里的2就是setgid位它会让目录下新建文件的属组自动归属目录属组。用ls -ld验证应该能看到drwxrws---注意权限位里出现了s。很多同学只写chmod 770忽略了“组内协作”的语义这一分丢得冤。如果你发现ls -ld显示的是带s但不生效记得确认属主属组是不是已经chown成功setgid要在正确属组下才有意义。3.4 写日志备份脚本日志备份脚本的核心目标是“把昨天的日志归档成带日期的压缩包”。这里引入date命令的格式化能力#!/bin/bash set -euxo pipefail LOG_SRC/app/logs BACKUP_DIR/data/backup DATE$(date %Y%m%d) tar -czf ${BACKUP_DIR}/logs_${DATE}.tar.gz -C ${LOG_SRC} .解释几个点date %Y%m%d输出的格式如20250607可以直接拼进文件名tar的-C参数先把工作目录切到来源目录再对.打包这样压缩包内不会带上长长的绝对路径变量外面加{}是为了在变量名后面拼接字符时不产生歧义。执行一下再检查结果sudo bash backup_log.sh ls -l /data/backup/如果第一次执行就报错大概率是权限没对上。比如脚本是alice写的但/data/backup属主不是alice目录没有写权限就生成不了压缩包。作业里最常出现的连锁反应就是这么几个权限叠加没算清楚导致的。每次执行前先ls -l看一下属主属组比盲目重敲命令快得多。3.5 统计错误码并输出报告统计部分假设error.log里每一行是“2025-06-07 12:30:45 ERROR 1024 timeout”错误码在第4列。用awk切列再sort加uniq -c统计#!/bin/bash awk {print $4} /var/log/app/error.log | sort | uniq -c | sort -rn /data/backup/error_report.txt把结果重定向到文件是让助教“一眼看到产出”的关键。很多人会把结果直接打印在终端关了窗口就没了写到文件里你还能在实验报告里引用具体数字。如果你不确定字段列号先用head -3 error.log看一下格式再确定$4还是$9。统计完记得cat一下报告文件别让空文件交上去。3.6 验收清单与提交前自检交作业前我建议形成一个“三查”习惯查账号用id和grep /etc/passwd确认用户、组、shell、家目录都正确。查权限用ls -l和ls -ld确认所有关键目录的数字权限、属主属组符合需求表。查脚本bash -n脚本名做语法检查再实际执行一次确认产物文件生成。这份自检清单每次作业都能直接用。你可以把对应的命令写成一个check.sh脚本一键输出所有验证结果这在实验报告里写“自检过程”时特别好用老师一看就知道你有验收意识。4. 高频翻车点与排查速查批作业见过的错误千奇百怪但频率最高的其实就那么几个。这一章把常见现象、原因、修复办法直接列出来方便你卡住时对号入座。4.1 权限不足明明sudo了还报Permission denied典型现象sudo chmod -R 777执行完了运行脚本还是Permission denied。这时候先看denied的到底是“文件”还是“目录”的执行权限再看脚本是否缺少x权限。另一个隐蔽原因是脚本执行方式你用了bash script.sh而文件本身没有x权限。因为bash是去读脚本文件而不是直接执行它所以只要求文件有r但如果你用./script.sh方式执行文件必须要有x。确认方法ls -l script.sh sudo chmod x script.sh4.2 脚本手动能跑cron定时一跑就失败原因很经典cron环境只继承了一个极简PATH/usr/local/bin这些路径可能不在里面命令自然找不到。解决办法是脚本开头显式设置PATH并把所有路径写成绝对路径不要依赖相对路径。另外cron日志默认不输出到终端建议把脚本里的标准输出和标准错误都重定向到日志文件/data/backup/backup.log 21。这样下次定时任务失败你才有现场可查。4.3 脚本文件在却报No such file or directory这个报错特别误导人。文件明明存在但执行./backup_log.sh时报“No such file or directory”九成是Windows编辑后产生的CRLF换行符导致。解决办法sed -i s/\r$// backup_log.sh或者用dos2unix处理。以后写脚本建议直接用Linux里的编辑器或者把编辑器配置好“换行符LF”能省掉一堆奇怪的兼容问题。4.4 grep/awk/sed里的引号和转义现象想把grep host: 8080里的内容传进变量或者awk里同时用$1和shell变量结果怎么都不对。经验法则正则和awk程序片段一定用单引号包避免shell先把$1展开成空要在awk程序里引用shell变量时用-v把变量传进去awk -v name$var {print name, $1}。而sed替换路径时把分隔符换为#免得到处写/。4.5 通配符把文件删多了这是每次作业里最吓人的翻车现场。有人想清理/tmp/cleanup下的缓存手一抖写成“rm -rf /tmp/cleanup *”中间多了一个空格shell把它理解为“删除/tmp/cleanup目录再删除当前目录下所有文件”。在涉及rm -rf的命令里一定要先echo打印一遍要删除的路径确认无误再去掉echo执行。bash -x也能让你在执行前看清楚每个通配符到底展开成了什么。4.6 排查速查表现象可能原因快速修复出现Permission denied缺执行权限 / 目录x缺失chmod x目录加x权限useradd后无法登录没设密码或shell不是bash用passwdusermod -s /bin/bash脚本报bad interpreterCRLF换行符sed -i s/\r$// 脚本文件脚本找不到命令cron下PATH不完整脚本开头显式export PATHawk输出全是空特殊字符被shell吃掉awk程序片段用单引号包文件权限和预期不符umask影响先umask 022再建文件sudo命令不存在用户不在sudoers组由管理员加入sudo组多花5分钟按表自查抵得上被打回重写一天的代价。带过几届学生之后我最大的体会是Linux第二次正式作业的差距通常不是“懂不懂命令”而是“做完有没有验证”。很多同学命令敲完了结果权限还是错的、脚本根本没执行、统计文件是空的就急着提交最后统统被打回。所以我把写作业的固定动作也分享给你每敲完一个关键步骤立刻用id、ls -l、cat这三个命令回看结果每写一个脚本先bash -n检查语法加上set -euxo pipefail最后bash -x跑一遍看过程。做到这些你的第二次正式作业大概率只在格式分上被扣一点核心分都能守住。如果实在卡住也别硬扛把所有相关文件、命令、报错上下文原样打包发出来信息给足了别人才能帮你三分钟内定位问题。