最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Linux打包压缩+剩余指令+shell外壳程序+用户切换全解析
时间:2026-08-06 07:40:50 编辑:袖梨 来源:一聚教程网
Linux打包压缩+剩余指令+shell外壳程序+用户切换全解析并不只看表面做法,关键还要理解相关条件、限制和后续影响。
一,打包压缩zip与tar两套经典方法
1.0前言
1.0.1打包压缩是什么
- 打包 (Archiving):
- 定义:将多个文件或目录集合到一个文件中的过程。
- 比喻:把散落在桌上的零食全部装进一个大纸箱,方便搬运。
- 结果:文件总体积基本不变。
- 压缩 (Compression):
- 定义:通过压缩算法减少文件占用空间的过程。
- 比喻:把纸箱里的海绵垫用力挤压,抽出空气,使体积变小。
- 结果:显著减少存储空间。
1.0.2. 为什么要打包压缩 (应用场景)
打包的目的:防止文件丢失
- 完整性:在传输包含成千上万个碎文件的目录(如代码工程)时,碎文件极易在拷贝过程中丢失或损坏。打包成一个文件可确保“一个都不能少”。
- 管理便利:备份时,处理一个大文件比处理一堆小文件效率更高。
压缩的目的:效率至上
- 节省空间:长期存放不常用的数据时,压缩可以腾出大量硬盘空间。
- 网络加速:在网络传输(如
scp、rz/sz)前压缩,可以大幅缩短传输时间,节省带宽成本。
1.1zip打包压缩指令的使用
打包压缩出来的文件类型非常多,zip和tgz最常见。 压缩包也属于普通文件。
1.1.1指令详解:zip
- 指令名称:zip
- 指令作用:
zip是 Linux/Unix 系统中常用的压缩程序,用于将一个或多个文件压缩成扩展名为.zip的文件。它在保持文件结构的同时能有效减小文件体积,且生成的压缩包在 Windows 和 macOS 上具有极佳的兼容性。 - 指令操作:
zip [选项] [压缩包名.zip] [文件或目录...]
确定你的zip有没有安装,没有安装则安装
[root@VM-0-4-centos ~]# zip versionzip error: Nothing to do! (version.zip)[root@VM-0-4-centos ~]# zip -versionzip warning: Unable to read number (must start with digit): ionzip error: Invalid command arguments (bad split size: 'ion')
安装zip指令:
[root@VM-0-4-centos ~]# yum install -y zip unzip
1.1.2常用选项说明
| 选项 | 说明 |
|---|---|
| -r | 递归处理。用于压缩目录,将指定目录下的所有文件和子目录一并处理。 |
| -m | 移入压缩包。文件压缩后,会自动删除原始文件。 |
| -q | 安静模式。不显示指令执行的过程信息。 |
| -e | 加密。执行指令后会提示输入密码。 |
1.1.3经典使用示例
- 压缩单个文件:
zip documents.zip file1.txt
- 压缩整个目录:
(zip
-r
project_backup.zip ./my_project
一定要加-r不然压缩的就是一个空目录
) - 创建一个带密码保护的压缩包:
zip -re secret.zip private_folder
1.2tar打包压缩指令使用
1.2.1指令详解:tar
- 指令名称:tar (Tape Archive)
- 指令作用:Linux 中最常用的归档工具。它能将大量文件和目录打包成一个单独的
.tar文件,或者进一步压缩为.tar.gz(缩写:.tgz)等格式。tar不同于zip,它默认是递归的。 - 指令操作:
tar [选项] [归档文件名] [文件或目录...] - 常用组合(当然还有别的,但是只记住这两个就完全够用了)
(打包并压缩为.tgz 格式)tar -czf a.tgz files
(解压 .tgz 格式的包)tar -xzf a.tgz
(解压到指定目标路径)tar -zxvf project.tar.gz -C /usr/local/src/
(仅打包不压缩生成.tar文件)tar -cvf project.tar ./my_project
1.2.2 常用选项说明

1.3不同操作系统之间的压缩包传输与解压操作
1.3.1先打包压缩两个文件
我们顺便把上面的两个指令练习一下: 初始文件结构如下,我们接下来要打包压缩mulu01和mulu66。
-bash-4.2# tree.|-- mulu01| `-- mulu01| |-- nihao01| | `-- test789.txt| |-- test01| |-- test02| |-- test03| `-- test23|-- mulu66| |-- nihao01| | `-- test789.txt| |-- test01| |-- test02| |-- test03| `-- test23`-- test.c5 directories, 11 files-bash-4.2#
压缩成功,形成压缩包mulu.zip。和mulu.tgz(压缩一个目录一定要记得-r递归)
-bash-4.2# zip mulu.zip mulu01 adding: mulu01/ (stored 0%)-bash-4.2# tree.|-- mulu01| `-- mulu01| |-- nihao01| | `-- test789.txt| |-- test01| |-- test02| |-- test03| `-- test23|-- mulu66| |-- nihao01| | `-- test789.txt| |-- test01| |-- test02| |-- test03| `-- test23|-- mulu.zip`-- test.c5 directories, 12 files-bash-4.2# tar czf mulu66.tgz mulu66-bash-4.2# tree.|-- mulu01| `-- mulu01| |-- nihao01| | `-- test789.txt| |-- test01| |-- test02| |-- test03| `-- test23|-- mulu66| |-- nihao01| | `-- test789.txt| |-- test01| |-- test02| |-- test03| `-- test23|-- mulu66.tgz|-- mulu.zip`-- test.c5 directories, 13 files-bash-4.2#
1.3.2传输Linux——>windows:sz
安装sz:[root@bite-alicloud other]# yum install -y lrzsz
- 指令名称:sz (Send Zmodem)
- 指令作用:从 Linux 服务器发送文件到本地 Windows。执行后会自动弹出 Windows 的“另存为”窗口。
- 指令操作:
sz [选项] [文件名]
1.3.2Linux——>Linux:scp
检查你的scp是否存在(一般系统都是自带的)
-bash-4.2# scp --visionunknown option -- -usage: scp [-12346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port] [-S program] [[user@]host1:]file1 ... [[user@]host2:]file2-bash-4.2#
1.3.3传输Windows——>Linux:物理拖拽/rz
最省事儿的方法,拖拽:(先安装sz和rz)
更安全的方法:rz:
- 指令名称:rz
- 指令作用:利用 ZModem 协议将本地 Windows 的文件上传到 Linux 服务器。在 Xshell 等终端工具中,输入此命令会弹出 Windows 文件选择对话框。
- 指令操作:
rz [选项]
1.3.4解压指令详解:unzip
- 指令名称:unzip
- 指令作用:专门用于解压缩由
zip指令生成的.zip压缩文件。它可以列出压缩包内容、测试压缩文件完整性以及将文件提取到指定目录。 - 指令操作:
unzip [选项] [压缩包名.zip]
- 常用选项:
:查看压缩包内容,但不解压。-l
:指定解压到的目标目录。-d [目录]
:解压时不询问,直接覆盖同名文件。-o
:解压时显示详细的过程信息.-v
-bash-4.2# unzip -v mulu.zip #显示解压过程Archive: mulu.zip Length Method Size Cmpr Date Time CRC-32 Name-------- ------ ------- ---- ---------- ----- -------- ---- 0 Stored 0 0% 04-15-2026 20:22 00000000 mulu01/-------- ------- --- ------- 0 0 0% 1 file-bash-4.2# unzip mulu.zip -d /root #定向解压
二,剩余指令统讲
2.1 查找指令——find/which/whereis
2.1.1find指令
- 指令名称:find
- 指令作用:在目录树中搜索文件,并执行指定的操作。它支持按文件名、大小、类型、权限、时间戳等多种条件进行查找,是 Linux 中功能最强大的搜索工具。
- 指令操作:
find [在哪里找] [匹配规则] [执行什么操作]
这个最常用
| 名称 | -name | -name "*.sh" | 匹配文件名(区分大小写) |
-bash-4.2# tree.|-- mulu01| `-- mulu01| |-- nihao01| | `-- test789.txt| |-- test01| |-- test02| |-- test03| `-- test23|-- mulu66| |-- nihao01| | `-- test789.txt| |-- test01| |-- test02| |-- test03| `-- test23|-- mulu66.tgz|-- mulu.zip`-- test.c5 directories, 13 files-bash-4.2# find /root -name "test" -ls-bash-4.2# find /root -name "test*" -ls786483 4 -rw-r--r-- 1 root root 297 Apr 15 20:22 /root/mulu01/mulu01/test03786485 0 -rw-r--r-- 1 root root 0 Apr 15 20:22 /root/mulu01/mulu01/nihao01/test789.txt786486 8 -rw-r--r-- 1 root root 4495 Apr 15 20:22 /root/mulu01/mulu01/test02786487 4 -rw-r--r-- 1 root root 28 Apr 15 20:22 /root/mulu01/mulu01/test01786488 0 -rw-r--r-- 1 root root 0 Apr 15 20:22 /root/mulu01/mulu01/test23786468 4 -rw-r--r-- 1 root root 905 Apr 16 10:59 /root/test.c786440 4 -rw-r--r-- 1 root root 297 Mar 31 20:24 /root/mulu66/test03786445 0 -rw-r--r-- 1 root root 0 Mar 30 17:31 /root/mulu66/nihao01/test789.txt786451 8 -rw-r--r-- 1 root root 4495 Mar 31 20:23 /root/mulu66/test02786452 8 -rw-r--r-- 1 root root 4900 Apr 16 09:06 /root/mulu66/test01786480 0 -rw-r--r-- 1 root root 0 Apr 15 20:18 /root/mulu66/test23-bash-4.2#
2.2.2which指令
- 指令名称:which
- 指令作用:用于查找并显示给定命令的绝对路径。它通过在环境变量 PATH 指定的路径中搜索可执行文件,常用于确认某个指令是否存在以及它的具体安装位置。
基本只用来查找指令而不是文件
- 指令操作:
which 指令名称
使用样例:
我们这里看到alias是取别名的意思,在下面有讲。
-bash-4.2# which man/usr/bin/man-bash-4.2# which lsalias ls='ls --color=auto'/usr/bin/ls-bash-4.2# which llalias ll='ls -l --color=auto'/usr/bin/ls-bash-4.2#
2.2.3whereis指令
- 指令名称:whereis
- 指令作用:用于定位指令的二进制程序、源代码文件和 man 手册页等相关文件的路径。相比 find,它的搜索速度更快,因为它直接查询数据库。
- 指令操作:
whereis 指令名称
-bash-4.2# whereis lsls: /usr/bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz-bash-4.2# whereis pwdpwd: /usr/bin/pwd /usr/include/pwd.h /usr/share/man/mann/pwd.n.gz /usr/share/man/man1/pwd.1.gz /usr/share/man/man1p/pwd.1p.gz-bash-4.2# whereis cdcd: /usr/bin/cd /usr/share/man/mann/cd.n.gz /usr/share/man/man1/cd.1.gz /usr/share/man/man1p/cd.1p.gz-bash-4.2#
2.2 过滤器:grep
2.2.1指令介绍
- 指令名称:grep (Global Regular Expression Print)
- 指令作用:强大的文本搜索工具,它能使用正则表达式搜索文本,并将匹配的行打印出来。常配合管道符
|使用,用于过滤其他命令的输出结果。 - 指令操作:
(你要过滤的东西可以不用带“”但是如果你要过滤的东西有空格就必须带“”)grep [选项] [过滤什么] [在哪里过滤]
选项:
- 不区分大小写 -i。
- 显示行号 -n。
- 反向过滤 -v。
2.2.2经典样例与实践操作
我们用日志文件来演示grep的强大功能,如下,我们用cat拉出了一堆message,现在我们想要筛选出其中“有Removed关键字的最后十个文件”
我们输入指令:
-bash-4.2# grep "Removed" /var/log/messages | tail -10Apr 17 13:02:01 VM-0-9-centos systemd: Removed slice User Slice of root.Apr 17 13:03:01 VM-0-9-centos systemd: Removed slice User Slice of root.Apr 17 13:04:01 VM-0-9-centos systemd: Removed slice User Slice of root.Apr 17 13:05:01 VM-0-9-centos systemd: Removed slice User Slice of root.Apr 17 13:06:01 VM-0-9-centos systemd: Removed slice User Slice of root.Apr 17 13:07:01 VM-0-9-centos systemd: Removed slice User Slice of root.Apr 17 13:08:01 VM-0-9-centos systemd: Removed slice User Slice of root.Apr 17 13:09:01 VM-0-9-centos systemd: Removed slice User Slice of root.Apr 17 13:10:01 VM-0-9-centos systemd: Removed slice User Slice of root.Apr 17 13:11:01 VM-0-9-centos systemd: Removed slice User Slice of root.-bash-4.2#
2.3 重命名:alias
2.3.1指令介绍
- 指令名称:alias
- 指令作用:用于为较长或复杂的指令创建别名(简写)。通过设置别名,可以减少输入量并提高工作效率。如果不带参数执行,则显示当前系统中已定义的所有别名。
- 指令操作:
alias [别名]='实际指令'
2.3.2经典样例
常用安全操作: 提供询问。
alias rm='rm -i' # 删除前询问alias cp='cp -i' # 覆盖前询问alias mv='mv -i' # 移动/重命名覆盖前询问
我们在上文看到的,which ll发现它实际上是ls -l的一个别名。
-bash-4.2# which llalias ll='ls -l --color=auto'/usr/bin/ls
2.4 计算器:bc
2.4.1指令介绍
- 指令名称:bc (Binary Calculator)
- 指令作用:一个支持任意精度的交互式计算语言。它可以进行简单的算术运算,也可以进行逻辑运算和科学计算。在脚本中常用于处理浮点数运算。
- 指令操作:
bc [选项]
(在终端输入
bc
进入交互模式,或使用
echo "计算表达式" | bc
)
2.4.2使用样例
- 基本运算:+ (加), - (减), * (乘), / (除), % (取模), ^ (指数)。
- 自增自减:++, --(和 C 语言逻辑一致)。
- 比较:==, <=, >=, !=, <, >。
- 逻辑:&& (与), || (或), ! (非)。
- s(x):正弦函数(x 是弧度)。
- c(x):余弦函数。
- a(x):反正切函数。
- l(x):自然对数(ln)。
-bash-4.2# bcbc 1.06.95Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.This is free software with ABSOLUTELY NO WARRANTY.For details type `warranty'. 9+59+84+565+4576278645*4554635819651707878787/76876102^C(interrupt) Exiting bc.-bash-4.2#
2.5 体系结构查看 uname
2.5.1什么是体系结构
什么是体系结构:
在 Linux 语境下,体系结构(Architecture)通常指硬件平台与操作系统的组合方式。它决定了计算机如何处理数据(如 32 位或 64 位)以及内核的版本信息。概括来看,就是告诉软件:“我这台机器的大脑是什么型号,沟通语言的版本是多少。”
2.5.2指令介绍
- 指令名称:
uname(Unix Name 的缩写) - 指令作用:用于显示当前操作系统的相关信息(如内核版本、硬件架构等)。
- 指令操作:
:显示内核的发行版本号(Release)。uname -r
uname -m
:
显示系统的硬件架构(如 x86_64)。
:显示所有系统信息(包括内核名、节点名、版本、编译时间等)。uname -a
2.6 热键与关机
在 Linux 操作中,熟练使用热键可以极大提高工作效率,避免重复敲打冗长的路径或陷入失控的进程。
2.6.1 重要的几个热键
按键:[Tab]
- 核心功能:命令补全与档案补齐。
- 操作技巧:敲出命令或文件的前几个字母,连按两次
Tab键可以列出所有匹配项。
按键:[Ctrl] + c
- 核心功能:强行停止当前程序。
- 应用场景:当你发现指令跑飞了、陷入死循环或者不想等结果时,直接按下它。
按键:[Ctrl] + d
- 核心功能:键盘输入结束(End Of File, EOF)。
- 操作技巧:可以用来取代
exit指令,快速退出当前的终端登录。
2.6.2 关机指令shutdown
语法: shutdown [选项] [时间]
常见选项说明:
:将系统的服务停掉后,立即关机。-h
:在将系统的服务停掉之后,重新启动(reboot)。-r
:-t sec
-t后面加秒数,表示“过几秒后关机”。
Linux云服务器永远不会关机,除非维护或者不用了。
三,Linux 内核与 Shell 的关系
3.1什么是Shell?
Linux 严格意义上说是一个操作系统,我们称之为 “核心(kernel)”,但我们一般用户,不能直接使用 kernel。而是通过 kernel 的 “外壳” 程序,也就是所谓的 shell,来与 kernel 沟通。如何理解?为什么不能直接使用 kernel?
从技术角度,Shell 的最简单定义:命令行解释器(command Interpreter) 主要包含:
- 将使用者的命令翻译给核心(kernel)处理。
- 同时,将核心的处理结果翻译给使用者。

3.2用一个例子来帮助更好的理解
以下内容纯属瞎编
村里有个程序员叫小王,不仅闷骚,还特别宅。他的生活里只有 0 和 1,让他去敲代码他在行,但要让他去面对村头那个美若天仙、却高冷的 小花,他瞬间就会因为“系统过载”而死机。
小王深知,小花就像家里最精密的保险箱,直接硬闯不仅会被当成流氓(非法指令),还可能被小花反手一个“防御性重置”。于是,小王找到了村里路子最广、嘴皮子最溜的王婆。
第一访:初试成功
小王对王婆说:“帮我问问小花,能不能给我一张她的近照(获取数据)。”
王婆扭着腰去了,她深谙小花的脾性,把小王的“宅男黑话”翻译 成了体贴的问候。小花点点头,把照片交给了王婆。王婆喜滋滋地跑回来,把照片递给小王,顺带还说了一句:“妥了,返回值:0(执行成功)!”
第二访:惨遭拒绝
过了一周,小王胆子大了,让王婆去问:“小花,能把你的存折密码告诉我吗?”
王婆这回刚开口,小花脸就绿了,直接把王婆轰了出来,并附赠了一个大大的白眼。王婆灰头土脸地跑回来对小王摊摊手:“别想了,权限拒绝,错误码:403(Permission Denied)。”
第三访:实习生顶包(关键一战)
第三次,小王心血来潮,非要王婆去问小花能不能一起去吃火锅。王婆刚走到小花家门口,扒着窗户一看,心凉了半截——小花正和隔壁帅气的小帅共进晚餐呢!
王婆心想:“坏了,这要是把这消息直接传回去,依小王那玻璃心,不得直接崩溃、当场撒手人寰(进程崩溃)啊?要是小王挂了,谁给我发佣金(系统停摆)?”
为了保住自己的名声和系统的稳定,王婆灵机一动,转头从兜里掏出一个分身符,变出了个实习生(子进程)。王婆叮嘱实习生:“你去,把这个‘修罗场’的情况确认一下。要是真成了,你回来报信;要是出事了,你被骂就被骂了,反正别连累老娘。”
结果,实习生果然被愤怒的小花一扫帚赶出了家门(子进程报错退出)。王婆站在远处安全区观察着,拍拍胸口,镇定地走回小王家,把实习生的遭遇润色了一下报给小王。王婆(父进程)依然稳如泰山,随时准备处理下一次请求。
3.3核心架构 拆解
看完这个故事,你会发现 Linux 的设计逻辑简直神了。以下是角色与技术的真实对应关系

四.用户切换指令
Linux下的用户有两类:root超级用户(命令提示符:#)与普通用户(命令提示符:$)。所谓权限,我必须先讲清楚——它是用来限制普通用户的。(这一点我们在接下来会慢慢渗透)
4.1.1指令介绍
- 指令名称:su / su -
- 指令重要性:★★★★☆
- 说明:
- su 是Linux中切换用户的核心命令, 尤其在权限管理中极其常用。
- su 仅切换身份,环境变量仍保留原用户。
- su - 则模拟完整登录,彻底切换用户和环境。
4.1.2su的使用案例
普通用户到超级用户的切换必须输入超级用户密码,但是超级用户切换到普通用户不需要输入密码。
[root@VM-0-9-opencloudos ~]# clear[root@VM-0-9-opencloudos ~]# whoamiroot[root@VM-0-9-opencloudos ~]# ls /homelighthouse zbc[root@VM-0-9-opencloudos ~]# su zbc[zbc@VM-0-9-opencloudos root]$ whoamizbc[zbc@VM-0-9-opencloudos root]$ su rootPassword: [root@VM-0-9-opencloudos ~]# whoamiroot
su这个指令是将你whb这个用户的外面套上一层身份,但是我这个whb用户并没有退出。
4.1.3su - 的使用案例
为了更加清晰的看出来su和su - 的区别,我们需要借助目录来帮助观察。
- 如果是重新登录新用户(新建用户),一定会在他的家目录(/root/home/xxx)。
- 如果只是暂时切换身份,目录不会改变。
哎,我找到了一个非常巧妙的案例,首先我们是root用户,在根目录下。对于根目录而言,其他用户是没有写和读权限的。(后面会讲)
所以,当我们用su切换成zbc用户,该用户任然在根目录,既不能执行创建文件夹,又不能读取目录信息。
补充知识:直接按ctrl+d可以”退出当前用户“,如下,我们退出了当前用户zbc回到了root,如果再次按一下ctrl+d,则就把root也退出了。这个快捷键和指令exit的效果一致。
[root@VM-0-9-opencloudos ~]# su zbc[zbc@VM-0-9-opencloudos root]$ mkdir mulu01mkdir: cannot create directory ‘mulu01': Permission denied[zbc@VM-0-9-opencloudos root]$ ls -alls: cannot open directory '.': Permission denied[zbc@VM-0-9-opencloudos root]$ exit[root@VM-0-9-opencloudos ~]# ls -altotal 36dr-xr-x--- 4 root root 202 Apr 25 12:37 .dr-xr-xr-x 18 root root 256 Apr 25 18:33 ..-rw------- 1 root root 209 Apr 25 18:33 .bash_history-rw-r--r-- 1 root root 18 Apr 23 2025 .bash_logout-rw-r--r-- 1 root root 141 Apr 23 2025 .bash_profile[root@VM-0-9-opencloudos ~]# [C:~]$
看,我按su - 不久可以回到zbc的家目录了?于是我可以读可以写。这就说明了su - 确实是模拟了一次重新登录。
[root@VM-0-9-opencloudos ~]# clear[root@VM-0-9-opencloudos ~]# su - zbcLast login: Sat Apr 25 18:32:25 CST 2026 on pts/0[zbc@VM-0-9-opencloudos ~]$ pwd/home/zbc[zbc@VM-0-9-opencloudos ~]$ ls -ltotal 1956drwxr-xr-x 4 zbc zbc 40 Apr 23 15:43 gitcage-rw-r--r-- 1 zbc zbc 87 Apr 25 14:19 ma6174-rw-r--r-- 1 zbc zbc 149 Apr 25 14:21 makefile-rw-r--r-- 1 zbc zbc 0 Apr 25 12:57 PassWordForZbc[zbc@VM-0-9-opencloudos ~]$
于是有小伙伴要问了:那么我这个时候按ctrl+d为什么还能够回到原来的root,这是什么原理?好问题!,但是这个问题得放到进程的时候讲,现在可以简单了解一下。
[zbc@VM-0-9-opencloudos ~]$ logout[root@VM-0-9-opencloudos ~]#