Linux实验一精讲:字符界面命令、权限与Shell脚本实战
简介操作系统实验一的Linux用户接口与编程界面实验报告面向高校操作系统课程学习者用于快速熟悉Linux字符界面常用命令、编程工具及C程序的编辑编译运行流程。压缩包内含1个docx文档体积约609KB报告按实验步骤记录了命令操作与结果说明便于对照练习。内容涵盖文件与目录操作、系统信息查看、在线帮助、路径显示等常用命令具体包括ls的隐藏文件、按时间排序、inode显示等参数uname的系统信息选项以及man在线帮助和pwd路径查询等内容并包含U盘挂载、vi/vim编辑器使用、gcc编译C程序、Shell脚本三种执行方法等内容同时总结了超级用户、标准用户与sudo提权机制的使用要点有助于读者在动手实验前建立清晰的知识框架。该实验报告已有107人学习浏览适合作为操作系统实验预习材料、复习提纲或同类实验报告撰写参考。1. Linux 用户接口与编程界面实验一为什么值得完整复现一遍操作系统这门课的第一场实验往往不是讲进程调度而是先让你在 Linux 字符界面里把 ls、uname、man 这些命令敲熟。别小看这一步Linux 作为开源操作系统的代表用户接口与编程界面是后续所有实验的底座。这份报告名义上是实验一实际把字符界面命令、U 盘挂载、vi/vim、C 程序编译和 shell 脚本五个子实验全部收纳成一条链路适合正在修操作系统课、或刚在虚拟机里装好 Linux 发行版的初学者。把这一周的命令吃透后面学文件系统、进程管理时会顺手得多。2. 字符界面命令细节ls 的 inode、uname 参数矩阵与 man 在线帮助2.1 ls 的参数矩阵-a、-c、-x、-i 与 -l 的组合解读ls 是字符界面里用得最多的命令实验给的几个参数看似零散其实每个都对应一种具体场景。先把命令跑一遍再说# 显示当前目录所有文件包括以 . 开头的隐藏文件 ls -a # 按时间排序配合 -l 看时间戳变化 ls -c # 按行显示各排序项信息文件多时横向扫更直观 ls -x # 显示文件的 inode 编号排查硬链接时必用 ls -i # 组合参数inode、类型、权限、链接数、所有者、所属组、大小、修改时间、文件名 ls -il参数说明-a里的隐藏文件是指以点开头的文件比如.bashrc普通 ls 默认不显示后面避坑章节要处理的.swp交换文件就是典型的隐藏文件所以实验里特意把ls -a放在第一个。-c在实验报告里归为按修改时间排序严格来说 GNU ls 的-c是按 inode 变更时间ctime排序日常理解成时间排序问题不大但写脚本时要注意它和-t的差异。-x改变输出方向默认 ls 按列排-x按行排适合终端窗口宽的机器。-i显示的是 inode 编号这是 Linux 文件系统的核心概念inode 是文件在磁盘上的身份证号记录类型、权限、所有者、大小、时间戳这些元数据但文件名本身存在目录项里。硬链接的本质就是多个目录项指向同一个 inode。所以实验里让ls -il连着用-l那串输出是有固定顺序的文件类型-普通文件、d目录、拥有者权限、同组用户权限、其他人权限、链接数、所有者、所属组、大小、修改时间、文件名。我一般还会加一个-h把大小显示成 K/M/G 这种可读格式实验里没提但排查磁盘占用时很实用。2.2 uname 系统信息查询主机名、内核版本与硬件平台uname 的五个参数覆率高特别是排查编译环境和远程登录时。逐个看# 一条命令看全部系统信息 uname -a # 只看主机名 uname -n # 只看内核发行版本 uname -r # 只看内核名称 uname -s # 只看硬件平台比如 x86_64 uname -i参数说明-n打印主机名等价于hostname多台机器同时操作时先uname -n确认自己在哪台机器上能避免误操作。-r打印内核版本比如 5.15.0-xxx-generic装内核模块或驱动时版本必须对得上否则直接翻车。-i打印硬件平台x86_64 和 i686 的差异直接影响你下载哪个架构的软件包也影响 C 程序编译的默认目标gcc -v里能看到对应信息。实验里uname -s单独抽出来是为了让你区分内核名称Linux和发行版名称比如 Ubuntu这是两个层面。2.3 pwd、date 与 who目录、时间与会话的三件套实验在这块给了四个命令我习惯归为一组操作前先知道自己在哪、现在几点、机器上还有谁。# 显示当前工作目录的绝对路径 pwd # 在当前目录下创建子目录 aa mkdir aa # 删除文件比如交换文件 .swp rm file.swp # 删除空目录 aa rmdir aapwd 返回绝对路径这个信息在写脚本拼接路径时至关重要。mkdir 和 rmdir 是一对rmdir 只删空目录目录里有任何文件都会报错拒绝这是保护机制比rm -r安全。rm 默认只删文件删目录要加-r实验里用它删.swp交换文件正好呼应前面 ls -a 里的隐藏文件概念。# 显示当前时间和日期 date # 查看当前已登录用户的注册信息 whowho 的输出列依次是登录账号、使用的终端机、登录时间、正在使用的显示器。tty1 表示本地物理终端pts/0 表示远程登录的伪终端。实验室多人在同一台服务器上操作时who是判断现在能不能动这个目录的第一道保险先看别人是不是也在线上再决定要不要改系统配置。2.4 man 在线帮助从命令手册到 C 库函数的正确查法Linux 的在线帮助系统就是 man它比网上搜到的碎片化教程可靠因为 man 手册和当前系统是同一个版本# 查看 uname 命令的帮助手册 man uname # 查看 memcpy 函数的帮助手册 man memcpyman 界面里按上箭头、下箭头上下移动按 PgUp、PgDn 翻页按 q 退出。这里有个关键细节man 手册分章节第 1 节是用户命令第 2 节是系统调用第 3 节是 C 库函数。man memcpy实际命中第 3 节如果开头看到void *memcpy(void *dest, const void *src, size_t n);说明你在看的是 C 库函数手册。当命令和函数同名时比如 stat需要用man 2 stat或man 3 stat指定章节这是新手最容易忽略的点。提示不确定某个关键字是命令还是函数先用man -k 关键字等价于 apropos做一次全文检索再进对应章节细看。3. 用户权限边界标准用户、root 与 sudo 的提权窗口3.1 标准用户与 root权限隔离的设计出发点实验总结里有一句话很关键日常使用不建议登录超级用户防止误删重要文件导致系统崩溃。这个设计不是保守而是权限隔离。先看身份信息怎么查# 查看当前登录用户名 whoami # 查看当前用户的 uid、gid 和所归属的组 id # 切换到 root输入 root 密码- 表示同时加载 root 的登录环境 su -参数说明whoami只返回用户名写 shell 脚本判断执行身份时常用。id返回 uid、gid 和组列表uid 为 0 的就是 root普通用户 uid 一般从 1000 开始。su -和su的区别在于是否加载目标用户的登录环境环境变量、工作目录实验里不要求掌握 su但要清楚它是切换身份的老牌命令sudo 是它的安全化替代。为什么标准用户不容易搞崩系统因为标准用户只在自己的家目录里有写权限对 /etc、/usr 这些系统目录只有读和执行权限误操作rm -rf最多毁掉自己的家目录。root 则拥有全部资源访问权限安装软件、添加用户、改系统配置都必须用 root但 root 的手滑没有后悔药。实验报告里专门强调安装 Linux 时会默认创建标准用户就是这个原因安装程序帮你把日常操作和系统管理分离了。做一个 10 秒验证就能直观感受权限边界用标准用户执行touch /etc/testfile会得到 Permission denied前面加 sudo 就成功了但要在 /etc 下留文件记得删掉别污染系统目录。3.2 sudosubstitute user 与五分钟窗口的边界实验对 sudo 的拆解很到位su 是 substitute user 的简称sudo 以一个其他用户的身份执行命令默认身份是 root。它的价值在于不需要切到 root 环境只在单条命令上临时提权# 以 root 身份创建新用户系统要求输入当前用户密码 sudo useradd testuser # 验证提权是否生效输出 root 说明成功 sudo whoami # 刷新 sudo 时间戳但不执行任何命令 sudo -v # 清除 sudo 时间戳立即结束提权窗口 sudo -k几个关键点第一次执行 sudo 时系统要求输入的是当前标准用户的密码不是 root 密码。输入密码成功后有一个五分钟使用期限五分钟内再执行 sudo 不再询问超过五分钟必须重新输入。这个时间戳机制通常记录在 /run/sudo 的临时目录里设计目的是平衡安全性和便利性窗口太短会让连续维护时反复输密码太长则等于给权限滥用留了敞开的门。sudo -v和sudo -k是实验报告没细讲但很实用的两个参数-v主动刷新时间戳适合在跑长任务前先手动验证一次-k主动清除时间戳适合在公共终端上操作完立刻收回权限。这比依赖五分钟后超时更安全。用一句话记住这个设计日常用标准用户需要时 sudo用完 sudo -k 收尾权限的全生命周期都可控、可审计。4. 挂载 U 盘与 vi/vim设备节点到三种模式的实操链路4.1 U 盘挂载从 /dev/sdb1 识别到 mount/umount 全流程实验里有一个很具体的细节U 盘识别为 /dev/sdb分区为 sdb1文件系统 FAT32磁盘标签类型 dos磁盘标识符 0xa118efa2。这组信息是 fdisk 类工具的输出实操流程如下# 查看磁盘分区信息确认 U 盘对应的设备节点 fdisk -l # 挂载 FAT32 格式的 U 盘分区到 /mnt 目录 sudo mount -t vfat /dev/sdb1 /mnt # 挂载后确认能看到 U 盘内容 ls /mnt # 使用完毕卸载挂载点 sudo umount /mnt参数说明/dev/sdb 是整块磁盘设备/dev/sdb1 是它的第一个分区Linux 设备命名里 sda 一般是系统盘sdb 通常是后插入的 U 盘。-t vfat指定文件系统类型为 FAT32Linux 内核里 FAT 系列统一叫 vfat省略 -t 时 mount 会自动探测但实验室环境显式指定更稳不会因为探测顺序产生意外。挂载点 /mnt 是系统预置的通用挂载目录现实中习惯用 /mnt/usb 这类带语义的子目录。umount 可以接挂载点umount /mnt也可以接设备名umount /dev/sdb1实验里用挂载点写法没问题因为一个挂载点只挂了一个设备。一个容易忽略的细节mount 和 umount 都需要 root 权限标准用户必须加 sudo。另外如果桌面环境已经把 U 盘自动挂载到 /media 下的路径手动挂载前先把它卸载掉否则同一个分区挂两处数据一致性就说不清了。我一般还会加-o ro参数做只读挂载如果只是拷贝数据出来只读挂载能防止误写入。4.2 vi/vim 三种模式命令、插入、底行的协作方式vi/vim 是实验里绕不过去的坎。初看它不友好理解三种模式后就顺了而且它没有图形界面依赖SSH 到任何一台 Linux 机器都能用# 用 vi 新建一个 C 源文件默认进入命令模式 vi hello.c三种模式用一张表说清模式进入方式典型操作作用命令模式vi 打开文件后的默认状态gg到文件头、G到文件尾、dd删一行、yy复制一行、p粘贴、u撤销移动光标与行级编辑插入模式命令模式下按 i、a、o直接打字输入文本内容底行模式命令模式下按冒号 ::w保存、:q退出、:wq保存退出、:q!强制不保存退出保存、退出、查找替换实操中最典型的完整流程# 命令模式下按 i 进入插入模式输入 C 代码 # 按 Esc 返回命令模式 # 输入 :wq 保存并退出回到 shell新手最容易卡住的地方是在插入模式里输:wq结果显示在文本里文件根本退不出去。原因是底行模式的冒号必须按在命令模式下。正确顺序是按 Esc 回到命令模式再按冒号进底行模式输 wq 回车。查找替换也在底行模式做比如:%s/printf/puts/g全局替换:set number打开行号排查编译错误定位行号时很关键。提示vim 是 vi 的增强版支持语法高亮和无限撤销。多数发行版的 vi 实际是指向 vim 的软链接实验里写 vi 还是 vim 效果一样。5. 避坑指南实验里最常踩的五个场景与排查步骤5.1 坑一.swp 交换文件残留vi 每次打开都提示恢复现象vi 正常保存退出后再打开同一个文件却提示检测到交换文件问是恢复还是删除。原因上一次 vim 没有正常退出断电、终端被杀、SSH 连接断开vim 会在同目录留下隐藏的交换文件.hello.c.swp里面存着未保存的编辑缓冲。它没被清理vim 就认为文件可能仍处于编辑中。解决先用ls -a确认隐藏的交换文件存在再在另一个终端确认没有残留的 vim 进程然后删除它# 查看隐藏的交换文件 ls -a # 确认没有编辑进程占用后删除交换文件 rm .hello.c.swp实验报告里专门提到的rm 删除文件.swp就是这一步。从那以后我每次异常退出都先ps aux | grep vim确认进程再删 .swp两条命令顺序不能反。5.2 坑二umount 报 target is busyU 盘拔不下来现象执行sudo umount /mnt报target is busyU 盘卸载失败。原因某个进程仍在 /mnt 目录里有打开的文件或者你的当前工作目录还停在 /mnt 里。Linux 不允许卸载正在被占用的文件系统这是保护机制防止数据写到一半丢文件。解决先切出挂载点目录再用工具定位占用进程# 切出挂载点回到用户家目录 cd ~ # 看谁占用了 /mnt lsof | grep /mnt # 或者用 fuser 直接列出占用进程号 fuser -m /mnt拿到进程号后正常结束占用进程再执行 umount。如果占用的就是你自己的终端cd 出来就解决了。记住挂载是临时视图不是复制文件卸载前确认没有进程在里面读写。5.3 坑三./ 执行脚本报 Permission denied现象写好的 shell 脚本执行./info.sh提示 Permission denied但脚本内容明明没问题。原因脚本文件没有执行权限位。文本文件能否直接执行取决于权限第三段的 x 位和脚本内容无关。解决赋予执行权限后再跑# 给脚本所有者加执行权限 chmod x info.sh # 现在可以直接执行 ./info.sh如果不想动权限也可以bash info.sh直接指定解释器执行这在下一章展开。Permission denied 和脚本语法错误是两回事先看权限再谈排错别上来就怀疑脚本写错了。5.4 坑四sudo 五分钟窗口过期脚本里提权失败现象连续维护时隔了几分钟再执行带 sudo 的命令又要求输密码在脚本里调用 sudo 有时直接失败不报错。原因实验里讲的五分钟期限是真的sudo 的时间戳过期后必须重新认证。在非交互式脚本里sudo 没有终端可以询问密码某些配置下会直接失败。解决脚本里需要提权的地方手动分两步处理或者先手动预热窗口再执行脚本# 先手动验证一次把五分钟窗口打开 sudo -v # 然后在窗口内执行脚本全程不再要密码 ./setup.sh注意别在脚本里写sudo -n非交互模式禁止提示密码窗口过期时它会直接报错反而让你分不清是权限问题还是命令问题。5.5 坑五插入模式里敲 :wq退不出也存不了现象编辑完文件输入:wq回车光标处多了一串字符 :wq文件还在就是退不出去。原因当前正处于插入模式你敲的冒号和字母全被当成文本输入了。vi 的底行命令只在命令模式下识别。解决先按 Esc 回到命令模式再按一次确保回到普通状态然后重新输:wq。文件修改得乱七八糟不想保存就用:q!强制不保存退出。记住口诀Esc 是总开关任何模式下先 Esc 再冒号永远不会把命令打进正文里。6. 收尾验证gcc 编译 C 程序与 shell 脚本三种执行方式这一章把前面所有命令串成一条验证链路用 vi 写 C 源文件用 gcc 编译再用三种方式跑 shell 脚本。走通这条链路Linux 编程界面就算摸到门了。先用 vi 新建 hello.c插入模式写一个最小 C 程序按 Esc 后:wq保存退出然后编译运行# 编译-o 指定输出文件名不带 -o 默认生成 a.out gcc -o hello hello.c # 运行当前目录下的可执行文件 ./hello-o指定输出文件名这是 Unix 的老传统不写 -o 时 gcc 默认生成 a.out一直沿用至今。编译报错时先看代码末尾分号有没有写新手九成是 C 语法问题不是 vi 的问题。接着写一个系统信息脚本把前几章的命令收进去#!/bin/bash # 打印当前用户、系统信息和当前目录 echo 当前用户: $(whoami) echo 系统信息: $(uname -a) echo 当前目录: $(pwd)三种执行方式的行为有本质区别执行方式命令是否要求执行权限执行环境直接运行./info.sh是需 chmod x子 shell指定解释器bash info.sh否子 shellsource 加载source info.sh否当前 shell前两种在子 shell 里运行脚本里的 cd 或 export 不会影响当前终端source等价于. info.sh在当前 shell 进程里执行环境变量和目录切换都会保留下来。所以写配置或切目录用 source跑一次性任务用 ./, 不想动权限就用 bash 方式。最后用 date 和 who 确认操作时段与在线用户收工。这套流程我每次复现类似实验都会强制走一遍vi 写、gcc 编、三种方式跑脚本、who 收尾。看起来琐碎但一次跑通不出错就说明 Linux 用户接口和编程界面基本过关了。整套命令和踩坑记录都在这份实验报告里按顺序敲一遍比对着截图背参数有效得多。希望帮到你。本文还有配套的精品资源点击获取