目录
- 课程目标
- [Linux 背景](#Linux 背景)
- [使用 XShell 远程登录 Linux](#使用 XShell 远程登录 Linux)
- [Linux 下基本指令](#Linux 下基本指令)
- [Shell 命令以及运行原理](#Shell 命令以及运行原理)
- [Linux 权限](#Linux 权限)
学习目标
- 初识 Linux 操作系统。
- 初识 Shell 命令,了解若干背景知识。
- 初步使用 40 多个常用 Linux 命令。
- 掌握 Linux 权限的概念与思想,深入理解"权限"。
- 初步了解 Linux 目录结构的含义。
- 了解 Linux 目录结构、路径、重定向、管道操作等相关知识。
Linux 背景
1. 发展史
本门课程学习 Linux 系统编程。你可能会问:Linux 从哪里来?它是怎样发展的?这里简要介绍 Linux 的发展史。要说 Linux,还得从 UNIX 说起。
UNIX 的发展历史
- 1968 年,一些来自通用电气公司、贝尔实验室和麻省理工学院的研究人员开发了一个名为 Multics 的特殊操作系统。Multics 在多任务、文件管理和用户连接中综合了许多新概念。
- 1969-1970 年,AT&T 贝尔实验室的研究人员 Ken Thompson 和 Dennis Ritchie 在采用许多 Multics 特点的基础上开发了 UNIX 系统。它运行在小型机上,满足了科研环境的系统需求。从诞生之初,UNIX 就是一个有价值、高效、多用户、多任务的操作系统。
- UNIX 从满足个人设计需求开始,逐步成长为由许多不同开发商支持的标准软件产品。
- 第一个 UNIX 版本免费提供给许多知名大学的计算机系使用。
- 1972 年,贝尔实验室开始发放商业版本,并授权不同用户使用该系统。使用者之一是加州大学伯克利分校的计算机系。伯克利为系统增加了许多新特性,这些特性后来成为标准。
- 1975 年,伯克利下属部门 BSD 发行了自己的 UNIX 版本。BSD 版 UNIX 成为 AT&T 贝尔实验室版本的主要竞争者,其他独立开发的 UNIX 版本也开始出现。
- 1980 年,微软公司开发了名为 Xenix 的 UNIX PC 版本。AT&T 发行了第一个商业版本 System III,后来被能更好支持商业软件产品的 System V 取代。
- 与此同时,BSD 版 UNIX 不断发展。20 世纪 70 年代末,BSD UNIX 成为美国国防部高科技研究机构科研项目的基础。其后,伯克利发行了名为 BSD Release 4.2 的有效版本。
- BSD Release 4.2 包含高级文件管理和基于 TCP/IP 网络协议的网络特性。TCP/IP 如今被 Internet 使用。BSD Release 4.2 被许多厂商采用,例如 SUN Microsystems。
- UNIX 不同版本的出现,使 UNIX 标准变得必要:软件开发商难以确定程序适合运行在哪个版本上。
- 到 20 世纪 80 年代中期,出现了两个相互竞争的标准:一个基于 AT&T 的 UNIX 版本,另一个基于 BSD 版本。当时书店中的 UNIX 图书也分别适用于这两个版本:一些面向 System V,另一些聚焦 BSD UNIX。
- AT&T 建立了名为 UNIX 系统实验室的新组织,用来综合 UNIX 的不同版本,并集中开发一个标准系统。
- 1991 年,UNIX 系统实验室综合 System V Release 3、SunOS 和 Xenix 的特性,发行 System V Release 4。为了与 System V Release 4 竞争,IBM、惠普等公司通过开放软件基金会(Open Software Foundation,OSF)制定自己的 UNIX 标准版本,继而形成 OSF 和 System V Release 4 两个标准商业版本。
- 1993 年,AT&T 将 UNIX 转卖给 Novell 公司,UNIX 系统实验室成为 Novell UNIX 系统小组的一部分。Novell 发行了基于 System V Release 4 的 UNIXWare,它可以与 Novell NetWare 系统相连。SUN 公司也将 System V Release 4 融入 SunOS,发行 Solaris。两个相互竞争的 UNIX 图形用户界面 Motif 和 OpenLook 后来合并为新的工作平台标准:通用桌面环境(Common Desktop Environment,CDE)。
Linux 的发展历史
- 1991 年 10 月 5 日,赫尔辛基大学研究生 Linus Benedict Torvalds 在 Usenet 新闻组
comp.os.minix中宣布,他编制出一种类似 UNIX 的小型操作系统 Linux。这个新操作系统受到另一个小型 UNIX 系统 Minix 的启发;Minix 由 Andrew S. Tanenbaum 教授开发。读者也许会猜测,当时发布的是 Linux 0.01,实际并非如此。真正的 Linux 0.01 没有正式发布,因为它还不实用。Linus 只在第一个 Linux FTP 站点上提供过该版本的源代码。 - Torvalds 于 10 月 5 日发布的版本称为 Linux 0.02。它能够运行 GNU Bourne Again Shell(Bash)、GNU C 编译器(GCC)以及少数其他工具。Torvalds 当时并未预料到,他为高级业余爱好者和黑客构想的操作系统会发展为今天所称的 Linux。
- Linux 发布时的版本是 0.02,之后出现了 0.03,随后跳到 0.10。随着世界各地越来越多的程序员参与开发,Linux 达到 0.95,这意味着正式发布 1.0 的时间已经不远。Linux 1.0 于 1994 年正式发布。

- 对比一下 Windows 发展史。

2. 开源
- Linux 是一种自由、开放源代码的类 UNIX 操作系统。其内核由 Linus Torvalds 于 1991 年首次发布;在内核上加入用户空间应用程序后,就形成了 Linux 操作系统。严格来说,Linux 只是操作系统内核本身,通常用"Linux 内核"表达这一含义;而"Linux"则常用来指基于 Linux 内核的完整操作系统,其中包括 GUI 组件和许多其他实用工具。
- GNU 通用公共许可证(GNU General Public License,简称 GNU GPL 或 GPL)是一种被广泛使用的自由软件许可证,最初由 Richard Stallman 为 GNU 计划撰写。GPL 赋予计算机程序自由软件的定义;任何基于 GPL 软件开发的衍生产品,在发布时必须采用 GPL 许可证,并公开源代码。
- Linux 是自由软件和开放源代码软件发展中最著名的例子之一。只要遵循 GNU 通用公共许可证,任何个人和机构都可以自由使用 Linux 的底层源代码,也可以自由修改和再发布。随着 Linux 操作系统快速发展,集成在 Linux 上的各种开源软件和实用工具也得到应用和普及,因此 Linux 也成为开源软件的代名词。
3. 官网
- Linux 内核官网。https://www.kernel.org/
4. 企业应用现状
Linux 在服务器领域的发展
随着开源软件在世界范围内的影响力日益增强,Linux 服务器操作系统在整个服务器操作系统市场中占据了越来越大的份额,已经形成大规模应用,并保持快速增长,尤其是在政府、金融、农业、交通、电信等国家关键领域。考虑到 Linux 的快速成长以及国家相关政策的扶持力度,Linux 服务器产品有望进入更广阔的服务器市场。
据权威部门统计,Linux 在服务器领域已经占据 75% 的市场份额。Linux 在服务器市场迅速崛起,引起全球 IT 产业的高度关注,并以强劲势头成为服务器操作系统领域的中坚力量。
Linux 在桌面领域的发展
近年来,特别是在国内市场,Linux 桌面操作系统发展迅速。中标麒麟 Linux、红旗 Linux、深度 Linux 等国内系统软件厂商都推出了 Linux 桌面操作系统,并已在政府、企业、OEM 等领域得到广泛应用。SUSE、Ubuntu 也相继推出基于 Linux 的桌面系统,特别是 Ubuntu Linux,已经积累了大量社区用户。
但是,从系统的整体功能和性能来看,Linux 桌面系统与 Windows 系列相比仍有一定差距,主要表现在系统易用性、系统管理、软硬件兼容性和软件丰富程度等方面。
Linux 在移动嵌入式领域的发展
Linux 成本低、定制能力强、移植性能良好,因此在嵌入式系统中得到广泛应用,覆盖手机、平板电脑、路由器、电视和电子游戏机等领域。移动设备上广泛使用的 Android 操作系统就是建立在 Linux 内核之上的。据 2015 年权威部门统计,Android 在全球智能手机操作系统市场的份额已达到 84.6%。
此外,思科在网络防火墙和路由器中也使用定制的 Linux;阿里云开发了基于 Linux 的操作系统 YunOS,可用于智能手机、平板电脑和网络电视;常见的数字视频录像机、舞台灯光控制系统等也逐渐采用定制版 Linux 实现。这一切都得益于 Linux 与开源的力量。
Linux 在云计算和大数据领域的发展
互联网产业的迅猛发展推动了云计算和大数据产业的形成与快速发展。云计算、大数据平台大量基于开源软件构建,Linux 因此占据核心优势。据 Linux 基金会研究,86% 的企业已使用 Linux 操作系统构建云计算和大数据平台,Linux 开始取代 UNIX,成为备受青睐的云计算和大数据平台操作系统。
5. 发行版本
Debian
Debian 运行极其稳定,因此非常适合服务器。Debian 不太适合新手用户,而更适合系统管理员和高级用户。
Ubuntu
Ubuntu 是 Debian 的衍生发行版,也是流行的免费操作系统。Ubuntu 重视面向市场的应用,常见于服务器、云计算乃至部分移动设备。Ubuntu 是一款适合新手用户的发行版。
红帽企业级 Linux
红帽企业级 Linux 是面向商业市场的 Linux 发行版,提供服务器版本,并支持包括 x86 和 x86_64 在内的多种处理器架构。红帽公司通过红帽认证系统管理员和红帽认证工程师课程(RHCSA/RHCE)培训并认证系统管理员。
CentOS
CentOS 是一款企业级 Linux 发行版,使用红帽企业级 Linux 的自由源代码重新构建而成。该重构版移除了注册商标,并对二进制软件包做了非常细微的调整。对于希望体验红帽企业级 Linux、但不想支付高额费用的用户,CentOS 是一种选择。CentOS 的外观和行为与其上游发行版红帽企业级 Linux 十分相似,并使用 YUM 管理软件包。
Fedora
Fedora 适合希望尝试前沿技术、并愿意在稳定版本发布前体验新功能的用户。Fedora 是红帽公司的测试平台,产品在进入企业级发行版之前会在该平台上开发和测试。Fedora 拥有庞大的用户论坛,软件仓库中也有大量软件包。
Kali Linux
Kali Linux 是 Debian 的衍生发行版,面向渗透测试,其前身是 BackTrack。适用于 Debian 的二进制软件包都可以安装到 Kali Linux 上;Debian 用户社区也为 Kali 提供了支持。Kali 自带大量渗透测试工具,覆盖 Wi-Fi、数据库等多个方向,并使用 APT 管理软件包。
毫无疑问,Kali Linux 是一款渗透测试工具,也是文明黑客(这里不讨论恶意黑客)青睐的操作系统。
- ......
https://www.xshell.com/zh/free-for-home-school/
6. OS 概念与定位
让计算机更好用,这是操作系统的根本要义。

使用 XShell 远程登录 Linux
关于 Linux 桌面
启动 Linux 后会进入图形化桌面。这个东西大家以后就可以忘记了;以后的工作中没有机会使用图形界面。
思考:为什么不使用图形界面?
下载安装 XShell
XShell 是一款远程终端软件。下载安装时选择 home/school,即可使用免费版本。
查看 Linux 主机 IP
在终端中执行以下命令查看 IP 地址:
text
ifconfig
使用 XShell 登录主机
在 XShell 终端中执行以下命令,其中 [ip] 替换为刚才通过 ifconfig 查到的 IP 地址:
text
ssh [ip]
如果网络畅通,系统将提示输入用户名和密码,正确输入后即可登录。
XShell 中的复制与粘贴
- 复制:
Ctrl + Insert。部分键盘上的Insert需要配合Fn使用。 - 粘贴:
Shift + Insert。 Ctrl + C和Ctrl + V在此处不能用于常规复制和粘贴。
Linux 下基本指令
ls 指令
语法: ls [选项] [目录或文件]
功能: 对于目录,该命令列出目录下的子目录与文件;对于文件,则列出文件名及其他信息。
常用选项:
-a:列出目录下的所有文件,包括以.开头的隐藏文件。-d:像显示文件一样显示目录本身,而不是显示目录中的文件,例如ls -d 指定目录。-i:输出文件 inode 的索引信息,例如ls -ai 指定文件。-k:以 KiB 为单位显示文件大小,例如ls -alk 指定文件。-l:列出文件的详细信息。-n:使用数字形式的 UID、GID 代替名称。-F:在每个文件名后添加一个字符说明文件类型。*表示可执行的普通文件,/表示目录,@表示符号链接,|表示 FIFO,=表示套接字(socket)。-r:反向排序。-t:按时间排序。-s:显示文件占用的块数。-R:递归列出所有子目录中的文件。-1:每行只输出一个文件。
示例:
text
[whb@bite-alicloud test]$ ls
dir file.txt
[whb@bite-alicloud test]$ ls -a
. .. dir file.txt
[whb@bite-alicloud test]$ ls -a -l
total 12
drwxrwxr-x 3 whb whb 4096 Jan 11 15:01 .
drwx------ 22 whb whb 4096 Jan 11 14:21 ..
drwxrwxr-x 2 whb whb 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 whb whb 0 Jan 11 14:22 file.txt
[whb@bite-alicloud test]$ ls -a -l -F
total 12
drwxrwxr-x 3 whb whb 4096 Jan 11 15:01 ./
drwx------ 22 whb whb 4096 Jan 11 14:21 ../
drwxrwxr-x 2 whb whb 4096 Jan 11 14:22 dir/
-rw-rw-r-- 1 whb whb 0 Jan 11 14:22 file.txt
[whb@bite-alicloud test]$ ls -alFn
total 12
drwxrwxr-x 3 1003 1003 4096 Jan 11 15:01 ./
drwx------ 22 1003 1003 4096 Jan 11 14:21 ../
drwxrwxr-x 2 1003 1003 4096 Jan 11 14:22 dir/
-rw-rw-r-- 1 1003 1003 0 Jan 11 14:22 file.txt
pwd 命令
语法: pwd
功能: 显示用户当前所在的目录。
常用选项: 无。
示例:
text
[whb@bite-alicloud test]$ pwd
/home/whb/test
cd 指令
路径的认识
- Linux 系统中,磁盘上的文件和目录被组织成一棵目录树,每个节点都是目录或文件。
- 普通文件一定是目录树的叶子节点。
- 目录可能是叶子节点(空目录),也可能是路径上的节点。
- 树状组织方式用于快速定位指定文件。由于任意节点都只有一个父节点,因此从根目录开始定位指定文件时,路径具有唯一性。
- 绝对路径: 一般从
/开始,是不依赖其他目录定位文件的方式。 - 相对路径: 相对于用户当前所在目录定位文件的方式。
- 绝对路径一般不会随着用户当前位置的变化而失去唯一性,因此常用于特定服务的配置文件。
- 相对路径使用便捷,因此在命令行中使用较多。


语法: cd 目录名
功能: 改变工作目录,将当前工作目录切换到指定目录。
示例:
text
# 返回上级目录
[whb@bite-alicloud ~]$ pwd
/home/whb
[whb@bite-alicloud ~]$ cd ..
[whb@bite-alicloud home]$ pwd
/home
# 使用绝对路径定位目录或文件
[whb@bite-alicloud home]$ pwd
/home
[whb@bite-alicloud home]$ cd /home/whb/test
[whb@bite-alicloud test]$ pwd
/home/whb/test
# 使用相对路径定位目录或文件
[whb@bite-alicloud test]$ pwd
/home/whb/test
[whb@bite-alicloud test]$ cd ../temp/
[whb@bite-alicloud temp]$ pwd
/home/whb/temp
# 每次新建用户时,系统都会在 /home 下创建一个以用户名命名的工作目录。
# root 用户在操作系统安装时就已经拥有工作目录 /root。
[whb@bite-alicloud temp]$ ls /home
bss gaobo luojie whb wudu
# 快速进入自己的家目录
[whb@bite-alicloud test]$ whoami
whb
[whb@bite-alicloud test]$ pwd
/home/whb/test
[whb@bite-alicloud test]$ cd ~
[whb@bite-alicloud ~]$ pwd
/home/whb
# 返回最近访问的目录
[whb@bite-alicloud ~]$ pwd # 当前位于 /home/whb
/home/whb
[whb@bite-alicloud ~]$ cd / # 进入根目录
[whb@bite-alicloud /]$ pwd
/
[whb@bite-alicloud /]$ cd - # 返回最近一次所在的目录 /home/whb
/home/whb
[whb@bite-alicloud ~]$ pwd
/home/whb
[whb@bite-alicloud ~]$ cd - # 再次返回最近一次所在的目录 /
/
[whb@bite-alicloud /]$ pwd
/
[whb@bite-alicloud /]$ cd - # 同上
/home/whb
[whb@bite-alicloud ~]$ pwd
/home/whb
touch 指令
Linux 理论知识:文件类型的认识
语法: touch [选项]... 文件...
功能: touch 可以更改文件或目录的时间戳,包括访问时间和修改时间;也可以创建一个不存在的空文件。
常用选项:
-a:只更改访问时间(access time)。-c:不创建不存在的文件。-m:只更改修改时间(modification time)。
示例:
text
# 创建普通文件
[whb@bite-alicloud test]$ ls
dir file.txt
[whb@bite-alicloud test]$ touch newFile.txt
[whb@bite-alicloud test]$ ls
dir file.txt newFile.txt
# 查看文件时间
[whb@bite-alicloud test]$ stat newFile.txt
File: 'newFile.txt'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd01h/64769d Inode: 1844719 Links: 1
Access: (0664/-rw-rw-r--) Uid: (1003/whb) Gid: (1003/whb)
Access: 2023-01-11 15:06:45.832787572 +0800
Modify: 2023-01-11 15:06:45.832787572 +0800
Change: 2023-01-11 15:06:45.832787572 +0800
Birth: -
# 修改文件的 access 时间
[whb@bite-alicloud test]$ touch -a newFile.txt
[whb@bite-alicloud test]$ stat newFile.txt
File: 'newFile.txt'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd01h/64769d Inode: 1844719 Links: 1
Access: (0664/-rw-rw-r--) Uid: (1003/whb) Gid: (1003/whb)
Access: 2023-01-11 15:07:00.062846804 +0800
Modify: 2023-01-11 15:06:45.832787572 +0800
Change: 2023-01-11 15:07:00.062846804 +0800 # 该时间为何会变化?
Birth: -
# 修改文件的 Modify 时间
[whb@bite-alicloud test]$ touch -m newFile.txt
[whb@bite-alicloud test]$ stat newFile.txt
File: 'newFile.txt'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd01h/64769d Inode: 1844719 Links: 1
Access: (0664/-rw-rw-r--) Uid: (1003/whb) Gid: (1003/whb)
Access: 2023-01-11 15:07:00.062846804 +0800
Modify: 2023-01-11 15:09:19.428426903 +0800
Change: 2023-01-11 15:09:19.428426903 +0800
Birth: -
更多内容将在基础 I/O 部分统一讲解。
mkdir 指令
语法: mkdir [选项] dirname...
功能: 在当前目录下创建名为 dirname 的目录。
常用选项:
-p、--parents:参数可以是路径名。如果路径中的某些目录尚不存在,使用该选项后,系统会自动创建这些目录,即一次建立多级目录。
示例:
text
# 创建普通空目录
[whb@bite-alicloud test]$ ls -l
total 4
drwxrwxr-x 2 whb whb 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 whb whb 0 Jan 11 14:22 file.txt
-rw-rw-r-- 1 whb whb 0 Jan 11 15:09 newFile.txt
[whb@bite-alicloud test]$ mkdir mydir
[whb@bite-alicloud test]$ ls -l
total 8
drwxrwxr-x 2 whb whb 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 whb whb 0 Jan 11 14:22 file.txt
drwxrwxr-x 2 whb whb 4096 Jan 11 15:15 mydir
-rw-rw-r-- 1 whb whb 0 Jan 11 15:09 newFile.txt
# 递归创建多级目录
[whb@bite-alicloud test]$ mkdir -p path1/path2/path3/path4
[whb@bite-alicloud test]$ ls -l
total 12
drwxrwxr-x 2 whb whb 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 whb whb 0 Jan 11 14:22 file.txt
drwxrwxr-x 2 whb whb 4096 Jan 11 15:15 mydir
-rw-rw-r-- 1 whb whb 0 Jan 11 15:09 newFile.txt
drwxrwxr-x 3 whb whb 4096 Jan 11 15:16 path1
[whb@bite-alicloud test]$ tree path1
path1
└── path2
└── path3
└── path4
tree 命令以树状结构递归显示指定目录。如果尚未安装,可根据用户身份执行:
text
# 当前用户是 root
yum install -y tree
# 当前用户是普通用户
sudo yum install -y tree
后续讲完 Vim 并将普通用户添加到系统信任列表后,普通用户才能使用 sudo;当前阶段推荐使用 root 用户安装。
rmdir 与 rm 指令
rmdir 指令
rmdir 是与 mkdir 相对应的命令。mkdir 用于建立目录,rmdir 用于删除目录。
语法: rmdir [-p] [dirName]
适用对象: 对当前目录具有操作权限的所有用户。
功能: 删除空目录。
常用选项:
-p:删除子目录后,如果父目录也变为空目录,则一并删除父目录。
示例:
text
# 删除空目录
[whb@bite-alicloud test]$ ll
total 12
drwxrwxr-x 2 whb whb 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 whb whb 0 Jan 11 14:22 file.txt
drwxrwxr-x 2 whb whb 4096 Jan 11 15:15 mydir
-rw-rw-r-- 1 whb whb 0 Jan 11 15:09 newFile.txt
drwxrwxr-x 3 whb whb 4096 Jan 11 15:16 path1
[whb@bite-alicloud test]$ tree mydir/
mydir/
0 directories, 0 files
[whb@bite-alicloud test]$ rmdir mydir
[whb@bite-alicloud test]$ ll
total 8
drwxrwxr-x 2 whb whb 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 whb whb 0 Jan 11 14:22 file.txt
-rw-rw-r-- 1 whb whb 0 Jan 11 15:09 newFile.txt
drwxrwxr-x 3 whb whb 4096 Jan 11 15:16 path1
# 删除多级空目录
[whb@bite-alicloud test]$ tree path1
path1
└── path2
└── path3
└── path4
3 directories, 0 files
[whb@bite-alicloud test]$ rmdir -p path1/path2/path3/path4
[whb@bite-alicloud test]$ ll
total 4
drwxrwxr-x 2 whb whb 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 whb whb 0 Jan 11 14:22 file.txt
-rw-rw-r-- 1 whb whb 0 Jan 11 15:09 newFile.txt
如果指定路径中存在非空目录,便无法使用 rmdir 删除。
rmdir 示例(续)
text
[whb@bite-alicloud test]$ rmdir -p path1/path2/path3
rmdir: failed to remove 'path1/path2/path3': Directory not empty
[whb@bite-alicloud test]$ touch path1/myfile.txt
[whb@bite-alicloud test]$ touch path1/path2/myfile.txt
[whb@bite-alicloud test]$ tree path1/
path1/
├── myfile.txt
└── path2
├── myfile.txt
└── path3
└── path4
3 directories, 2 files
[whb@bite-alicloud test]$ rmdir -p path1/path2/path3/path4
rmdir: failed to remove directory 'path1/path2': Directory not empty
rm 指令
rm 命令可以同时删除文件或目录。
语法
text
rm [-f -i -r -v] [dirName/file]
适用对象: 所有使用者。
功能: 删除文件或目录。
常用选项
-f:即使文件属性为只读(即写保护),也直接删除。-i:删除前逐一询问确认。-r:递归删除目录及其下的所有文件。
示例
text
# 删除普通文件
[whb@bite-alicloud test]$ ll
total 8
drwxrwxr-x 2 whb whb 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 whb whb 0 Jan 11 14:22 file.txt
-rw-rw-r-- 1 whb whb 0 Jan 11 15:09 newFile.txt
drwxrwxr-x 3 whb whb 4096 Jan 11 15:26 path1
[whb@bite-alicloud test]$ rm file.txt
[whb@bite-alicloud test]$ ll
total 8
drwxrwxr-x 2 whb whb 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 whb whb 0 Jan 11 15:09 newFile.txt
drwxrwxr-x 3 whb whb 4096 Jan 11 15:26 path1
# 删除目录文件
[whb@bite-alicloud test]$ ll
total 8
drwxrwxr-x 2 whb whb 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 whb whb 0 Jan 11 15:09 newFile.txt
drwxrwxr-x 3 whb whb 4096 Jan 11 15:26 path1
[whb@bite-alicloud test]$ rm dir
rm: cannot remove 'dir': Is a directory
[whb@bite-alicloud test]$ rm -r dir
[whb@bite-alicloud test]$ ll
total 4
-rw-rw-r-- 1 whb whb 0 Jan 11 15:09 newFile.txt
drwxrwxr-x 3 whb whb 4096 Jan 11 15:26 path1
# 删除普通文件前询问
[whb@bite-alicloud test]$ ll
total 4
-rw-rw-r-- 1 whb whb 0 Jan 11 15:09 newFile.txt
drwxrwxr-x 3 whb whb 4096 Jan 11 15:26 path1
[whb@bite-alicloud test]$ rm -i newFile.txt
rm: remove regular empty file 'newFile.txt'? y
[whb@bite-alicloud test]$ ll
total 4
drwxrwxr-x 3 whb whb 4096 Jan 11 15:26 path1
[whb@bite-alicloud test]$ ll
total 4
drwxrwxr-x 3 whb whb 4096 Jan 11 15:26 path1
# 删除目录前询问
[whb@bite-alicloud test]$ mkdir -p d/d/d/d
[whb@bite-alicloud test]$ tree d
d
└── d
└── d
└── d
3 directories, 0 files
[whb@bite-alicloud test]$ rm -ri d
rm: descend into directory 'd'? y
rm: descend into directory 'd/d'? y
rm: descend into directory 'd/d/d'? y
rm: remove directory 'd/d/d/d'? y
rm: remove directory 'd/d/d'? y
rm: remove directory 'd/d'? y
rm: remove directory 'd'? y
[whb@bite-alicloud test]$ ll
total 0
# 递归强制删除非空目录
[whb@bite-alicloud test]$ tree path1/
path1/
├── myfile.txt
└── path2
└── myfile.txt
1 directory, 2 files
[whb@bite-alicloud test]$ rm -f path1
rm: cannot remove 'path1': Is a directory
[whb@bite-alicloud test]$ rm -rf path1
[whb@bite-alicloud test]$ ll
total 0
man 指令
Linux 的命令有很多参数,不可能全部记住,可以通过查看联机手册获取帮助。
语法
text
man [选项] 命令
常用选项
-k:根据关键字搜索联机帮助。num:只在第num章中查找。-a:显示所有章节。例如,man printf默认从第一章开始搜索,找到后就停止;使用-a选项时,按q退出当前结果后会继续向后搜索,直到显示完所有章节。
man 手册的章节
不同系统的章节划分可能略有差别:
- 普通命令。
- 系统调用,如
open、write等;可由此查询调用函数时需要包含的头文件。 - 库函数,如
printf、fread等。 - 特殊文件,即
/dev下的各种设备文件。 - 文件格式,例如
passwd,会说明文件中各字段的含义。 - 游戏,由各个游戏自行定义。
- 附件以及一些变量,例如全局变量
environ。 - 系统管理命令,这些命令通常由
root使用,例如ifconfig。 - 其他内容,此处略。
示例
text
[whb@bite-alicloud test]$ man printf # 查看 printf 指令(printf 也是一个命令)
[whb@bite-alicloud test]$ man fork # 查看系统调用;man 会自动到第 2 章查找
[whb@bite-alicloud test]$ man 2 fork # 在第 2 章查看系统调用
[whb@bite-alicloud test]$ man 3 printf # 查看 C 库函数
[whb@bite-alicloud test]$ man 7 signal # 查看变量
[whb@bite-alicloud test]$ man 7 environ
[whb@bite-alicloud test]$ man man # 查看 man 手册自身
cp 指令
语法
text
cp [选项] 源文件或目录 目标文件或目录
功能: 复制文件或目录。
说明
cp指令用于复制文件或目录。- 如果同时指定两个以上的文件或目录,且最后的目的地是一个已存在的目录,则会把前面指定的所有文件或目录复制到该目录中。
常用选项
-f或--force:强行复制文件或目录,不论目标文件或目录是否已经存在。-i或--interactive:覆盖文件之前先询问用户。-r:递归处理,将指定目录下的文件与子目录一并处理。若源文件或目录的形态不属于目录或符号链接,则一律视为普通文件处理。
示例
text
# 复制普通文件
[whb@bite-alicloud test]$ echo "你好比特就业课" > myfile.txt
[whb@bite-alicloud test]$ cat myfile.txt
你好比特就业课
[whb@bite-alicloud test]$ ll
total 4
-rw-rw-r-- 1 whb whb 22 Jan 11 15:47 myfile.txt
[whb@bite-alicloud test]$ cp myfile.txt myfile-backup.txt
[whb@bite-alicloud test]$ ll
total 8
-rw-rw-r-- 1 whb whb 22 Jan 11 15:47 myfile-backup.txt
-rw-rw-r-- 1 whb whb 22 Jan 11 15:47 myfile.txt
[whb@bite-alicloud test]$ cat myfile-backup.txt
你好比特就业课
# 将多个文件复制到指定路径下
[whb@bite-alicloud test]$ ll
total 8
-rw-rw-r-- 1 whb whb 22 Jan 11 15:47 myfile-backup.txt
-rw-rw-r-- 1 whb whb 22 Jan 11 15:47 myfile.txt
[whb@bite-alicloud test]$ mkdir dir
[whb@bite-alicloud test]$ ll
total 12
drwxrwxr-x 2 whb whb 4096 Jan 11 15:48 dir
-rw-rw-r-- 1 whb whb 22 Jan 11 15:47 myfile-backup.txt
-rw-rw-r-- 1 whb whb 22 Jan 11 15:47 myfile.txt
[whb@bite-alicloud test]$ cp *.txt dir # * 表示通配符,匹配所有以 .txt 结尾的文件名
[whb@bite-alicloud test]$ ll
total 12
drwxrwxr-x 2 whb whb 4096 Jan 11 15:48 dir
-rw-rw-r-- 1 whb whb 22 Jan 11 15:47 myfile-backup.txt
-rw-rw-r-- 1 whb whb 22 Jan 11 15:47 myfile.txt
[whb@bite-alicloud test]$ tree dir
dir
├── myfile-backup.txt
└── myfile.txt
# cp 的目标文件存在时,直接覆盖
[whb@bite-alicloud test]$ echo "hello bite tech" > myfile.txt
[whb@bite-alicloud test]$ cat myfile.txt
hello bite tech
[whb@bite-alicloud test]$ cp myfile.txt myfile-backup.txt
[whb@bite-alicloud test]$ cat myfile-backup.txt
hello bite tech
# 覆盖前询问
[whb@bite-alicloud test]$ cp -i myfile.txt myfile-backup.txt
cp: overwrite 'myfile-backup.txt'? y
# 递归强制复制整个目录
[whb@bite-alicloud ~]$ tree test
test
├── dir
│ ├── myfile-backup.txt
│ └── myfile.txt
├── myfile-backup.txt
└── myfile.txt
1 directory, 4 files
[whb@bite-alicloud ~]$ cp -rf test test-backup
[whb@bite-alicloud ~]$ tree test-backup
test-backup
├── dir
│ ├── myfile-backup.txt
│ └── myfile.txt
├── myfile-backup.txt
└── myfile.txt
1 directory, 4 files
mv 指令
mv 是 move 的缩写,可以用来移动文件或者将文件改名(move/rename files),经常用来备份文件或者目录。
语法
text
mv [选项] 源文件或目录 目标文件或目录
功能
- 根据第二个参数的类型不同(目标文件或目标目录),
mv会将文件重命名或移至新的目录中。 - 当第二个参数是文件时,
mv完成文件重命名。此时源文件只能有一个(也可以是源目录名),它会将源文件或目录重命名为给定的目标文件名。 - 当第二个参数是已存在的目录时,源文件或目录参数可以有多个,
mv会将各参数指定的源文件移至目标目录中。
常用选项
-f:force(强制)。如果目标文件已经存在,不会询问而直接覆盖。-i:如果目标文件(destination)已经存在,则询问是否覆盖。
示例
text
# 更改名称
[whb@bite-alicloud test]$ touch myfile.txt
[whb@bite-alicloud test]$ ll
total 0
-rw-rw-r-- 1 whb whb 0 Jan 11 15:56 myfile.txt
[whb@bite-alicloud test]$ mv myfile.txt yourfile.txt
[whb@bite-alicloud test]$ ll
total 0
-rw-rw-r-- 1 whb whb 0 Jan 11 15:56 yourfile.txt
# 当前路径存在同名文件时,改名会覆盖该文件
[whb@bite-alicloud test]$ touch myfile.txt
[whb@bite-alicloud test]$ ll
total 0
-rw-rw-r-- 1 whb whb 0 Jan 11 15:58 myfile.txt
-rw-rw-r-- 1 whb whb 0 Jan 11 15:57 yourfile.txt
[whb@bite-alicloud test]$ mv yourfile.txt myfile.txt
[whb@bite-alicloud test]$ ll
total 0
-rw-rw-r-- 1 whb whb 0 Jan 11 15:57 myfile.txt
# 当前路径存在同名文件时,添加 -i 选项,让系统提出警告供用户选择
[whb@bite-alicloud test]$ touch yourfile.txt
[whb@bite-alicloud test]$ ll
total 0
-rw-rw-r-- 1 whb whb 0 Jan 11 15:57 myfile.txt
-rw-rw-r-- 1 whb whb 0 Jan 11 15:59 yourfile.txt
[whb@bite-alicloud test]$ mv -i yourfile.txt myfile.txt
mv: overwrite 'myfile.txt'? y
[whb@bite-alicloud test]$ ll
total 0
-rw-rw-r-- 1 whb whb 0 Jan 11 15:59 myfile.txt
# 移动文件和整个目录
[whb@bite-alicloud test]$ touch myfile.txt
[whb@bite-alicloud test]$ mkdir temp
[whb@bite-alicloud test]$ ll
total 4
-rw-rw-r-- 1 whb whb 0 Jan 11 17:56 myfile.txt
drwxrwxr-x 2 whb whb 4096 Jan 11 17:56 temp
[whb@bite-alicloud test]$ mv myfile.txt temp
[whb@bite-alicloud test]$ ls
temp
[whb@bite-alicloud test]$ mv temp ../
[whb@bite-alicloud test]$ ls
[whb@bite-alicloud test]$ ls -d ../temp
../temp
cat 指令
语法
text
cat [选项] [文件]
功能: 查看目标文件的内容。
常用选项
-b:对非空输出行编号,空行不编号。-n:对所有输出行编号。-s:将连续多行空行压缩成一行。
示例
text
# 在命令行构建多行文本
[whb@bite-alicloud test]$ cnt=0; while [ $cnt -le 20 ]; do echo "hello bite"; let cnt++; done > temp.txt
# 测试 cat 基本命令
[whb@bite-alicloud test]$ cat temp.txt
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
# cat 输出携带行号
[whb@bite-alicloud test]$ cat -b temp.txt
1 hello bite
2 hello bite
3 hello bite
4 hello bite
5 hello bite
6 hello bite
7 hello bite
...
# 修改 temp.txt,使其包含连续空行
[whb@bite-alicloud test]$ vim temp.txt
# 测试 -b:只对非空输出行编号
[whb@bite-alicloud test]$ cat -b temp.txt
1 hello bite
2 hello bite
3 hello bite
4 hello bite
5 hello bite
6 hello bite
7 hello bite
...
# 测试 -n:对所有输出行编号
[whb@bite-alicloud test]$ cat -n temp.txt
1 hello bite
2 hello bite
3 hello bite
4
5
6
7 hello bite
8 hello bite
9
10 hello bite
11 hello bite
...
# 测试 -s:将连续多行空行压缩成一行
[whb@bite-alicloud test]$ cat -s temp.txt
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
...
more 指令
语法
text
more [选项] [文件]
功能: more 命令的功能与 cat 类似,可分页显示文件内容。
常用选项与操作
-n:指定每页输出的行数。q:退出more。
示例
text
# 在命令行生成多行文本
[whb@bite-alicloud test]$ cnt=0; while [ $cnt -le 2000 ]; do echo "hello bite"; let cnt++; done > temp.txt
# 指定输出 10 行
[whb@bite-alicloud test]$ more -10 temp.txt
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
--More--(0%)
less 指令
less是对文件或其他输出进行分页显示的工具,是 Linux 中常用的文件内容查看工具,功能很强大。- 与
more相比,less的使用更灵活。more只能向后查看,而less可以使用 Page Up、Page Down 等按键前后翻页。 less还支持向下搜索和向上搜索等功能。
语法
text
less [参数] 文件
功能: less 与 more 类似,但使用 less 可以随意浏览文件,而 more 只能向前移动。less 在查看之前不会加载整个文件。
常用选项与操作
-i:搜索时忽略大小写。-N:显示每行的行号。/字符串:向下搜索"字符串"。?字符串:向上搜索"字符串"。n:重复前一次搜索(与/或?有关)。N:反向重复前一次搜索(与/或?有关)。q:退出less。
示例
text
# 在命令行生成多行文本
[whb@bite-alicloud test]$ cnt=0; while [ $cnt -le 2000 ]; do echo "hello $cnt"; let cnt++; done > temp.txt
# 测试搜索和 -N 等功能
[whb@bite-alicloud test]$ less -N temp.txt
1 hello 0
2 hello 1
3 hello 2
4 hello 3
5 hello 4
6 hello 5
7 hello 6
8 hello 7
9 hello 8
10 hello 9
11 hello 10
12 hello 11
13 hello 12
14 hello 13
...
# 其他选项也可以直接测试
head 指令
head 与 tail 的含义很直观:它们分别用于显示文件开头或结尾的指定数量文本。head 将文件开头的内容输出到标准输出,tail 则查看文件结尾。
语法
text
head [参数]... [文件]...
功能: head 用于将文件开头的内容输出到标准输出。默认情况下,head 打印相应文件的前 10 行。
常用选项
-n<行数>:指定显示的行数。
示例
text
[whb@bite-alicloud test]$ head temp.txt
hello 0
hello 1
hello 2
hello 3
hello 4
hello 5
hello 6
hello 7
hello 8
hello 9
[whb@bite-alicloud test]$ head -5 temp.txt
hello 0
hello 1
hello 2
hello 3
hello 4
tail 指令
tail 命令从指定位置开始将文件内容写到标准输出。使用 tail 的 -f 选项可以方便地查看正在变化的日志文件;tail -f filename 会将 filename 末尾的内容显示在屏幕上并不断刷新,使用户看到最新内容。
语法
text
tail [必要参数] [文件]
功能: 显示指定文件的末尾内容;不指定文件时,将输入信息作为处理对象。该命令常用于查看日志文件。
常用选项
-f:循环读取,持续显示文件追加的内容。-n<行数>:指定显示的行数。
示例
以下示例同时简单演示重定向和管道。
text
# 基本功能演示
[whb@bite-alicloud test]$ tail temp.txt
hello 1991
hello 1992
hello 1993
hello 1994
hello 1995
hello 1996
hello 1997
hello 1998
hello 1999
hello 2000
[whb@bite-alicloud test]$ tail -3 temp.txt
hello 1998
hello 1999
hello 2000
模拟动态日志查看功能

综合问题
如何显示文件第 [180, 200] 行的内容:
text
[whb@bite-alicloud test]$ head -200 temp.txt | tail -20
hello 180
hello 181
hello 182
hello 183
hello 184
hello 185
hello 186
hello 187
hello 188
hello 189
hello 190
hello 191
hello 192
hello 193
hello 194
hello 195
hello 196
hello 197
hello 198
hello 199
date 指令
指定格式显示时间
text
date +%Y:%m:%d
用法
text
date [OPTION]... [+FORMAT]
1. 显示格式
用户可以设定时间的显示格式。格式以加号开头,后接一个或多个标记。常用标记如下:
%H:小时(00..23)。%M:分钟(00..59)。%S:秒(00..61)。%X:相当于%H:%M:%S。%d:日(01..31)。%m:月份(01..12)。%Y:完整年份(0000..9999)。%F:相当于%Y-%m-%d。
2. 设置时间
只有 root 用户可以设置时间,其他用户只能查看。
text
date -s # 设置当前时间
date -s 20080523 # 设置日期为 2008-05-23,时间变为 00:00:00
date -s 01:01:01 # 设置时间,不更改日期
date -s "01:01:01 2008-05-23" # 同时设置日期和时间
date -s "01:01:01 20080523" # 同时设置日期和时间
date -s "2008-05-23 01:01:01" # 同时设置日期和时间
date -s "20080523 01:01:01" # 同时设置日期和时间
3. 时间戳
- 时间转换为时间戳:
date +%s。 - 时间戳转换为可读时间:
date -d @1508749502。 - Unix 时间戳(Unix epoch、Unix time、POSIX time 或 Unix timestamp)是从 1970 年 1 月 1 日 UTC/GMT 午夜开始所经过的秒数,不考虑闰秒。
4. 示例
text
# 显示常规时间
[whb@bite-alicloud test]$ date
Wed Jan 11 18:22:50 CST 2023
[whb@bite-alicloud test]$ date +%Y/%m/%d
2023/01/11
[whb@bite-alicloud test]$ date +%Y/%m/%d-%H:%M:%S
2023/01/11-18:23:20
# 显示时间戳
[whb@bite-alicloud test]$ date +%s
1673432636
# 时间戳转换为可读时间
[whb@bite-alicloud test]$ date +%Y/%m/%d-%H:%M:%S -d @0
1970/01/01-08:00:00
[whb@bite-alicloud test]$ date +%Y/%m/%d-%H:%M:%S -d @100000
1970/01/02-11:46:40
text
[whb@bite-alicloud test]$ date +%Y/%m/%d-%H:%M:%S -d @1000000000
2001/09/09-09:46:40
cal 指令
cal 命令可以用来显示公历(阳历)日历。公历是现在国际通用的历法,又称格列历,通称阳历。"阳历"又名"太阳历",以地球绕行太阳一周为一年,为西方各国所通用,故又名"西历"。
命令格式:
text
cal [参数] [年份]
功能: 用于查看日历等时间信息。只有一个参数时,该参数表示年份(1-9999);有两个参数时,分别表示月份和年份。
常用选项:
-3:显示上一个月、当前月和下一个月的月历。-j:显示日期在当年中的第几天,从 1 月 1 日算起;默认显示当前月各日期在当年中的天数。-y:显示当前年份的日历。
举例:
text
# 常规样例
[whb@bite-alicloud test]$ cal
January 2023
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
[whb@bite-alicloud test]$ cal 1949
1949
January February March
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 1 2 3 4 5 1 2 3 4 5
2 3 4 5 6 7 8 6 7 8 9 10 11 12 6 7 8 9 10 11 12
9 10 11 12 13 14 15 13 14 15 16 17 18 19 13 14 15 16 17 18 19
16 17 18 19 20 21 22 20 21 22 23 24 25 26 20 21 22 23 24 25 26
23 24 25 26 27 28 29 27 28 27 28 29 30 31
...
[whb@bite-alicloud test]$ cal -3
December 2022 January 2023 February 2023
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 3 1 2 3 4 5 6 7 1 2 3 4
4 5 6 7 8 9 10 8 9 10 11 12 13 14 5 6 7 8 9 10 11
11 12 13 14 15 16 17 15 16 17 18 19 20 21 12 13 14 15 16 17 18
18 19 20 21 22 23 24 22 23 24 25 26 27 28 19 20 21 22 23 24 25
25 26 27 28 29 30 31 29 30 31 26 27 28
find 指令
- Linux 下的
find命令在目录结构中搜索文件,并执行指定的操作。 find提供了相当多的查找条件,功能很强大,选项也很多,其中大部分选项都值得花时间了解。- 即使系统中含有网络文件系统(NFS),只要具有相应权限,
find命令在该文件系统中同样有效。 - 运行非常消耗资源的
find命令时,很多人倾向于把它放在后台执行,因为遍历一个大型文件系统可能会花费很长时间(这里指 30 GB 以上的文件系统)。
语法:
text
find pathname -options
功能: 用于在文件树中查找文件,并作出相应处理,过程中可能访问磁盘。
常用选项:
-name:按照文件名查找文件。- 其他选项需要进一步查阅;这个命令本身比较复杂。
举例:
text
# 在指定路径下搜索指定名称的文件
[whb@bite-alicloud test]$ find ~ -name test.c
/home/whb/test_code/old_code/test.c
/home/whb/test_code/test.c
...
which 指令
功能: 搜索系统中指定命令的位置。
举例:
text
[whb@bite-alicloud test]$ which ls
alias ls='ls --color=auto'
/usr/bin/ls
[whb@bite-alicloud test]$ which pwd
/usr/bin/pwd
whereis 指令
功能: 用于查找程序的源文件、二进制文件或手册。
举例:
text
[whb@bite-alicloud test]$ whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz
[whb@bite-alicloud test]$ whereis libc.so
libc: /usr/lib64/libc.so /usr/lib64/libc.a /usr/share/man/man7/libc.7.gz
alias 指令
功能: 设置命令的别名。
举例:
text
[whb@bite-alicloud test]$ alias hello='ls -a -l -n'
[whb@bite-alicloud test]$ which hello
alias hello='ls -a -l -n'
/usr/bin/ls
[whb@bite-alicloud test]$ hello
total 36
drwxrwxr-x 2 1003 1003 4096 Jan 11 17:59 .
drwx------ 22 1003 1003 4096 Jan 11 17:57 ..
-rw-rw-r-- 1 1003 1003 28667 Jan 11 18:29 temp.txt
grep 指令
语法:
text
grep [选项] 搜寻字符串 文件
功能: 在文件中搜索字符串,并将找到的行打印出来。
常用选项:
-i:忽略大小写差异,将大写和小写视为相同。-n:同时输出行号。-v:反向选择,显示不包含"搜寻字符串"的行。
举例:
text
# 文件内容
[whb@bite-alicloud test]$ cat temp.txt
abcd
ABCD
hello
bite
1234
# 基本查找
[whb@bite-alicloud test]$ grep "abcd" temp.txt
abcd
# 忽略大小写差异
[whb@bite-alicloud test]$ grep -i "abcd" temp.txt
abcd
ABCD
# 同时输出行号
[whb@bite-alicloud test]$ grep -n "abcd" temp.txt
1:abcd
[whb@bite-alicloud test]$ grep -ni "abcd" temp.txt
1:abcd
2:ABCD
# 反向选择,显示不包含"搜寻字符串"的行
[whb@bite-alicloud test]$ grep -v "abcd" temp.txt
ABCD
hello
bite
1234
[whb@bite-alicloud test]$ grep -vn "abcd" temp.txt
2:ABCD
3:hello
4:bite
5:1234
[whb@bite-alicloud test]$ grep -vni "abcd" temp.txt
3:hello
4:bite
5:1234
top 指令
text
top -d 1 -n 5
-d:刷新的时间间隔
-n:刷新的次数
q:退出
zip / unzip 指令
语法:
text
zip 压缩文件.zip 目录或文件
功能: 将目录或文件压缩成 ZIP 格式。
常用选项:
-r:递归处理,将指定目录下的所有文件和子目录一并处理。
举例:
text
# 将 test2 目录压缩
zip test2.zip test2/*
# 解压到 /tmp 目录
unzip test2.zip -d /tmp
关于 lrzsz
lrzsz 用于 Windows 机器和远端 Linux 机器之间通过 XShell 传输文件。安装后可以通过拖拽方式上传文件。
text
# CentOS / RHEL
sudo yum install -y lrzsz
# Debian / Ubuntu
sudo apt install -y lrzsz
现场演示 Windows 和 Linux 如何互传文件。
tar 指令(重要)
用于打包、解包,也可以不解包而直接查看归档内容。
语法:
text
tar [-cxtzjvf] 文件与目录 ...
参数:
-c:建立一个归档文件(create)。-x:解开一个归档文件。-t:查看 tar 文件中的文件。-z:使用 gzip 压缩或解压缩。-j:使用 bzip2 压缩或解压缩。-v:在处理过程中显示文件。这个选项常用,但不建议用于后台执行过程。-f:指定文件名。注意,-f后要立即接文件名,不要再插入其他参数。-C:解压到指定目录。
范例一:打包整个 /etc 目录
将整个 /etc 目录下的文件打包成 /tmp/etc.tar:
text
[root@linux ~]$ tar -cvf /tmp/etc.tar /etc
# 仅打包,不压缩
[root@linux ~]$ tar -zcvf /tmp/etc.tar.gz /etc
# 打包后使用 gzip 压缩
[root@linux ~]$ tar -jcvf /tmp/etc.tar.bz2 /etc
# 打包后使用 bzip2 压缩
特别注意,-f 后的文件名由自己指定。习惯上使用 .tar 表示未压缩的归档;增加 -z 后,常用 .tar.gz 或 .tgz 表示 gzip 压缩的 tar 文件;增加 -j 后,常用 .tar.bz2 作为扩展名。
上述命令执行时可能显示如下警告,这是绝对路径的特殊处理:
text
tar: Removing leading '/' from member names
范例二:查看归档内容
查看 /tmp/etc.tar.gz 中有哪些文件:
text
[root@linux ~]$ tar -ztvf /tmp/etc.tar.gz
由于使用 gzip 压缩,查看该 tar 文件时需要加上 -z 参数。
范例三:解压到 /usr/local/src
text
[root@linux ~]$ cd /usr/local/src
[root@linux src]$ tar -zxvf /tmp/etc.tar.gz
默认情况下,可以在任何位置解开压缩文件。这里先将工作目录切换到 /usr/local/src,再解开 /tmp/etc.tar.gz,解出的目录将位于 /usr/local/src/etc。进入 /usr/local/src/etc 后会发现,其中的文件属性可能与 /etc 中的文件属性不同。
范例四:只解出 etc/passwd
在 /tmp 下,只解出 /tmp/etc.tar.gz 中的 etc/passwd:
text
[root@linux ~]$ cd /tmp
[root@linux tmp]$ tar -zxvf /tmp/etc.tar.gz etc/passwd
可以通过 tar -ztvf 查看 tar 文件内的文件名。如果只需要一个文件,可以用这种方式解出。注意,etc.tar.gz 中成员路径开头的 / 已被去掉。
范例五:备份 /etc 并保留权限
text
[root@linux ~]$ tar -zcvpf /tmp/etc.tar.gz /etc
# -p 用于保留原文件的权限属性
范例六:备份 /home 中较新的文件
只备份 /home 中比 2005/06/01 新的文件:
text
[root@linux ~]$ tar -N "2005/06/01" -zcvf home.tar.gz /home
范例七:备份时排除目录
备份 /home、/etc,但排除 /home/dmtsai:
text
[root@linux ~]$ tar --exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc
范例八:通过管道直接复制目录树
将 /etc 打包后直接解开到 /tmp,而不产生中间归档文件:
text
[root@linux ~]$ cd /tmp
[root@linux tmp]$ tar -cvf - /etc | tar -xvf -
这个动作类似 cp -r /etc /tmp。输出文件和输入文件都写成 -,中间使用管道 |;它们分别表示标准输出、标准输入和管道命令。
现场演示如何在 Linux 主机之间互传压缩包。
bc 指令
bc 命令可以很方便地进行浮点运算。
uname 指令
语法:
text
uname [选项]
功能: 获取计算机和操作系统的相关信息,可显示 Linux 主机所用的内核版本、硬件名称等基本信息。
常用选项:
-r:显示内核发行版本。-a或--all:详细输出所有信息,依次包括内核名称、主机名、内核发行版本、内核版本、硬件名、处理器类型、硬件平台类型和操作系统名称。
查看操作系统发行版信息可以使用:
text
lsb_release -a
重要的几个热键
[Tab]:具有命令补全和文件名补全功能。[Ctrl]-c:终止当前程序。[Ctrl]-d:通常表示键盘输入结束(End Of File,EOF,或 End Of Input);也可以用来代替exit。
关机
语法:
text
shutdown [选项]
常见选项:
-h:停止系统服务后立即关机。-r:停止系统服务后重新启动。-t sec:指定延迟的秒数,即若干秒后关机。
扩展命令
- 安装和登录命令:
login、shutdown、halt、reboot、install、mount、umount、chsh、exit、last。 - 文件处理命令:
file、mkdir、grep、dd、find、mv、ls、diff、cat、ln。 - 系统管理相关命令:
df、top、free、quota、at、lp、adduser、groupadd、kill、crontab。 - 网络操作命令:
ifconfig、ip、ping、netstat、telnet、ftp、route、rlogin、rcp、finger、mail、nslookup。 - 系统安全相关命令:
passwd、su、umask、chgrp、chmod、chown、chattr、sudo、ps、who。 - 其他命令:
tar、unzip、gunzip、unarj、mtools、man、uuencode、uudecode。
Shell 命令以及运行原理
严格意义上,Linux 是一个操作系统内核(kernel)。普通用户不能直接使用内核,而是通过内核的"外壳"程序,也就是 shell,与内核沟通。
从技术角度看,Shell 最简单的定义是命令行解释器(command interpreter),主要包含两项功能:
- 将用户的命令翻译给内核处理。
- 将内核的处理结果反馈给用户。
对比 Windows GUI,我们不是直接操作 Windows 内核,而是通过图形接口完成操作,例如双击磁盘盘符或启动应用程序。Shell 对于 Linux 具有类似作用:它解析用户输入的命令,将其交给 Linux 内核执行,再把内核的执行结果反馈给用户。
帮助理解:如果把用户比作一位害羞的程序员,把操作系统内核比作村头让他心动的小花,那么 shell 就像替双方传话的媒婆。用户的事情都先与媒婆沟通,再由媒婆把意思转达给小花。我们常用的
bash就承担这样的角色。
Linux 权限
Linux 权限的概念
Linux 下有两种用户:超级用户(root)和普通用户。
- 超级用户: 可以在 Linux 系统下执行几乎所有管理操作。
- 普通用户: 在 Linux 下只能执行其权限范围内的操作。
- 超级用户的命令提示符是
#,普通用户的命令提示符是$。
命令:
text
su [用户名]
功能: 切换用户。
例如,从 root 用户切换到普通用户 user:
text
su user
从普通用户 user 切换到 root 用户时,可以使用 su root,其中 root 可以省略;此时系统会提示输入 root 用户的口令。
Linux 权限管理
1. 文件访问者的分类
- 文件和目录的所有者:
u,即 User。 - 文件和目录的所有者所在组的用户:
g,即 Group。 - 其他用户:
o,即 Others。
2. 文件类型和访问权限
文件类型:
d:目录。-:普通文件。l:软链接,类似 Windows 的快捷方式。b:块设备文件,例如硬盘、光驱等。p:管道文件。c:字符设备文件,例如屏幕等串口设备。s:套接字文件。
基本权限:
- 读(
r/ 4): 对文件而言,表示读取文件内容的权限;对目录而言,表示浏览目录信息的权限。 - 写(
w/ 2): 对文件而言,表示修改文件内容的权限;对目录而言,表示修改目录项的权限,例如创建、删除或移动其中的文件,通常还需要目录的执行权限。 - 执行(
x/ 1): 对文件而言,表示执行文件的权限;对目录而言,表示进入目录以及访问其中目录项的权限。 -:表示不具有该项权限。
文件权限值的表示方法
- 字符表示方法。
- 八进制数值表示方法。
文件访问权限的相关设置方法
1. chmod
功能: 设置文件的访问权限。
格式:
text
chmod [参数] 权限 文件名
常用选项:
-R:递归修改目录及其中内容的权限。- 只有文件的所有者和
root才可以改变文件权限。
chmod 的符号权限格式为:
text
用户表示符 +|-|= 权限字符
+:向权限范围增加权限。-:从权限范围取消权限。=:将权限范围设置为指定权限。u:所有者。g:与所有者同组的用户。o:其他用户。a:所有用户。
实例:
text
chmod u+w /home/abc.txt
chmod o-x /home/abc.txt
chmod a=x /home/abc.txt
也可以使用三位八进制数字表示权限:
text
chmod 664 /home/abc.txt
chmod 640 /home/abc.txt
2. chown
功能: 修改文件的所有者。
格式:
text
chown [参数] 用户名 文件名
实例:
text
chown user1 f1
chown -R user1 filegroup1
3. chgrp
功能: 修改文件或目录的所属组。
格式:
text
chgrp [参数] 用户组名 文件名
常用选项: -R,递归修改文件或目录的所属组。
实例:
text
chgrp users /abc/f2
4. umask
功能: 查看或修改文件创建掩码。
- 新建普通文件的基础权限为
0666。 - 新建目录的基础权限为
0777。 - 实际创建权限会受到
umask影响:实际权限 = 基础权限 & ~umask。
格式:
text
umask [权限值]
超级用户的默认掩码通常为 0022,普通用户通常为 0002;具体值以系统配置为准。
实例:
text
umask 755
# 查看当前 umask
umask
# 设置 umask
umask 044
file 指令
功能: 识别文件类型。
语法:
text
file [选项] 文件或目录 ...
常用选项:
-c:详细显示命令执行过程,便于排错或分析程序执行情况。-z:尝试解读压缩文件的内容。
使用 sudo 分配权限
1. 配置授权
修改 /etc/sudoers 文件来分配权限:
text
chmod 740 /etc/sudoers
vi /etc/sudoers
授权条目的基本格式为:
text
接受权限的用户 登录主机=(执行命令的用户) 命令
2. 调用授权命令
text
sudo -u 用户名 命令
实例:
text
sudo -u root /usr/sbin/useradd u2
目录的权限
- 执行权限: 如果目录没有执行权限,就无法
cd进入目录,也无法按名称访问目录中的条目。 - 读权限: 如果目录没有读权限,就无法使用
ls等命令列出目录中的文件名。 - 写权限: 目录的写权限允许修改目录项。通常同时具有写权限和执行权限时,用户可以在目录中创建、删除或重命名文件。
因此,只要用户对目录具有写权限和执行权限,就可能删除目录中的文件,而不取决于该用户是否对文件本身具有写权限。下面用一个过程进行验证:
text
[root@localhost ~]$ chmod 0777 /home/
[root@localhost ~]$ ls -ld /home/
drwxrwxrwx. 3 root root 4096 9月 19 15:58 /home/
[root@localhost ~]$ touch /home/root.c
[root@localhost ~]$ ls -l /home/
总用量 4
-rw-r--r--. 1 root root 0 9月 19 15:58 abc.c
drwxr-xr-x. 27 litao litao 4096 9月 19 15:53 litao
-rw-r--r--. 1 root root 0 9月 19 15:59 root.c
[root@localhost ~]$ su - litao
[litao@localhost ~]$ rm /home/root.c # litao 可以删除 root 创建的文件
rm:是否删除有写保护的普通空文件 "/home/root.c"?y
[litao@localhost ~]$ exit
logout
为了解决这一问题,Linux 引入了粘滞位的概念。
关于权限的总结
- 目录的执行权限表示能否进入目录以及按名称访问目录中的条目。
- 如果目录没有
x权限,就无法cd进入目录,也无法访问其中的文件,即使目录仍有r权限。 - 如果目录有
x权限但没有r权限,用户可以cd进入目录,并按已知名称访问目录项,但不能列出目录内容。 - 因此,在目录下即使可以运行
ls命令,没有目录的读权限时仍无法列出其中的文件名。
粘滞位(选学)
text
[root@localhost ~]$ chmod +t /home/ # 加上粘滞位
[root@localhost ~]$ ls -ld /home/
drwxrwxrwt. 3 root root 4096 9月 19 16:00 /home/
[root@localhost ~]$ su - litao
[litao@localhost ~]$ rm /home/abc.c # litao 不能删除别人的文件
rm:是否删除有写保护的普通空文件 "/home/abc.c"?y
rm: 无法删除 "/home/abc.c": 不允许的操作
当目录被设置粘滞位(chmod +t)后,该目录下的文件只能由以下用户删除:
- 超级用户。
- 该目录的所有者。
- 该文件的所有者。