Linux打包压缩+剩余指令+shell外壳程序+用户切换全解析并不只看表面做法,关键还要理解相关条件、限制和后续影响。
打包的目的:防止文件丢失
压缩的目的:效率至上
scp、rz/sz)前压缩,可以大幅缩短传输时间,节省带宽成本。打包压缩出来的文件类型非常多,zip和tgz最常见。 压缩包也属于普通文件。
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 | 加密。执行指令后会提示输入密码。 |
zip documents.zip file1.txt
zip
-r
project_backup.zip ./my_project
(一定要加-r不然压缩的就是一个空目录
)zip -re secret.zip private_folder
.tar 文件,或者进一步压缩为 .tar.gz (缩写:.tgz)等格式。tar不同于zip,它默认是递归的。tar [选项] [归档文件名] [文件或目录...]tar -czf a.tgz files
(打包并压缩为.tgz 格式)tar -xzf a.tgz
(解压 .tgz 格式的包)tar -zxvf project.tar.gz -C /usr/local/src/
(解压到指定目标路径)tar -cvf project.tar ./my_project
(仅打包不压缩生成.tar文件)
我们顺便把上面的两个指令练习一下: 初始文件结构如下,我们接下来要打包压缩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#
安装sz:[root@bite-alicloud other]# yum install -y lrzsz
sz [选项] [文件名]
检查你的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#
最省事儿的方法,拖拽:(先安装sz和rz)
更安全的方法:rz:
rz [选项]
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 #定向解压
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#
基本只用来查找指令而不是文件
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#
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#
| 使用,用于过滤其他命令的输出结果。grep [选项] [过滤什么] [在哪里过滤]
(你要过滤的东西可以不用带“”但是如果你要过滤的东西有空格就必须带“”)选项:
我们用日志文件来演示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#
alias [别名]='实际指令'
常用安全操作: 提供询问。
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
bc [选项]
(在终端输入
bc
进入交互模式,或使用
echo "计算表达式" | bc
)
- 基本运算:+ (加), - (减), * (乘), / (除), % (取模), ^ (指数)。
- 自增自减:++, --(和 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#
什么是体系结构:
在 Linux 语境下,体系结构(Architecture)通常指硬件平台与操作系统的组合方式。它决定了计算机如何处理数据(如 32 位或 64 位)以及内核的版本信息。概括来看,就是告诉软件:“我这台机器的大脑是什么型号,沟通语言的版本是多少。”
uname (Unix Name 的缩写)uname -r
:显示内核的发行版本号(Release)。uname -m
:
显示系统的硬件架构(如 x86_64)。uname -a
:显示所有系统信息(包括内核名、节点名、版本、编译时间等)。在 Linux 操作中,熟练使用热键可以极大提高工作效率,避免重复敲打冗长的路径或陷入失控的进程。
[Tab]
按键:Tab 键可以列出所有匹配项。[Ctrl] + c
按键:[Ctrl] + d
按键:exit 指令,快速退出当前的终端登录。语法:
shutdown [选项] [时间]
常见选项说明:
-h
:将系统的服务停掉后,立即关机。-r
:在将系统的服务停掉之后,重新启动(reboot)。-t sec
:-t 后面加秒数,表示“过几秒后关机”。Linux云服务器永远不会关机,除非维护或者不用了。
Linux 严格意义上说是一个操作系统,我们称之为 “核心(kernel)”,但我们一般用户,不能直接使用 kernel。而是通过 kernel 的 “外壳” 程序,也就是所谓的 shell,来与 kernel 沟通。如何理解?为什么不能直接使用 kernel?
从技术角度,Shell 的最简单定义:命令行解释器(command Interpreter) 主要包含:

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

Linux下的用户有两类:root超级用户(命令提示符:#)与普通用户(命令提示符:$)。所谓权限,我必须先讲清楚——它是用来限制普通用户的。(这一点我们在接下来会慢慢渗透)
普通用户到超级用户的切换必须输入超级用户密码,但是超级用户切换到普通用户不需要输入密码。
[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用户并没有退出。
为了更加清晰的看出来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 ~]#