尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Linux作业1:零基础入门文件系统、权限与Shell脚本

Linux作业1:零基础入门文件系统、权限与Shell脚本 接到一份“linux作业1”大概率是课程里第一次接触Linux系统也可能是入职培训的第一道动手题。很多人的第一反应是去背“linux常用命令大全”结果背了半天真正上机时连“为什么需要这个命令”“这个命令在解决什么问题”都想不明白。这篇内容不打算给你列一份两百行的命令清单而是从一份典型作业的完成路径出发把文件系统、用户权限、Shell脚本、时间同步、日志排查、环境搭建这些核心模块串起来讲清楚每一步背后的逻辑和实操里的坑。内容对零基础入门的人友好对刚转运维的新人同样有参考价值。1. 拿到“linux作业1”后先别急着敲命令文件系统才是地基1.1 第一次登录时先学会“看”而不是“敲”我见过不少同学第一次登录进Linux终端第一反应就是敲ls看输出一片花花绿绿然后就开始迷茫。这很正常。Linux和Windows最大的不同在于Windows靠图形界面让你“看见”Linux靠命令行让你“问出来”。所以第一步不是敲命令而是确认自己现在身处哪里。先做三件事pwd whoami idpwd告诉你当前在哪个目录全称是 print working directory。whoami告诉你当前登录的用户是谁。id告诉你这个用户的UID、GID以及属于哪些附加组。这里有个细节很多人忽略如果提示符最后是#说明你当前是root用户如果是$就是普通用户。后面做作业时凡是涉及系统级修改的命令一定要先确认这个符号。因为#意味着你拥有系统最高权限一个rm -rf的误操作就是灾难级别而$遇到“Permission denied”再正常不过反而是普通用户操作的日常。我自己带人的时候会让他们先把这三个命令敲一遍把输出抄下来。这不是形式主义而是建立“先定位自己再操作系统”的习惯。后续所有命令都是在某个用户、某个目录、某个权限上下文里执行的这三个命令就是定位坐标。1.2 目录结构背后的一套挂载逻辑Linux的目录结构和Windows完全不同。Windows是C盘、D盘这种“盘符”思维而Linux是一棵从根目录/开始倒挂的树。很多作业题会让你查找某个文件、修改某个配置其实考的就是你对这棵树的理解。核心目录不必死记但要理解“谁负责什么”目录主要存放内容最常踩到的场景/etc系统配置文件改网络、改源、改sudo权限都在这里/var动态数据如日志、缓存日志满了导致磁盘撑爆查/var/log/home普通用户的家目录练习脚本、项目文件一般放这里/tmp临时文件重启就清空不适合放重要数据/usr系统软件和程序文件安装软件时的默认路径/opt第三方软件目录手动解压安装的软件常放这/mnt和/media挂载外部存储插入U盘、挂载ISO时出现还有一个概念很容易让新人懵挂载。Windows里你插入U盘就自动多一个盘符Linux里你需要把一个存储设备“挂”到某个目录上才能通过这个目录访问它。理解挂载对后面做“磁盘满了”这类故障排查特别重要。检查磁盘和挂载情况有两个高频命令df -h注意-h是 human-readable把字节数转成K、M、G这种人类可读格式。不带这个参数你会看到一大串字节数字完全没法直觉判断。做运维久了会发现df -h是每天都要敲的命令相当于给系统量体温。1.3 查文件、查大小作业里最实用的三个组合作业里经常出现“找出某个目录下最大的文件”“统计某种类型文件的数量”这类问题。新手会一层层cd进去翻效率极低。直接用命令组合# 列出当前目录下的所有文件带大小 ls -lh # 递归查找 /home 下大于100M的普通文件 find /home -type f -size 100M -exec ls -lh {} \; # 统计当前目录下有多少个txt文件 find . -name *.txt | wc -l这里说个实战经验find的-exec很多人不敢用其实它就是“对找到的每个文件执行一次命令”。“-exec ls -lh {} \;” 中{}是找到的文件的占位符\;表示命令结束。第一次用时建议先不加-exec把搜索结果确认一遍再套上执行动作避免误删文件。还有一个目录大小查看命令du -sh /home/zhangsan。-s只显示总计-h人类可读。做“帮老师查一下哪个学生目录占了最多空间”这种作业时配合du -sh /home/*就能一次性出来结果。2. 新建用户与权限设计作业里第一道分水岭2.1 useradd和passwd的完整流程“linux新建用户”是出现频率极高的作业题也是面试常客。但很多人只是机械地敲useradd zhangsan然后passwd zhangsan根本不知道后面发生了什么。实际上useradd默认行为在不同发行版上并不一致。比如在Debian系的系统上useradd默认不会创建同名家目录也不会设置Shell。完整的、推荐的新用户操作流程是这样的sudo useradd -m -s /bin/bash zhangsan sudo passwd zhangsan sudo usermod -aG sudo zhangsan拆开解释-m是创建家目录/home/zhangsan不写这个参数新用户登录后连自己的家目录都没有会直接落在/下权限混乱。-s /bin/bash是指定登录Shell为bash。不指定的话系统可能用默认Shell有些系统的默认Shell是sh交互体验差很多。passwd设置密码密码不会回显到屏幕输的时候看着像没反应这是正常现象。usermod -aG sudo zhangsan把用户加入sudo组让这个用户能用sudo提权执行命令。注意-aG里的a(append) 一定不能丢丢了就是overwrite可能把用户原本的附加组全抹掉。创建完之后系统里发生了三件值得知道的事用户信息写入了/etc/passwd这里存的是用户名、UID、GID、家目录、Shell等信息。密码哈希存进了/etc/shadow普通用户可读不了这个文件这是保护密码的安全设计。组信息更新到了/etc/group。作业里如果要求“查看系统中所有用户”不要一个个翻文件一条命令就够cut -d: -f1 /etc/passwd-d:指定冒号作为分隔符-f1取第一列用户名。2.2 权限位、属主属组和umask为什么你的脚本无法执行新建用户做完之后下一个经典场景是用户写了一个脚本执行时报Permission denied。这个报错涉及Linux权限模型的三元组读(r)、写(w)、执行(x)分别映射到三种身份属主(u)、属组(g)、其他用户(o)。看权限的命令ls -l filename如果输出是-rw-r--r--拆开来看第一位-表示普通文件后面三个一组分别是属主、属组、其他人。也就是说属主可读写其他人只读没有人有执行权限。这种文件拿去做./script.sh系统当然拒绝。修正方法chmod x script.sh给文件加执行权限。如果只希望属主能执行chmod ux script.sh同理如果作业要求“让某个目录只能被属主进去”那就是chmod 700 dirname这里700是八进制权限表示法r4、w2、x17421表示读写执行全开0表示组和其他人无任何权限。还有chown用来改属主和属组sudo chown zhangsan:zhangsan /opt/project冒号前面是属主后面是属组。这条命令在“把项目文件移交给别人”的场景里特别常用。提一个很多人会忽略的知识点目录的权限和文件不一样。目录的“执行权限”实际是“能否进入这个目录”。为什么有时候明明文件权限没问题却提示无法读取大概率是路径上的某个目录缺了x权限。排查这种问题用namei -l /path/to/file可以沿路径逐层检查权限比一层层ls快得多。另外新创建的文件默认权限不是777因为系统有umask机制。执行umask通常看到0022意思是“创建时去掉的权限位”所以文件默认是666-022644目录默认是777-022755。这就是为什么你新建的脚本总是默认不可执行的根源。2.3 合理授权su与sudo的使用边界作业做完项目要上线这时候遇到“某些操作需要root权限”该怎么办两种方式切换到root用户su或者在命令前加sudo。# 切换到root sudo su - # 以root身份执行单条命令 sudo systemctl restart sshd我的建议是日常凡是能加sudo就加sudo尽量不要sudo su -常年驻留在root身份下。原因很现实root身份下人的警惕性会降低输错一条rm -rf /var/log/*也许还能补救输成rm -rf /var/*那基本就告别系统了。如果需要授权某个用户执行特定命令编辑sudo规则sudo visudo在文件末尾加一行zhangsan ALL(ALL) NOPASSWD: /usr/bin/systemctl restart sshd含义是用户zhangsan可以在所有主机上免密码执行重启sshd这一条命令。这种“最小授权”思路在真实运维里很重要作业里如果能体现这个思路是很加分的。3. 用shell完成第一个自动化小任务批量重命名文件3.1 先搞清楚mv和rename的边界“linux用shell重命名文件”这个需求几乎每个学Linux的人都会碰到。最简单的重命名是mv因为Linux里重命名本质就是移动文件从一个名字挪到另一个名字物理位置没变逻辑名变了。mv oldname.txt newname.txt但mv一次只能操作一个文件。如果要把当前目录下所有.txt改成.md一条条mv就太低效了。这时有两条路rename命令和shell循环。先说rename。不同发行版上的rename行为不一样。Debian系默认是Perl版本的rename支持正则表达式而Red Hat系自带的是util-linux版本只支持简单替换不支持复杂正则。所以你在Ubuntu上学到rename s/\.txt$/.md/ *.txt搬到CentOS上跑会直接报错。跨发行版之前先执行man rename确认版本不确认就很容易踩坑。3.2 for循环与字符串处理的组合拳更通用、几乎不会踩发行版差异坑的方式是shell循环for f in *.txt; do mv $f ${f%.txt}.md done拆解一下for f in *.txt; do ... done遍历当前目录下所有以.txt结尾的文件每次把文件名赋值给变量f。${f%.txt}是Shell参数扩展表示从变量f的末尾删除.txt后缀。注意这个语法只会删除最后一个匹配很适合去掉扩展名。然后拼上.md再用mv完成重命名。这里有个小白常犯的错误变量引用没有加双引号。如果文件名里带空格例如my notes.txt不加引号的$f会被拆成两个词mv就会因为参数数量不对而失败。所以规范和习惯很重要变量引用尽量写$f。如果要给文件加统一前缀比如批量备份日志可以这样for f in *.log; do cp $f backup_$(date %F)_$f done这里$(date %F)先执行date命令生成2025-01-15这样的日期格式再把结果嵌入文件名。这样每次备份文件的名称都带日期不会相互覆盖。这个小技巧在日常运维里非常常用。3.3 批量操作前三步自检避免把系统文件改坏批量重命名的风险在于一条循环跑下去如果匹配规则写错可能把不该改的文件全改了。我自己的习惯是在跑任何批量命令之前先做三轮自检。第一轮先打印不执行。把mv换成echofor f in *.txt; do echo mv \$f\ \${f%.txt}.md\ done输出确认无误后再真正执行。第二轮检查匹配范围。*.txt匹配的是当前目录下的txt文件但如果子目录里也有同名文件呢循环不会递归进入子目录这个行为要想清楚是否符合预期。如果确实要递归处理就需要find配合循环find . -name *.txt -type f | while read -r f; do mv $f ${f%.txt}.md done-type f限定只处理普通文件防止误动目录名。read -r的-r选项表示不反转义符文件名里的反斜杠会保留原样避免诡异bug。第三轮确认通配符没有匹配到你不想动的东西。例如*.config可能匹配到目录.config所以条件允许时用-type f或者find先列出全部文件清单再决定。这三轮检查看起来多花了几分钟但对比因为误操作把系统配置文件批量改坏然后再花一个小时去恢复这几分钟非常值。4. 时间同步与日志排查看似不起眼却决定系统稳定性的作业题4.1 timedatectl、date和chrony的配合“linux查看系统时间同步时间”是很多运维入门课都会布置的题。表面上是让新同学敲个date看时间实际考察的是对时间同步机制的完整认知。先看系统当前时间状态date timedatectldate只显示此刻的日期时间timedatectl会告诉你更多当前时区、是否启用了NTP同步、系统时间和RTC时间硬件时间是否一致。如果时区不对先设置时区sudo timedatectl set-timezone Asia/Shanghai注意这里写的是Asia/Shanghai不是Asia/BeijingIANA时区数据库里没收录Asia/Beijing这个标识。写错会直接报错找不到时区。然后确认NTP服务。现代系统上时间同步通常由chrony或systemd-timesyncd完成。查看同步状态chronyc sources -v如果看到^*开头的一行表示当前已同步到一个正常的时间源如果显示^?说明没有完成同步。没有chrony的系统可以执行sudo timedatectl set-ntp true这个是让系统启用NTP自动同步。如果上面一切都正常了系统的 UTC 时间会基于网络时间源自动校准。4.2 时间漂移引发的故障证书校验失败、定时任务不执行为什么时间同步值得单独讲因为这个环节出问题症状往往很隐蔽排查起来能绕很大一圈。举一个真实场景。某服务突然起不来查看日志发现一堆 “certificate has expired” 的报告。第一反应是证书真的过期了于是重新申请证书、部署结果问题依旧。百思不得其解时执行了一下date发现系统时间比真实时间快了整整一天。证书校验依赖“当前时间是否在证书有效期内”而系统时间一旦发生漂移就会出现“明明没过期的证书被认为过期”的假象。这种故障在物理机和虚拟机上都有可能发生虚拟机更常见因为宿主机休眠或快照回退会导致虚拟机的时钟跳变。另外一个高频故障是cron定时任务不执行。排查时先看cron日志常见原因是任务执行时间和系统真实时间对不上导致任务被延迟或跳过。所以排查这类问题我的建议是遇到任何证书、加密、定时任务相关的故障先跑一遍date看看系统时间对不对这一条花不到一秒能把一大票假故障直接排除。4.3 用journalctl和日志定位问题作业的答题模板化思路和日志打交道的作业本质是考察定位问题的思路。最常见的日志查看命令是journalctl它是systemd家族的日志工具。常用姿势# 查看本次开机后的所有日志 journalctl -b # 查看某个服务的日志 journalctl -u sshd # 只看错误及以上级别的日志 journalctl -p err -b # 查看最近1小时的日志 journalctl --since 1 hour ago # 跟踪最新日志 journalctl -f经典非systemd系统上日志在/var/log下常见文件有syslog、messages、以及各服务的独立日志目录。给一个“作业答案模板”式的排查链路可以用在任何日志相关的题目里先确认时间范围什么时候开始报错配套执行最近1小时或本机开机的日志。按服务过滤定位到具体是哪个服务出的问题。按级别过滤优先看err、crit、alert级别不要被大量info日志淹没。找到第一条报错而不是最后一条。日志下沉时后面的报错往往是连锁反应根因在最前面。这一套组合操作答案格式统一思路清晰作业里能体现出来比生背命令有含金量得多。5. 从“作业”走向“实战”进程、端口与常见故障案例5.1 进程管理ps、top和状态解读进程管理是Linux运维的核心基本功。“linux进程间通信”这类偏进阶的题先放一边先把最基础的进程查看和管理搞清楚。查看当前进程ps -ef ps aux两个命令输出略有差异。ps -ef是System V风格ps aux是BSD风格。重点关注的列PID进程号、STAT状态、START启动时间、COMMAND完整命令。STAT这一列很多人不会看。S是可中断睡眠R是运行中Z是僵尸进程。僵尸进程本身不占CPU不占内存但它的存在说明父进程没有正确处理子进程退出大量Z进程积压时一般伴随资源描述符耗尽需要找到父进程排查。动态查看进程和系统负载top按P按CPU排序按M按内存排序这是top里最高频的两个快捷键。如果要看更详细的每个CPU核心状态用top后按1展开。结束进程的命令和信号kill -15 PID # 优雅退出进程自己处理收尾 kill -9 PID # 强制结束不可拦截作业或者面试里如果让你杀一个不响应进程先给kill -15再给kill -9这个回答体现的是专业素养。直接上来就-9属于新手行为可能造成进程残留或数据损坏。5.2 端口与连接ss和网络排查服务起不来、端口被占这类作业题也特别常见。查看端口和连接用ss而不是老的netstat性能更好输出更清晰。# 查看所有监听的TCP端口 ss -lntp # 查看某个端口被谁占用 ss -lntp | grep 8080-l只看监听-n不做DNS反查加快速度-t只看TCP-p显示进程信息。列出的信息里有Local Address:Port如果看到0.0.0.0:80表示监听所有网卡的80端口127.0.0.1:80表示只监听本机回环地址外网访问不到。排查“为什么外部访问不了服务”这类问题先看这个字段十有八九是监听地址绑错了。5.3 一个真实故障案例的完整排查链路把上面的技能串起来用一个非常典型的“磁盘满了”案例演示排查链路的完整过程。这类题目在“linux运维故障案例”检索词里出现频率极高。现象是某服务的响应变慢top抓到wa高、IO负载大。第一步查磁盘占用df -h假设/分区到了98%。这里有个先确认大文件方向的环节。第二步快速定位一个大目录du -sh /*注意这里的/*会列出根目录下每个一级目录的总大小找到异常大的那个。第三步进一步深入比如锁定/vardu -sh /var/*如果看到/var/log特别大就进入日志目录找具体大文件ls -lhS /var/log-S让ls按文件大小排序最大文件排最上面一步到位。第四步确认是什么日志在疯狂增长用前面日志章节的journalctl或直接看日志内容然后决定是清空、轮转还是修改日志策略。这一套链路走完根因基本就挖出来了。作业里如果能按这种“现象-假设-验证-定位-处理”的步骤写基本就是教科书式答案。6. 搭一套能长期练习的环境镜像、虚拟机与发行版选择6.1 发行版怎么选从Debian系到RHEL系作业做多了迟早会遇到“到虚拟机安装linux系统”这步。第一步就是选发行版。Linux发行版家族庞大新手最容易问到底学哪个好我的建议是先分清两条大分支。Debian系代表作Debian、Ubuntu。包管理器是apt资料丰富教程多入门友好度最高。新人在自己的机器上做实验用Ubuntu或者原生Debian都不错。RHEL系代表作Red Hat Enterprise Linux、CentOS Stream、AlmaLinux、Rocky Linux。包管理器是dnf/yum。企业生产环境里使用率极高偏向运维岗位的这个分支要尽早接触。两个分支之间最大的操作差异就是软件安装命令不同Debian系用apt installRHEL系用dnf install服务管理统一用systemctl这个差别不算大但部分软件源的配置路径、防火墙默认策略完全不同。至于“国产linux”本质上多为Debian或OpenEuler等路线的再发行版本生态兼容性是其考虑重点。日常学习不必一开始就纠结哪个版本“最正宗”重要的是先跑起来把包管理、服务管理跑通这些通用知识跨发行版都是通的。6.2 虚拟机安装Linux常见异常与解决办法“虚拟机安装linux蓝屏”是检索热词说明踩这个坑的人非常多。这里说两个最高频的原因。第一个是宿主机没有开启硬件虚拟化。安装虚拟机软件时如果提示“VT-x不可用”或安装过程中频繁蓝屏重启进BIOS/UEFI找到Intel VT-x 或 AMD-V 选项开启后重启再装。第二个是虚拟机配置与镜像不匹配。有些同学给虚拟机分配的内存太小比如只有512M装带桌面环境的发行版会发现安装程序直接卡死或报错。给一个比较稳的起步配置参考配置项建议值CPU2核内存2048MB命令行安装或4096MB带桌面磁盘20GB以上网络默认NAT内存这一项特别值得注意。很多安装失败都不是镜像问题而是分配的资源不够。纯命令行服务器版2G内存够用带图形桌面至少4G。现代图形界面发行版吃内存很凶给少了安装程序自己都会罢工。6.3 装完系统后的基础配置换源、SSH、快照系统装完别急着随便折磨它先做三件基础配置能给你后期省下大量时间。第一件事换软件源。以Debian系为例默认源在境外国内下载速度慢时大概率超时。把源换成国内镜像站修改/etc/apt/sources.list或/etc/apt/sources.list.d/下的文件替换为镜像站地址如清华源然后sudo apt update这里有个小坑Debian 12以上的发行版开始启用debian.sources格式的新配置路径和格式都和旧版不一样网上很多旧教程已经失效。遇到“换源不生效”的问题先确认你改的文件路径和格式是否匹配当前系统版本。第二件事启用SSH让虚拟机可以被远程连接。服务端执行sudo systemctl install ssh sudo systemctl enable --now ssh客户端用ssh 用户名IP连接。这个步骤做完你就不再被虚拟机窗口绑着可以用自己电脑上更顺手的终端工具远程操作这才是类生产环境的使用方式。第三件事给虚拟机做快照。装完系统、配好源、搭好基本环境之后在虚拟机管理界面拍一个干净状态的快照。之后随便怎么折腾练习即使把系统搞垮了一键恢复到干净状态重新练一遍。快照是新手期性价比最高的“后悔药”没有之一。从我自己的经验看真正把“linux作业1”做完并做明白的人不会只盯着那几道题本身而是借助作业把整个生态认知框架建起来文件系统解决“东西在哪里”权限解决“谁能干什么”Shell解决“批量操作怎么做”日志和时间解决“系统到底发生了什么”。这套框架建立之后后面的任何Linux学习都只是往框架里填具体细节而已。最后再提醒一句做实验之前一定拍快照再多的技巧都抵不过一个可以回退的干净环境。
返回列表