Linux基础指令进阶:从文件权限到Shell脚本实战

发布时间:2026/10/8 14:41:11

Linux基础指令进阶:从文件权限到Shell脚本实战 上一期把ls、cd、cat这些最基础的指令过了一遍这期顺势往上走一层。标题叫“Linux基础指令2”其实我已经刻意回避了那些“一查手册就知道”的内容挑的都是在日常运维、写脚本、排查故障时真正高频使用、但新手容易踩坑的指令。你如果正处在从“会用Linux”到“能用Linux干活”的阶段或者准备面试被问linux常用命令这一篇应该能帮你把指令串成一个可以解决实际问题的工具箱而不是死记命令名。这次覆盖的指令大概分成五块文件删除与重命名、用户与权限、系统信息与时间校准、软件安装与gcc编译、进程操作与Shell脚本。每一块我都会先说清楚为什么需要这些指令再给出可以直接抄的实操命令最后附上我踩过的一些坑。内容偏务实不追炫技适合在虚拟机、云主机或者嵌入式板子上反复验证。1. 文件操作进阶删除、重命名与批量处理ls和cd是进门的钥匙真正开始干活之后你马上会遇到“怎么删文件”“怎么改文件名”“怎么同时处理一堆文件”这种问题。文件名里带空格、批量改后缀、误删一个目录这些场景几乎每天都在发生所以文件操作值得单独拿出来精讲。1.1 删除文件夹rm -rf 的边界与安全替代方案删除文件用rm删除空目录用rmdir但实际使用中绝大多数人在删非空目录时都会用这一条rm -rf directory_name-r表示递归把目录里的所有内容一层层删完-f表示强制不逐个询问。这个组合好用但也是Linux里最出名的“高危指令”。我刚入行时有一次想删临时目录手滑在rm -rf后面多打了个空格和星号差点把当前目录下的所有项目文件清掉。那之后我给自己定了几条规矩尽量不用rm -rf处理带通配符的路径真要删一批文件先ls确认通配符匹配到的内容。删除前先cd到目标目录的父目录用相对路径反复看一眼再执行删除。给rm设置别名让它默认带-i交互确认虽然每次删除都要按一下y但安全系数高得多alias rmrm -i删除时遇到“rm: cannot remove xxx: Operation not permitted”多数情况是文件属性被锁定了比如设置了chattr i防删除标志用lsattr查看chattr -i解除后再删。还有一种情况是文件系统以只读方式挂载mount输出里能看到ro字样重新挂载为读写rw再操作。如果不想请“大力士”也可以装trash-cli把删除变成“扔进回收站”。命令是trash file在用户主目录下会生成.local/share/Trash目录误删后可以直接trash-restore找回。这在远程服务器上特别实用毕竟没有图形界面的回收站多一层保险多一条后路。1.2 重命名文件mv 比你想象的更强大mv的字面意思是“移动”但它同样承担着重命名的工作。单个文件重命名很简单mv old_name.txt new_name.txt把文件从当前目录移动到/data/logs目录并顺手改个名一行也能搞定mv access.log /data/logs/access_$(date %F).log这里顺手用命令替换生成带日期的文件名是运维里很常见的操作。等日志文件积累到一定程度你会频繁需要这种“按日期归档”的能力。批量重命名是另一个高频需求。假设有一堆report_20240101.txt这样的文件你想统一改成backup_report_20240101.txt用Shell循环for f in report_*.txt; do mv $f backup_$f done文件名里带空格时for循环里必须用双引号把变量包起来否则空格会被当成分隔符拆散这是我吃过亏的地方。更复杂的批量替换比如把.txt改成.log还要处理文件名中的特定单词可以借助rename命令Debian系的rename用的Perl语法功能很猛但语法需要单独学习不建议新手一上来就啃。复制文件的cp也需要在这里一起说。cp -r递归复制目录cp -a保留属主、权限、时间戳等元属性cp -p只保留时间戳。如果你要同步代码到服务器rsync比cp更强但那是后话先把cp的参数记住日常拷文件够用了。复制或移动时注意目标路径不存在时mv会把源文件改名为目标文件名目标路径是已存在的目录时会把源文件放进这个目录。这个逻辑想清楚很多“文件怎么不见了”的疑问就解开了。2. 用户与权限新建用户、权限和 sudo 那些事Linux是典型的多用户系统。你看一台服务器上面可能同时跑着好几个服务、好几个开发者账号权限划分不清就会有人不小心把别人的项目目录改了或者把不该读的配置文件读了。这个章节围绕“怎么建一个账号”“怎么控制它能做什么”展开。2.1 新建用户与用户组adduser 和 useradd 有什么区别创建用户的指令有两个useradd和adduser。很多教程混着用但它们根本不是一回事。useradd是系统底层命令参数非常“硬”不加参数的话连家目录都不会创建。adduser是Perl写的一个交互式友好脚本底层调用useradd但会自动创建家目录、设置密码、创建同名用户组还会问一堆问题对新手极其友好。所以我推荐交互场景下直接用adduseradduser zhangsan执行后会依次让你设置密码、填写用户信息家目录/home/zhangsan会自动建好默认Shell是/bin/bash登录名也能正常使用。如果你在脚本里需要静默创建用户才用useradd加参数useradd -m -s /bin/bash -G sudo lisi-m创建家目录-s指定Shell-G把用户加入附加用户组。这里把lisi加入了sudo组它就有权限执行管理员命令了这正是下一小节要聊的授权控制。Linux把用户信息写在/etc/passwd密码散列在/etc/shadow用户组在/etc/group。用户ID叫UIDroot的UID是0。看到/etc/passwd里每个用户后面有一串数字那个就是UID。为什么要提这个因为面试题里常问“如何查看用户属于哪些组”或者“如何修改用户UID”答案就落在这些文件里。查看用户属于哪些组用id zhangsan修改密码用passwd zhangsan锁定账号用passwd -l zhangsan一把钥匙一把锁。2.2 文件权限chmod、chown 和数字权限位的含义创建好用户紧接着的问题是这个用户能碰哪些文件Linux用一个很朴素的模型管理权限每个文件都有属主user、属组group、其他人other三类身份每类身份有读r4、写w2、执行x1三个权限位用数字相加表示。最常用的数字权限是755和644。chmod 755 script.sh表示属主可读可写可执行属组和其他人只能读和执行这适合脚本文件。chmod 644 file.txt表示属主可读写其他人只读适合普通配置文件。递归修改整个目录用-Rchmod -R 755 /data/www chown -R www-data:www-data /data/wwwchown改属主和属组-R一起递归。一个非常常见的实战场景是网站目录权限错乱nginx或apache报403或403 Forbidden。排查思路通常是ls -l看目录权限然后确认运行进程的用户是谁再把目录属主改成那个用户权限设为755文件设为644。这套组合在Linux运维面试里出现频率极高背下来不亏。补充两个冷门但有用的权限位SetUID4、SetGID2、Sticky Bit1。比如/tmp目录就是drwxrwxrwt最后的t表示Sticky Bit只有文件属主和root能删除这个目录里的文件防止用户互相删临时文件。chmod t /tmp可以给目录加这个位chmod us file设置SetUID。掌握这些遇到ls -l输出里出现格格不入的s或t时就知道发生了什么。2.3 sudo 与权限失控时的恢复思路普通用户执行管理员操作靠sudo。为什么不用su直接切到root因为su需要root密码而且一登录就是全部权限风险敞口太大。sudo的核心思想是“最小授权”加“操作审计”每次执行都需要当前用户的密码同时可以用sudo -l查看当前用户被授予了哪些命令权限。配置sudo权限的中心文件是/etc/sudoers用visudo编辑。常用的授权行格式是zhangsan ALL(ALL:ALL) NOPASSWD:ALL表示用户zhangsan可以从任意主机登录以任意身份执行任意命令且不需要输密码。实际生产环境不建议给这么大的权限更稳的写法是只授权特定命令zhangsan ALL(root) /usr/bin/systemctl, /usr/bin/apt一旦把sudo权限配错比如把自己从sudo组里踢出去root密码又忘了恢复思路一般是重启进入单用户模式或使用恢复内核挂载根文件系统后修改/etc/sudoers。这个操作细节因发行版和引导方式差异很大但原理都是“绕过正常登录验证直接修改配置文件”。我建议你在自己的虚拟机里练一遍这个恢复流程因为几乎每个做运维的人都会碰上至少一次“唯一管理账号被锁死”的危机。3. 系统信息与时间先弄清你在哪儿、现在几点排查问题之前要先把环境摸清楚。系统是什么发行版、内核什么版本、CPU和内存多大、磁盘还剩多少、时间准不准这些信息直接决定后续操作方案。这个部分不是单纯罗列命令而是告诉你到哪一步去看哪个输出。3.1 查看系统信息uname、os-release 和硬件概况三条命令立刻定位一台Linux的身份和内核uname -a cat /etc/os-release uname -runame -a输出完整内核信息包括主机名、内核版本、硬件架构。cat /etc/os-release告诉你发行版的准确名称和版本号比如Ubuntu 24.04还是Debian 13。内核版本单独用uname -r看因为很多驱动和软件需要匹配内核版本才能编译安装。硬件资源用三件套lscpu # CPU型号、核数、架构 free -h # 内存总量和用量-h是human-readable自动带单位 df -hT # 磁盘分区占用-T显示文件系统类型排查“我的服务器怎么这么卡”时第一眼就是看这三个的输出。如果free -h显示可用内存不足1G但之前没人部署过大应用那大概率是某个进程在偷吃内存顺着上一节的ps指令往下查。如果df -h显示根分区使用率99%不用怀疑很多莫名其妙的问题都是磁盘写满导致的先清理日志、再用du -sh /*逐级找大文件。3.2 查看与同步时间date、timedatectl 和 chrony服务器时间不准是隐蔽的灾难。日志时间对不上、HTTPS证书验证失败、分布式系统里的数据对不上时间戳全是这个原因。查看当前时间用date date %Y-%m-%d %H:%M:%S第二条是格式化输出写脚本生成日志文件名时特别好用。date %F等价于date %Y-%m-%ddate %s输出Unix时间戳从1970年1月1日0点起算的秒数这两个变形很常见。现代系统用timedatectl统一管理时间和时区timedatectl # 查看系统时间、时区、NTP状态 timedatectl list-timezones | grep Shanghai # 查时区 timedatectl set-timezone Asia/Shanghai # 设置时区网络同步时间传统方案是ntpdate现代方案推荐chrony。安装以后apt install chrony -y systemctl enable --now chrony chronyc sources -vchronyc sources -v输出里能看到当前同步的NTP服务器和对时偏差。如果系统时间比真实时间慢了十几秒执行chronyc makestep可以强制立即校准。很多云主机默认开了NTP同步但如果你跑的是嵌入式板子没有RTC电池或者没有网络时间会非常不靠谱脚本里涉及时间计算时要格外小心。排查时间问题时先看timedatectl里的“System clock synchronized”是不是yes如果是no说明NTP同步没生效或者本地时间被手动改过导致同步被抑制。把问题定位到“时区不对”还是“同步失败”比直接敲date盯着屏幕有用得多。4. 软件安装与 gcc让你的系统具备编译能力面试题里常问“在Linux系统安装python用的什么命令”“怎么下载gcc编译器”其实背后是一个软件包管理体系的问题。Debian系Ubuntu、Debian、Deepin、统信UOS用aptRedHat系CentOS、Rocky、Fedora用yum和dnf。这套命令不背下来也能用但理解了“源”的概念和一键安装的原理遇到装不上的报错就不会抓瞎。4.1 apt 与 yum包管理器的使用逻辑在Debian系上安装gcc最简单的是apt update apt install gcc -yapt update是刷新软件源索引不是升级软件。很多新手一执行apt install就报“无法定位软件包”十有八九是忘了先update。-y是跳过确认直接安装脚本里必加。安装完用gcc --version验证能看到版本号就说明编译器已经就位。但实际搞开发时光有gcc还不够因为编译一个C程序可能需要头文件、连接器等工具链成员Debian系为这个准备了“全家桶”apt install build-essential -y一次装好gcc、g、make、libc-dev等常用编译工具。面试题如果再问“linux下载gcc编译器”你直接答apt install gccUbuntu/Debian或者yum install gccCentOS就行再补一句“生产环境建议安装build-essential”比只甩一条命令更显经验。RedHat系的对应用法是yum install gcc -y # 老版本CentOS dnf install gcc -y # 新版Fedora/RHEL区别在于dnf是yum的下一代依赖解析和性能更好。平时遇到的“安装软件还得先解决依赖”的麻烦包管理器已经在后台替你处理掉了。4.2 源码安装configure、make、make install 的常规流程用包管理器装软件是走大路用源码编译是走小路但嵌入式Linux开发里经常要走小路。源码安装三连击./configure --prefix/usr/local/software make make installconfigure脚本会检查环境、生成Makefilemake按Makefile里设定的规则编译源码make install把编译好的文件复制到系统目录--prefix可以指定安装路径避免污染系统默认目录。这个流程的坑很多。比如编译时报错error: xxx.h: No such file or directory一般是缺少对应的-dev包。Debian系统一用apt install libxxx-dev补上头文件。再比如make到一半报错很多时候是系统GCC版本太老或缺少依赖先apt build-dep xxx把编译依赖补齐再重新执行make clean make。个人体会不是万不得已别在生产服务器上源码安装大型软件。源码编译最大的麻烦是“版本依赖地狱”你装的A依赖B的2.0系统里的B是1.4编译A时各种报错。优先用发行版官方源里的软件包实在需要新版本再用checkinstall替代make install生成deb或rpm包这样以后卸载和升级都方便。一个小技巧源码目录编译完且确认可运行后把目录整体打包备份以后换机器直接拷贝解压就能用省去重复编译。5. 进程管理与 Shell 脚本把命令串起来干活指令说一千道一万最终是为了干活。这一个部分把你前面学的命令串联起来讲到进程的查看与终止再做几个简单的Shell脚本让机器自动处理批量操作。这也是嵌入式linux、linux运维故障案例、linux面试题背后最常出现的考察点。5.1 进程查看与结束ps、top、kill 的合理姿势查看当前系统有哪些进程在跑最常用的是ps aux ps -ef两种格式输出略有差别但核心字段一致进程PID、CPU占用、内存占用、启动命令。想找某个特定的进程用grep过滤ps aux | grep java执行后输出里会出现两行Java进程和一行grep java本身后者是ps的PID不用理会。这种“管道过滤”的组合是Linux里最常用的排查模式面试必问。动态观察进程资源占用用top它每几秒刷新一次按P按CPU排序按M按内存排序。更现代的替代品是htop界面更友好但需要额外安装。结束进程用kill这里有一个新手最容易搞错的概念kill -9不是唯一选项甚至不是首选。Linux进程收到信号后可以有机会做清理工作比如保存状态、关闭文件描述符。kill默认发送的是TERM信号编号15相当于礼貌地请求进程退出kill -9发送的是KILL信号直接由内核强制终止进程没有机会做任何善后。所以不要一上来就kill -9先给进程一个优雅退出的机会。如果15秒后还没有退出再考虑强制。kill 12345 # 发送TERM信号 kill -9 12345 # 强制杀死 pkill -f java # 按进程名匹配并终止排查“哪个进程占了cpu”用组合先top看到PID再ls -l /proc/PD目录查到启动命令的完整路径。/proc文件系统里每个数字目录对应一个进程这里面藏着大量信息面试题如果问到“如何根据PID找到进程工作目录”答案就是pwdx PID或ls -l /proc/PID/cwd。5.2 进程间通信的朴素实现管道、重定向与信号“进程间通信”听起来很玄但你其实每天都在用只是没意识到。管道|把前一个命令的标准输出接到后一个命令的标准输入这就是两个进程之间最朴素的通信方式。重定向把输出写到文件是追加写入。tee把输出同时送进屏幕和文件命令 | tee output.log信号是另一个层面的通信你在终端按CtrlC本质是给前台的进程组发送了INT信号kill -TERM 12345是明确给指定进程发信号。理解了这个你在脚本里用trap捕获信号做优雅退出时就不会发懵。5.3 写第一个实用的 Shell 脚本Shell脚本可以用一串指令完成反复操作。新建一个文件run.sh第一行写解释器声明#!/bin/bash然后写入以下内容#!/bin/bash LOG_DIR/home/user/logs DATE$(date %Y%m%d) # 把旧的log文件加上日期后缀 cd $LOG_DIR || exit 1 for f in *.log; do mv $f ${f%.log}_${DATE}.log done echo 日志归档完成$(ls)一个典型场景网站每天产生大量访问日志每天定时归档一次。把上面内容保存后执行chmod x run.sh然后./run.sh运行。chmod x是赋予执行权限不加这一句直接运行会报“Permission denied”这是新手最常踩的坑。脚本里再进阶一点可以统计日志中某个关键词出现次数这也是运维面试的经典题grep -c ERROR access.log cat access.log | grep ERROR | wc -l sort access.log | uniq -c | sort -nr | head -10sort | uniq -c | sort -nr | head这条链式处理输出频率最高的内容几乎出现在每一份linux面试题里。可以用一行命令完成“统计IP访问次数并输出Top10”这个技巧背下来面试时直接写出来会非常加分。6. 运维故障排查最容易踩的五个深坑速查经验总是一坑一坑踩出来的。最后整理几个我见过最多、也最容易复现的Linux操作错误做成速查表你实际工作中遇到类似报错先对照着排查一遍。故障现象可能原因快速排查解决思路apt install报“无法定位软件包”没有先执行apt update软件源索引过期apt update刷新索引后重新安装删除文件提示Permission denied文件权限不足或文件被锁定ls -l、lsattr用属主身份登录或chattr -i解锁sudo执行命令报“不在sudoers文件中”用户不在sudo组或未授权id 用户名用root账号执行visudo添加用户系统时间总是慢几分钟NTP同步未开启或时区错误timedatectl设置正确时区并启用chrony/NTP同步磁盘明明没写多少内容占用却很高日志文件或临时文件一直增长df -h、du -sh /*清空日志、删临时文件、定位大文件再补充一个高频坑rm -rf删目录时如果目录是挂载点你删的其实是挂载点目录下的空壳真正的数据还在磁盘上看起来“删不掉”或者“删了半天空间没变”。先df -h看挂载点再umount卸载后重新操作。这个细节没人提醒的话自己排查能浪费半天。防火墙也是一个常被忽略的模块不过“基础指令2”先不展开端口管理只提醒一句遇到网络连不上的问题优先查service firewalld status或ufw status别急着怪程序。这一条在云主机和公司内网服务器上都踩过无数次。个人小建议把上面这些命令整理成自己的速查笔记按“文件、用户、系统、软件、进程”五个分类放好。遇到问题时先按分类找命令再根据输出联想排查路径。Linux的学习不是背命令而是建立“遇到问题→猜测原因→用命令验证→调整操作”的闭环。今天这篇的指令足够你把这个闭环跑起来了。
延伸阅读

更多相关文章

2026/10/8 14:41:11

Java实现巨洞冒险:面向对象建模与游戏状态机设计

简介:本资源是一份面向Java初学者与高校软件工程实践者的完整课程项目开发包,聚焦经典文本冒险游戏“巨洞冒险”的功能拓展与工程化重构。资源以Java面向对象设计为核心,涵盖代码注释完善、类图建模(EA)、开发过程记录…

2026/10/8 14:41:11

Java数据结构全解析:从ArrayList到HashMap与红黑树

1. 先想明白:数据结构在Java里到底是什么 做Java开发三五年的人,跳槽面试时被问“HashMap为什么线程不安全”“ArrayList和LinkedList什么时候选谁”,十有八九会一愣——不是不会,是平时写业务代码根本用不到这些细究。但数据结构…

2026/10/8 14:36:10

Notepad++五大核心插件实战指南:轻量IDE级文本处理工作流

简介:本资源是面向程序员、Web开发者及系统运维人员的Notepad高效开发环境配置包,专为解决新装或重装Notepad后需逐一手动下载配置插件的繁琐问题而设计。压缩包为ZIP格式,共包含数十个经实测兼容的常用插件,涵盖代码比对&#xf…

2026/10/8 15:46:41

Python列表与元组:可变性、性能与应用场景详解

前段时间在技术社区闲逛,看到一个提问:“Python里列表和元组到底有啥区别?我该用哪个?”下面回答区的留言五花八门,但也不少把两者混为一谈的。这个问题看似基础,但真要动手写代码时,不少人还是…

2026/10/8 15:46:41

三数之和双指针解法:去重细节与算法复杂度优化

刷题刷到 LeetCode 15 题“三数之和”,这个位置非常微妙。前十几题基本是数组、字符串、动态规划热身,而这一题一出来,很多人的思维会卡住。题目本身不复杂:给定一个整数数组,找出所有和为 0 且不重复的三元组。但“不…

2026/10/8 15:46:41

Java电商源码改造实战:从跑通到上线的表设计、支付与压测

简介:基于Java技术栈构建的完整电商网站源码项目,面向正在学习Spring Boot、MyBatis、Redis等后端框架,或希望掌握Vue.js/jQuery前端交互的开发者,也适合需要参考实际业务流程的初、中级程序员。项目覆盖用户注册登录、商品分类搜…

2026/10/8 15:46:41

软件测试核心知识全解析:流程、实战、工具与面试攻略

这些年我见过太多人把软件测试理解成“找个人点点按钮”,也见过太多项目因为测试缺位在上线后炸出惊天大雷。软件测试这门活,表面上是执行用例、提bug,内核却是质量建模、风险判断、流程管理,甚至项目管理的全面较量。 这篇文章我…

2026/10/8 15:41:39

隔离内网AI Agent工程实战:本地模型推理与RAG知识库构建

1. 项目背景与整体架构思路1.1 为什么要在内网环境里跑AI Agent接手"隔离内网下AI Agent工程实战"这个项目,是因为一个很现实的问题:很多企业和机构的生产环境物理隔离,终端、业务系统和核心数据都在一个与公网物理断开的独立网络里…

2026/10/8 10:03:18

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/8 10:03:20

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 0:02:17

自然数立方等于连续奇数之和:从证明到编程验证

十几年来我一直游走在数学科普和编程教学这两块内容之间,对“看起来像魔法、拆开全是数学”的结论总是格外敏感。最近翻资料时又撞见一句话:任何一个自然数 m 的立方,都可以写成 m 个连续奇数之和。2 的立方等于 3 加 5,3 的立方等…

2026/10/8 0:02:17

C#上位机SSH连接实战:用SSH.NET补齐超时、批量与密钥认证

简介:这是一份基于 C# 开发的 SSH 连接功能半成品工程,原本作为另一个主项目的子功能模块,现独立打包分享。工程采用 WinForms 界面,包含源码、解决方案、安装部署工程、NuGet 依赖包及说明文档,适合正在做远程连接、网…

2026/10/8 0:02:17

Java SpringBoot一体化智能售后系统设计与实现全解析

毕业设计年年做,Java Web 方向的题目翻来覆去就那么几个,但“一体化智能售后系统”这个题,每次看到我都觉得值得认真聊一聊。它不是一个简单 curd 堆出来的管理系统,而是把客户、工单、派单、处理、回访、统计整条链路串起来的一套…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑