第一章 磁盘和文件管理
1、磁盘管理
1.1 目录结构
[root@xy /]# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
/bin
:bin是二进制(binary)的缩写,包含基本命令行程序,这些程序在没有文件系统的情况下也能运行,因此通常存储在引导媒体中。/boot
:包含系统启动时所需的文件,如内核(vmlinuz)和引导加载程序(如GRUB)。/dev
:dev是设备(device)的缩写,包含指向设备节点的文件。这些文件用于访问系统硬件设备。/etc
:包含系统配置文件。/home
:用户的家目录通常位于此,每个用户的默认家目录通常以用户名命名,例如/home/username
。/lib
:包含系统共享库文件,是/bin和/sbin可执行文件的依赖库。/media
:挂载用于媒体设备的目录,如CD-ROM和USB驱动器。/mnt
:用于临时挂载文件系统的目录。/opt
:第三方应用程序的安装位置,例如Oracle数据库。/proc
:包含有关正在运行的进程和系统的信息。/root
:root用户的家目录。/sbin
:包含系统二进制文件,通常仅由系统管理员使用。/srv
:服务的数据目录,如网络服务的站点。/sys
:包含系统硬件信息的目录,例如设备树。/tmp
:临时文件存储位置。/usr
:包含大量应用程序和文件,例如/usr/bin包含用户程序,/usr/lib包含共享库等。/var
:包含在正常操作中会改变的文件,如日志文件和打印队列。
1.2 pwd
pwd 显示出当前/活动目录的名称
[root@xy /]# pwd
/
[root@xy /]#
1.3 man、--help
1.3.1 man命令
man 格式化并显示在线帮助手册页
空格翻页
q退出
1.3.2 --help参数
查看一个命令的帮助,一次性列出
[root@xy /]# ls --help
用法:ls [选项]... [文件]...
1.4 ls
ls [选项] [文件或目录]
常用选项:
-l
: 以长列表格式显示信息,包括文件权限、文件大小、拥有者、所属组以及修改时间等信息。-a
: 显示所有文件,包括隐藏文件(以.
开头的文件)。-d
: 只显示目录本身,而不显示其内容。-R
: 递归地列出目录及其子目录的内容。-h
: 人类可读的文件大小,例如 1K、2M、3G 等。-t
: 按修改时间排序。-r
: 以反向顺序排序。-S
: 按文件大小排序。-i
: 显示文件的 inode 号。-F
: 在文件名后添加表示文件类型的字符:*
表示可执行文件,/
表示目录,@
表示符号链接。
[root@xy tmp]# ll -a /opt
总用量 0
drwxr-xr-x. 3 root root 16 7月 2 12:38 .
dr-xr-xr-x. 17 root root 224 7月 2 2024 ..
drwxr-xr-x. 2 root root 6 10月 31 2018 rh
1.5 cd
cd .. 回到上一级
cd ~ 回到主目录
cd / 回到根目录
cd opt 切换当前目录下的opt
[root@xy tmp]# pwd
/tmp
[root@xy tmp]# cd ..
[root@xy /]# pwd
/
[root@xy /]# cd ~
[root@xy ~]# pwd
/root
[root@xy ~]# cd /
[root@xy /]# pwd
/
[root@xy /]# cd opt/
[root@xy opt]# pwd
/opt
2、文件管理
2.1 mkdir
mkdir [选项] 目录...
-m
:设置新目录的文件模式(权限),通常表示为数字字符串,如“755”或“644”。-p
:如果指定的目录已存在,则此选项可确保不报告任何错误。它还允许根据需要创建父目录。-v
:提供详细的输出,解释 mkdir 命令正在做什么。
[root@xy opt]# mkdir -pvm 777 /opt/test /opt/test/test1
mkdir: 已创建目录 "/opt/test"
mkdir: 已创建目录 "/opt/test/test1"
[root@xy opt]# ll
总用量 0
drwxr-xr-x. 2 root root 6 10月 31 2018 rh
drwxrwxrwx. 3 root root 19 7月 2 14:10 test
2.2 touch
touch [选项] 文件...
常用选项:
-a
: 仅更新访问时间。-m
: 仅更新修改时间。-c
: 如果文件已存在,则不创建新文件。-t
: 设置文件时间戳为指定的时间戳。
[root@xy opt]# touch test.txt test2.java
[root@xy opt]# ll
总用量 0
drwxr-xr-x. 2 root root 6 10月 31 2018 rh
-rw-r--r--. 1 root root 0 7月 2 14:15 test2.java
-rw-r--r--. 1 root root 0 7月 2 14:15 test.txt
2.3 rm
rm [选项] 文件或目录...
常用选项:
-f
: 强制删除,不提示确认。-i
: 交互式模式,在删除每个文件之前提示确认。-r
: 递归删除,删除目录及其所有子目录和文件。-v
: 详细模式,显示正在删除的文件或目录。
[root@xy opt]# mkdir -p /opt/test/test1
[root@xy opt]# touch /opt/test/test1/test.txt
[root@xy opt]# touch test2.txt
[root@xy opt]# mkdir -p /opt/test2
[root@xy opt]#
[root@xy opt]# rm -rfv test
已删除"test/test1/test.txt"
已删除目录:"test/test1"
已删除目录:"test"
[root@xy opt]#
[root@xy opt]# rm -fv test2.txt
已删除"test2.txt"
[root@xy opt]#
[root@xy opt]# mkdir -p /opt/test2
[root@xy opt]# rm -rvi test2
rm:是否删除目录 "test2"?yes
已删除目录:"test2"
2.4 cp
cp [选项] [源文件或目录] [目标文件或目录]
常用选项:
-r
或-R
:递归复制目录及其所有子目录。-f
:强制覆盖现有文件。-i
:在覆盖现有文件之前询问用户确认。-v
:显示复制过程的详细信息。-p
:保留源文件的权限、时间戳和所有者信息。-l
:创建硬链接而不是复制文件。-s
:创建符号链接而不是复制文件。
root@localhost:/opt# mkdir -p a/b/c
root@localhost:/opt# cp -rv a test
'a' -> 'test'
'a/b' -> 'test/b'
'a/b/c' -> 'test/b/c'
root@localhost:/opt#
root@localhost:/opt# touch a/b/c/test.txt
root@localhost:/opt# cp -rv a test2
'a' -> 'test2'
'a/b' -> 'test2/b'
'a/b/c' -> 'test2/b/c'
'a/b/c/test.txt' -> 'test2/b/c/test.txt'
2.5 mv
mv [选项] [源文件或目录] [目标文件或目录]
常用选项:
-f
或--force
:强制覆盖现有文件或目录,无需询问用户确认。-i
或--interactive
:在覆盖现有文件或目录之前询问用户确认。-v
或--verbose
:显示移动或重命名过程的详细信息。-b
或--backup
:在覆盖现有文件或目录之前创建备份。-S
或--suffix
:指定备份文件的扩展名。-u
或--update
:仅当源文件比目标文件更新时才执行移动操作。
常见操作:
- 移动单个文件:
mv file1.txt directory1
- 移动多个文件:
mv file1.txt file2.txt directory1
- 移动目录:
mv directory1 directory2
- 重命名文件:
mv file1.txt file2.txt
- 重命名目录:
mv directory1 directory2
- 强制覆盖现有文件:
mv -f source_file destination_file
2.6 find
find [路径] [选项] [表达式]
常用选项:
-
-name
: 根据文件名进行匹配。例如find /home/user/ -name "test.txt"
会查找/home/user/
目录下名为test.txt
的文件。 -
-iname
: 与-name
相似,但忽略大小写。例如find /home/user/ -iname "test.txt"
会找到名为test.txt
、Test.txt
以及TEST.txt
等文件。 -
-type
:根据文件类型进行匹配。常用的文件类型包括:
f
: 普通文件d
: 目录l
: 符号链接c
: 字符设备文件b
: 块设备文件
-
-size
: 根据文件大小进行匹配。例如find /home/user/ -size +10M
会找到大于 10 MB 的文件。可以使用k
表示 KB,M
表示 MB,G
表示 GB。 -
-exec
: 在匹配到文件后执行指定的命令。例如find /home/user/ -name "*.txt" -exec ls -l {} \;
会列出所有以.txt
结尾的文件的详细信息。{}
表示匹配到的文件,\;
结束-exec
命令。
表达式:
!
: 取反操作。例如find /home/user/ -type f ! -name "*.txt"
会找到所有不是.txt
文件的普通文件。-o
: 或操作。例如find /home/user/ -name "*.txt" -o -name "*.html"
会找到所有.txt
或者.html
文件。-a
: 与操作。例如find /home/user/ -type f -a -size +10M
会找到所有大小大于 10 MB 的普通文件。
2.7whereis 、 which
2.7.1 whereis
- 功能: 查找命令、源代码文件和手册页的路径。
- 原理: 通过搜索系统预先定义的数据库(通常在
/usr/share/misc/
目录下)来查找目标。 - 优点: 速度快,因为直接从数据库中读取信息。
- 缺点: 数据库可能不是最新,可能无法找到最新安装的命令或文件。
2.7.2 which
- 功能: 查找命令的完整路径。
- 原理: 遍历 PATH 环境变量中的每个目录,寻找与命令名称匹配的可执行文件。
- 优点: 可以找到最近安装的命令,因为会遍历 PATH 环境变量。
- 缺点: 比
whereis
速度慢,因为它需要遍历文件系统。
root@localhost:/opt# whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz
root@localhost:/opt# which ls
/usr/bin/ls
3、链接
ln [选项] 源文件 目标文件
常用选项:
-s
或--symbolic
:创建软链接。-f
或--force
:强制覆盖目标文件。-i
或--interactive
:在覆盖目标文件之前提示用户确认。-n
或--no-dereference
:不解析软链接。-b
或--backup
:创建备份文件。-v
或--verbose
:显示详细的信息。
ln
命令是 Linux 中用于创建文件或目录链接的命令。它可以用来创建两种类型的链接:硬链接和软链接
。
硬链接
- 硬链接是原始文件的一个副本,它拥有与原始文件相同的
inode
号。 - 硬链接不能跨越文件系统。
删除原始文件不会影响硬链接
,反之亦然。- 无法创建目录的硬链接。
软链接
- 软链接是一个指向原始文件的指针,它存储了原始文件的路径。
- 软链接可以跨越文件系统。
删除原始文件会使软链接失效
。- 可以创建指向目录的软链接。
软连接案例
root@localhost:/opt# mkdir -p a/b/c
root@localhost:/opt# echo 'hello world' > a/b/c/hello.txt
root@localhost:/opt# ln -s a/b/c/hello.txt hello-ln.txt
root@localhost:/opt# cat a/b/c/hello.txt
hello world
root@localhost:/opt# echo 'hello world222' > hello-ln.txt
root@localhost:/opt# cat a/b/c/hello.txt
hello world222
root@localhost:/opt# ll -i
a/ hello-ln.txt
root@localhost:/opt# ll -i
total 12
32769 drwxr-xr-x 3 root root 4096 Jul 3 17:13 ./
2 drwxr-xr-x 20 root root 4096 Jul 3 14:34 ../
2372 drwxr-xr-x 3 root root 4096 Jul 3 17:13 a/
36074 lrwxrwxrwx 1 root root 15 Jul 3 17:13 hello-ln.txt -> a/b/c/hello.txt
root@localhost:/opt# ll -i a/b/c/
total 12
36072 drwxr-xr-x 2 root root 4096 Jul 3 17:13 ./
36071 drwxr-xr-x 3 root root 4096 Jul 3 17:13 ../
36073 -rw-r--r-- 1 root root 15 Jul 3 17:13 hello.txt
硬链接案例
root@localhost:/opt# ln a/b/c/hello.txt hello-ln2.txt
root@localhost:/opt# ll -i
total 16
32769 drwxr-xr-x 3 root root 4096 Jul 3 17:16 ./
2 drwxr-xr-x 20 root root 4096 Jul 3 14:34 ../
2372 drwxr-xr-x 3 root root 4096 Jul 3 17:13 a/
36074 lrwxrwxrwx 1 root root 15 Jul 3 17:13 hello-ln.txt -> a/b/c/hello.txt
36073 -rw-r--r-- 2 root root 15 Jul 3 17:13 hello-ln2.txt
4、压缩与解压
tar [选项] [档案文件] [文件或目录...]
常用选项:
选项 | 描述 |
---|---|
-c |
创建档案文件 |
-x |
提取档案文件 |
-t |
列出档案文件内容(c、x、t参数只能出现一个 ) |
-f |
指定档案文件名,后面不能跟参数 |
-z |
使用 gzip 压缩 (扩展名通常为:.tar.gz ,特点:速度最快 ) |
-j |
使用 bzip2 压缩 (扩展名通常为: .tar.gz ,特点:体积最小 ) |
-v |
详细模式,显示操作进度 |
-C |
解压缩具体目录 |
root@localhost:/opt# touch t1.txt t2.txt
root@localhost:/opt# mkdir -p a/b/c
root@localhost:/opt# ls
a t1.txt t2.txt
root@localhost:/opt# tar -zcf test.tar.gz t1.txt t2.txt a/
root@localhost:/opt#
root@localhost:/opt# tar -tvf test.tar.gz
-rw-r--r-- root/root 0 2024-07-03 17:59 t1.txt
-rw-r--r-- root/root 0 2024-07-03 17:59 t2.txt
drwxr-xr-x root/root 0 2024-07-03 17:59 a/
drwxr-xr-x root/root 0 2024-07-03 17:59 a/b/
drwxr-xr-x root/root 0 2024-07-03 17:59 a/b/c/
root@localhost:/opt#
root@localhost:/opt# mkdir test
root@localhost:/opt# tar -zxf test.tar.gz -C test/
root@localhost:/opt# ls test/
a t1.txt t2.txt
5、文件编辑
基本操作:
- 进入编辑模式:
i
:插入模式,在光标所在位置插入文本。a
:追加模式,在光标所在位置后插入文本。o
:在当前行下方插入新行。O
:在当前行上方插入新行。
- 退出编辑模式:
ESC
:退出编辑模式,回到命令模式。
- 保存文件:
:w
:保存当前文件。:wq
:保存并退出 Vi。:x
:保存并退出 Vi,但只有当文件被修改过时才会保存。
- 退出 Vi:
:q
:退出 Vi,如果文件被修改过,则会提示保存。:q!
:强制退出 Vi,不保存修改。
移动光标:
- 基本移动:
h
:左移。j
:下移。k
:上移。l
:右移。
- 单词移动:
w
:下一个单词的开头。b
:上一个单词的开头。e
:下一个单词的结尾。B
:上一个单词的结尾。
- 行首行尾:
0
:移至行首。^
:移至行首第一个非空白字符。$
:移至行尾。
- 页面移动:
Ctrl+f
:向下翻页。Ctrl+b
:向上翻页。H
:移至屏幕顶端。M
:移至屏幕中间。L
:移至屏幕底部。
删除和修改:
- 删除字符:
x
:删除光标所在字符。X
:删除光标前一个字符。dw
:删除光标所在单词。db
:删除光标前一个单词。dd
:删除当前行。
- 粘贴:
p
:粘贴剪切板内容。P
:在当前行上方粘贴剪切板内容。
- 替换:
r
:用下一个输入的字符替换光标所在字符。R
:进入替换模式,用后续输入的字符替换从光标所在位置开始的所有字符。cw
:替换光标所在单词。c$
:替换从光标所在位置到行尾的所有字符。
其他常用指令:
-
复制行:
yy
-
跳转行号: num +
gg
(默认gg行首)GG
(反向跳转行尾) -
撤销操作:
u
-
查找文本:
/pattern
(正向查找),?pattern
(反向查找) -
替换文本:
:%s/pattern/replacement/g
(全局替换) -
显示行号:
:set number
-
隐藏行号:
:set nonumber
第二章 系统命令
1、系统当前时间
date
root@localhost:~# date
Thu Jul 4 12:09:31 CST 2024
2、切换用户
su 用户名
sudo 命令
: 使用超级管理员身份执行命令
root@localhost:~# su xieyang
xieyang@localhost:/root$ ls -al
ls: cannot open directory '.': Permission denied
xieyang@localhost:/root$ sudo ls -l
total 8
drwxr-xr-x 2 root root 4096 Jul 3 13:57 IdeaProjects
drwx------ 3 root root 4096 Jul 2 17:56 snap
xieyang@localhost:/root$ su root
Password:
3、 echo
echo [选项] [字符串]
选项:
- -n: 抑制输出结尾的换行符。2
- -e: 启用转义序列的解释,例如
\n
(换行)、\t
(制表符)、\a
(响铃)等。
1. 打印文本
root@localhost:~# echo "hello world!"
hello world!
2. 打印变量
root@localhost:~# name="tom"
root@localhost:~# echo $name
tom
3. 使用 -e
选项来解释转义字符
root@localhost:/opt# echo -e "hello world\n你好 世界"
hello world
你好 世界
4. 使用 -n
选项来抑制换行符
root@localhost:/opt# echo -n "Hello, world!"
Hello, world!root@localhost:/opt#
5. 测试命令
root@localhost:/opt# ls
hello.txt test test.txt test2.txt
root@localhost:/opt# echo rm -rfv t*
rm -rfv test test.txt test2.txt
6. 格式化输出
root@localhost:/opt# echo -e "\033[32mThis is green text.\033[0m"
This is green text.
4、sort
sort [选项] [文件]
常用选项:
-r
或--reverse
:反向排序。-n
或--numeric-sort
:按数字顺序排序。-k
或--key=KEYDEF
:指定排序键,多个排序键用逗号分隔。-t
或--field-separator=SEP
:指定字段分隔符。-u
或--unique
:只输出唯一行。-f
或--ignore-case
:忽略大小写。-b
或--ignore-leading-blanks
:忽略行首空白字符。-M
或--month-sort
:按月份顺序排序。-d
或--dictionary-order
:按字典顺序排序。
root@localhost:/opt# cat num.txt
tom
smith
100
22
root@localhost:/opt# sort num.txt
100
22
smith
tom
root@localhost:/opt# sort -n num.txt
smith
tom
22
100
root@localhost:/opt# sort -nr num.txt
100
22
tom
smith
5、diff
root@localhost:/opt# echo -e 'hello world\n你好 世界' > test1.txt
root@localhost:/opt# echo -e 'hello world\n你好 世界2' > test2.txt
root@localhost:/opt# diff test1.txt test2.txt
2c2
< 你好 世界
---
> 你好 世界2
6、重定向
6.1 输出重定向
command > output_file
command
:要执行的命令。>
:重定向符号。output_file
:目标文件,用于保存命令的输出结果。
-
将
ls -l
命令的输出结果保存到file.txt
文件中:root@localhost:/opt# ls -l > file.txt
-
将
date
命令的输出结果追加到file.txt
文件末尾:root@localhost:/opt# date >> file.txt root@localhost:/opt# cat file.txt total 12 -rw-r--r-- 1 root root 0 Jul 4 13:15 file.txt -rw-r--r-- 1 root root 44 Jul 4 13:09 hello3.txt -rw-r--r-- 1 root root 26 Jul 4 13:03 test1.txt -rw-r--r-- 1 root root 27 Jul 4 13:03 test2.txt Thu Jul 4 13:15:37 CST 2024
其他重定向符号:
>>
:追加重定向,将输出内容追加到目标文件末尾。2>
:错误重定向,将错误信息重定向到目标文件。&>
:同时重定向标准输出和错误输出。
6.2 输入重定向
command < input_file
command
:要执行的命令。<
:输入重定向符号。(可省略)input_file
:包含输入数据的源文件。
root@localhost:~# cat num.txt
5
2
1
root@localhost:~# sort -n num.txt
1
2
5
root@localhost:~# sort -n < num.txt
1
2
5
root@localhost:~# sort -n <<flag
> 2
> 3
> 1
> flag
1
2
3
7、grep
grep [选项] [文件]
常用选项:
-E
: 使用扩展正则表达式。-i
: 忽略大小写。-n
: 显示行号。-v
: 反向匹配。-c
: 统计匹配行的数量。-l
: 仅显示包含匹配行的文件名。-h
: 不显示文件名。-r
: 递归搜索目录。-A
:显示匹配行的后n行。-B
:显示匹配行的前n行。-C
: 显示匹配行的上下文n行。
root@localhost:/opt# cat title.txt
1女生退租遭辱骂致死案二审维持原判热
2老板娘一天卖出200斤知了日入过万热
3一见中塔情
4品牌螺蛳粉疑用福寿螺?官方通报
5男子在合肥一购物中心坠楼身亡
6男生复读一年高考成绩涨380分
7官方回应环卫工降薪停工致垃圾遍地
8渝北水木天地三人被杀系谣言
9神十八乘组圆满完成第二次出舱活动
1000后视障主播用声音温暖他人
11特斯拉进入江苏省政府用车采购目录热
12台艺人被批用大陆用语
13美国警察拦下“UFO”
14大韩航空空姐行李箱内发现实弹
15徒步旅行女主播公路边直播时被车撞
root@localhost:/opt#
root@localhost:/opt# grep '0' title.txt
2老板娘一天卖出200斤知了日入过万热
6男生复读一年高考成绩涨380分
1000后视障主播用声音温暖他人
root@localhost:/opt# grep '0' title.txt -n
3:2老板娘一天卖出200斤知了日入过万热
7:6男生复读一年高考成绩涨380分
11:1000后视障主播用声音温暖他人
root@localhost:/opt# grep '0' title.txt -c
3
root@localhost:/opt# grep '0' . -r
./file.txt:-rw-r--r-- 1 root root 0 Jul 4 13:15 file.txt
./file.txt:-rw-r--r-- 1 root root 44 Jul 4 13:09 hello3.txt
./file.txt:-rw-r--r-- 1 root root 26 Jul 4 13:03 test1.txt
./file.txt:-rw-r--r-- 1 root root 27 Jul 4 13:03 test2.txt
./file.txt:Thu Jul 4 13:15:37 CST 2024
./title.txt:2老板娘一天卖出200斤知了日入过万热
./title.txt:6男生复读一年高考成绩涨380分
./title.txt:1000后视障主播用声音温暖他人
root@localhost:/opt#
root@localhost:/opt# grep '0' . -rl
./file.txt
./title.txt
root@localhost:/opt# grep '000' title.txt -A 3
1000后视障主播用声音温暖他人
11特斯拉进入江苏省政府用车采购目录热
12台艺人被批用大陆用语
13美国警察拦下“UFO”
root@localhost:/opt# grep '000' title.txt -C 3
7官方回应环卫工降薪停工致垃圾遍地
8渝北水木天地三人被杀系谣言
9神十八乘组圆满完成第二次出舱活动
1000后视障主播用声音温暖他人
11特斯拉进入江苏省政府用车采购目录热
12台艺人被批用大陆用语
13美国警察拦下“UFO”
root@localhost:/opt# grep '11|13' title.txt -E
11特斯拉进入江苏省政府用车采购目录热
13美国警察拦下“UFO”
8、管道
管道符号:
|
基本用法:
command1 | command2
command1
: 第一个命令,它的输出将作为command2
的输入。command2
: 第二个命令,接收command1
的输出作为输入。
root@localhost:/opt# ls -a
. .. file.txt hello3.txt test1.txt test2.txt title.txt
root@localhost:/opt# ls -a | grep 't.{1,5}\.txt' -E
test1.txt
test2.txt
title.txt
9、ps
ps [选项]
常用选项:
- -a:显示所有进程,包括与终端无关的进程。
- -e:等同于 -a,显示所有进程。
- -f:显示进程的完整信息,包括命令行参数。
- -u:显示进程的所有者信息。
- -x:显示所有进程,包括没有控制终端的进程。
- -aux:显示所有进程的详细状态信息,包括用户、CPU 使用率、内存占用等。
- -p PID:指定要查看的进程 ID。
- -C 程序名:指定要查看的程序名。
- -l:显示进程的较长信息,包含更详细的进程属性。
- -j: 以 JSON 格式显示进程信息,便于自动化脚本解析。
- -U 用户名: 显示特定用户的进程信息。
- -G 组名: 显示特定组的进程信息。
示例:
- 查看当前终端的进程:
ps
- 查看所有进程完整信息:
ps -ef
- 查看所有进程的详细信息:
ps -aux
- 查看名为 'bash' 进程的详细信息:
ps -aux | grep bash
- 查看名为 'apache2' 进程的详细信息:
ps -C apache2
10、sleep
sleep [number][unit]
-
number
: 指定休眠的时长。 -
unit
: 可选的单位,可以是以下几种:
s
: 秒 (默认)m
: 分钟h
: 小时d
: 天
date
sleep 3
date
root@localhost:/opt# date
sleep 3
date
Thu Jul 4 14:56:20 CST 2024
Thu Jul 4 14:56:23 CST 2024
root@localhost:/opt#
11、kill
kill
命令的基本语法:
kill [选项] 进程ID
选项:
- -s 信号编号: 指定要发送的信号。如果省略,默认发送
SIGTERM
信号。 - -SIG信号名称: 指定要发送的信号,使用信号名称。
- -9: 强制终止进程,相当于
SIGKILL
信号。 - -15: 优雅地终止进程,相当于
SIGTERM
信号。
进程ID: 目标进程的 ID 号。可以使用 ps
命令查看进程 ID。
示例:
- 使用进程 ID 终止进程:
kill 1234
- 发送
SIGKILL
信号强制终止进程:kill -9 1234
- 发送
SIGTERM
信号优雅地终止进程:kill -15 1234
- 使用信号名称终止进程:
kill -SIGTERM 1234
常用信号:
- SIGTERM (15): 终止进程,允许进程进行清理工作。
- SIGKILL (9): 立即终止进程,不进行清理工作。
- SIGINT (2): 中断进程,通常由
Ctrl+C
键触发。 - SIGQUIT (3): 退出进程,通常由
Ctrl+\
键触发。
root@localhost:~# sleep 1d&
[1] 44492
root@localhost:~# ps -ef | grep 'sleep'
root 44492 39023 0 15:07 pts/3 00:00:00 sleep 1d
root 44565 39023 0 15:08 pts/3 00:00:00 grep --color=auto sleep
root@localhost:~# kill -15 44492
root@localhost:~# ps -ef | grep 'sleep'
root 44615 39023 0 15:08 pts/3 00:00:00 grep --color=auto sleep
[1]+ Terminated sleep 1d
root@localhost:~# ps -ef | grep 'sleep'
root 44636 39023 0 15:08 pts/3 00:00:00 grep --color=auto sleep
使用 &
符号可以将命令放到后台运行。这表示命令不会阻塞终端,你可以在终端继续输入其他命令。
其他用法:
kill -l
: 列出所有可用信号。kill -0 进程ID
: 检查进程是否存在。
注意:
- 使用
kill -9
强制终止进程会导致数据丢失,建议谨慎使用。 - 使用
kill
命令需要拥有相应的权限,通常需要 root 权限。
12、top
top - 16:48:08 up 4:43, 1 user, load average: 0.02, 0.02, 0.00
Tasks: 43 total, 1 running, 42 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.1 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 15602.3 total, 14403.7 free, 624.4 used, 574.3 buff/cache
MiB Swap: 4096.0 total, 4096.0 free, 0.0 used. 14713.8 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 165888 11028 7992 S 0.3 0.1 1:16.58 systemd
概要信息 包含以下几行:
- 系统时间信息: 显示当前时间、系统启动时间、系统运行时间、登录用户数量和系统负载。
- 任务信息: 显示系统中进程的总数量,以及处于不同状态的进程数量,包括运行中的进程、睡眠中的进程、停止的进程和僵尸进程。
- CPU 使用情况: 显示 CPU 的不同使用状态,包括用户进程使用时间、系统进程使用时间、nice 值进程使用时间、空闲时间、等待 I/O 时间、硬件中断时间、软件中断时间和虚拟化时间。
- 内存使用情况: 显示物理内存的使用情况,包括总内存、空闲内存、已使用内存和缓存/缓冲区内存。
- 交换空间使用情况: 显示交换空间的使用情况,包括总交换空间、空闲交换空间、已使用交换空间和可用交换空间。
进程列表 显示系统中正在运行的所有进程,并包含以下信息:
-
进程 ID(PID): 每个进程的唯一标识符。
-
用户(USER): 拥有该进程的用户。
-
优先级(PR): 进程的优先级,数字越小优先级越高。
-
nice 值(NI): 进程的 nice 值,用于调整进程的优先级。
-
虚拟内存(VIRT): 进程使用的虚拟内存大小。
-
驻留内存(RES): 进程实际占用的物理内存大小。
-
共享内存(SHR): 进程使用的共享内存大小。
-
状态(S):
进程当前所处的状态,包括:
- R:运行状态
- S:睡眠状态
- T:停止状态
- Z:僵尸状态
-
CPU 使用率(%CPU): 进程占用的 CPU 时间比例。
-
内存使用率(%MEM): 进程占用的内存比例。
-
运行时间(TIME+): 进程运行的总时间。
-
命令(COMMAND): 进程的命令名称或命令行。
13、free
free
命令通常与 -h
选项一起使用,以使输出结果更易读
root@localhost:~# free -h
total used free shared buff/cache available
Mem: 15Gi 635Mi 14Gi 3.0Mi 575Mi 14Gi
Swap: 4.0Gi 0B 4.0Gi
free
命令的输出包含以下几列信息:
- total: 系统总内存大小。
- used: 目前被进程使用的内存量。
- free: 未被使用的空闲内存量。
- shared: 多个进程共享的内存量。
- buff/cache: 内核用于缓冲区、页面缓存和slab分配的内存量。
- available: 可用于启动新应用程序的估计内存量,不包括交换空间。
14、uptime
root@localhost:~# uptime
17:00:00 up 4:55, 1 user, load average: 0.01, 0.02, 0.00
uptime
命令是一个简单的但非常有用的 Linux 命令,它提供了关于系统运行时间、当前登录用户数量和系统负载平均值的信息。
15、df
df [选项]
df
命令用于显示文件系统磁盘使用情况,它会显示每个文件系统的总大小、已使用空间、剩余空间、使用百分比以及挂载点。
-
-h
: 以易于阅读的单位(例如,KB、MB、GB)显示磁盘空间。 -
-a
: 显示所有文件系统,包括未挂载的文件系统。 -
-k
: 以 KB 为单位显示磁盘空间。 -
-m
: 以 MB 为单位显示磁盘空间。 -
-T
: 显示文件系统的类型。
16、du
du [选项] 目录名
du
命令用于显示目录和文件占用的磁盘空间,它会递归地遍历指定目录并计算每个文件或目录占用的空间大小。
-a
: 显示每个文件的磁盘使用量,而不是每个目录的总计。-h
: 以易于阅读的单位(例如,KB、MB、GB)显示磁盘空间。-s
: 只显示总计,不显示每个文件的磁盘使用量。-c
: 显示所有文件或目录的总计。-d
: 指定递归深度,例如-d 1
表示只递归一层。--apparent-size
: 显示文件的实际大小,而不考虑块大小。
17、 重启
reboot
18、关机
shutdown -h now
poweroff
shutdown -h now
和poweroff
都是用于关机的 Linux 命令,它们的区别如下
shutdown -h now
命令会向系统发送信号,通知所有正在运行的进程停止运行,并保存当前的状态,然后关闭系统,通常会在关机前向所有用户发送通知消息。poweroff
命令相较于shutdowmn -h now
更为强制,它会立即关闭系统电源,不会等待正在运行的进程结束,它可能会丢失尚未保存的数据。
19 ifconfig
root@localhost:~# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.20.89.141 netmask 255.255.240.0 broadcast 172.20.95.255
inet6 fe80::215:5dff:fec1:b4f9 prefixlen 64 scopeid 0x20<link>
ether 00:15:5d:c1:b4:f9 txqueuelen 1000 (Ethernet)
RX packets 22 bytes 2432 (2.4 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 29 bytes 2426 (2.4 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 38 bytes 4805 (4.8 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 38 bytes 4805 (4.8 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
20、 ping
ping [选项] 目标地址
常用选项:
-c count
:指定发送的 ICMP 数据包数量。-i interval
:指定发送 ICMP 数据包的时间间隔,单位为秒。-s packetsize
:指定发送的 ICMP 数据包的大小,单位为字节。-t
:持续发送 ICMP 数据包,直到手动停止。-W timeout
:指定等待目标主机响应的超时时间,单位为秒。
root@localhost:~# ping -c 3 -i 2 -s 1024 www.baidu.com
PING www.baidu.com (183.2.172.185) 1024(1052) bytes of data.
1032 bytes from 183.2.172.185 (183.2.172.185): icmp_seq=1 ttl=52 time=27.9 ms
1032 bytes from 183.2.172.185 (183.2.172.185): icmp_seq=2 ttl=52 time=28.2 ms
1032 bytes from 183.2.172.185 (183.2.172.185): icmp_seq=3 ttl=52 time=28.5 ms
--- www.baidu.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 4005ms
rtt min/avg/max/mdev = 27.941/28.242/28.537/0.243 ms
21、curl
22、wget
wget [选项]... [URL]...
-O
: 指定下载文件的名称。-P
: 指定下载文件的保存目录。-c
: 从断点处继续下载。-b
: 在后台运行。-q
: 静默模式,不显示进度信息。
root@localhost:~# wget -O /opt/test.index https://www.example.com/index.html
--2024-07-04 17:45:42-- https://www.example.com/index.html
Resolving www.example.com (www.example.com)... 93.184.215.14, 2606:2800:21f:cb07:6820:80da:af6b:8b2c
Connecting to www.example.com (www.example.com)|93.184.215.14|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1256 (1.2K) [text/html]
Saving to: ‘/opt/test.index’
/opt/test.index 100%[========================>] 1.23K --.-KB/s in 0s
2024-07-04 17:45:43 (144 MB/s) - ‘/opt/test.index’ saved [1256/1256]
root@localhost:~# ls /opt/
test.index
23 、netstat
netstat [选项]
常用选项:
-a
:显示所有活动 TCP 连接和正在监听的 TCP 和 UDP 端口。-b
:显示创建每个连接或监听端口的应用程序。-e
:显示以太网统计信息,例如发送和接收的字节数和数据包数量。-n
:显示活动 TCP 连接,但地址和端口号以数字形式表示,不会尝试确定名称。-o
:显示活动 TCP 连接并包含每个连接的进程 ID (PID)。-p <Protocol>
:显示指定协议的连接。-s
:按协议显示统计信息。-r
:显示 IP 路由表的内容。
以下是一些 netstat
命令的示例:
netstat -a
:显示所有活动 TCP 连接和正在监听的 TCP 和 UDP 端口。netstat -b
:显示创建每个连接或监听端口的应用程序。netstat -e
:显示以太网统计信息,例如发送和接收的字节数和数据包数量。netstat -n
:显示活动 TCP 连接,但地址和端口号以数字形式表示,不会尝试确定名称。netstat -o
:显示活动 TCP 连接并包含每个连接的进程 ID (PID)。netstat -p tcp
:显示 TCP 协议的连接。netstat -s
:按协议显示统计信息。netstat -r
:显示 IP 路由表的内容。netstat -o 5
:每隔 5 秒显示活动 TCP 连接和进程 ID。
第三章 文件内容查看
1、 cat
cat [选项] [文件...]
常用选项:
-A
: 显示所有字符,包括不可打印字符和换行符。-b
: 对非空行进行编号。-e
: 显示不可打印字符,并在行尾显示 $ 符号。-E
: 在每行末尾显示 $ 符号。-n
: 对所有行进行编号,包括空行。-s
: 将多个空行压缩为一行。-t
: 将制表符显示为 ^I。
root@localhost:/opt# cat hello.txt
tom
jack test
lily
smith
hello world
root@localhost:/opt# cat hello.txt -Ans
1 tom $
2 jack^Itest$
3 lily$
4 smith$
5 $
6 hello world$
2、more
more [选项] 文件名
常用选项:
-<number>
每个屏幕显示行数 。+<number>
从行号开始显示文件。+/<pattern>
从匹配位置前良好开始显示内容。-p
清除原内容的方式进行翻页。-s
将多个空行压缩为一行。
常用操作:
- 下一行:
回车键
- 下一页:
空格键
- 上一页:
b
- 显示行号:
=
- 显示文件名和行号:
:f
- 退出:
q
- 在文件中搜索字符串:
/
root@localhost:/opt# ps -e | more -5 -p
PID TTY TIME CMD
1 ? 00:00:58 systemd
2 ? 00:00:00 init-systemd(Ub
7 ? 00:00:00 init
42 ? 00:00:00 systemd-journal
5 # 按下 = 显示行号
62 ? 00:00:00 systemd-udevd
75 ? 00:00:00 snapfuse
76 ? 00:00:00 snapfuse
82 ? 00:00:00 snapfuse
87 ? 00:00:00 snapfuse
/agetty # 搜索
...skipping
261 ? 00:00:00 agetty
274 tty1 00:00:00 agetty
281 ? 00:00:00 sshd
303 ? 00:00:08 python3.10
341 ? 00:00:00 SessionLeader
[Not a file] line 28 # :f 显示文件和行号
342 ? 00:00:00 Relay(343)
343 pts/0 00:00:00 bash
344 pts/1 00:00:00 login
382 ? 00:00:00 systemd
383 ? 00:00:00 (sd-pam)
392 pts/1 00:00:00 bash
407 ? 00:00:39 python3
5013 ? 00:00:00 SessionLeader
5014 ? 00:00:00 Relay(5015)
5015 pts/2 00:00:00 sh # 按q退出
root@localhost:/opt#
3、less
less [选项] [文件...]
less
命令是一个 Linux 命令行工具,它可以逐页显示文件内容或命令输出。它类似于 more
命令,但功能更强大。
less
命令的主要优点包括:
- 逐页显示文件内容:
less
命令可以逐页显示文件内容,方便查看大型文件。 - **支持向前和向后滚动:**与
more
命令只能向前滚动不同,less
命令可以向前和向后滚动,方便查看文件中的特定内容。 - 支持搜索:
less
命令支持在文件中搜索特定字符串,方便查找特定内容。 - 支持标记:
less
命令支持标记文件中的特定位置,方便快速返回。 - 支持实时监控:
less
命令可以实时监控文件内容的改变,方便查看文件内容的实时更新。
3.1 less基础用法
常用选项:
-g
突出显示使用搜索找到的最后一个字符串。默认情况下,less
突出显示所有与最后搜索命令匹配的字符串。-i
在搜索期间忽略大小写敏感性。-N
在每行的开头显示行号。-p[pattern]
指示less
从输入文件中的指定模式的第一次出现开始。-s
将连续的空行合并成单个空行。
常用操作:
上下箭头、Enter、e、j
向下滚动一行。上箭头、y、k
向上滚动一行。空格键、Page Down
向下滚动一页。Page Up、b
向上滚动一页。Home、g
跳转到文件开头。End、G
跳转到文件末尾。/[string]
向前搜索指定的字符串。?[string]
向后搜索指定的字符串。n
搜索下一个匹配项。N
搜索上一个匹配项。=
显示行详情v
使用vim编辑器进行编辑q
退出 。
3.2 less命令标记
按
m
键标记(set mark)按
'
键可回到标记点(goto mark)
3.3 less命令实时监控
less +F [其他选项] [文件...]
按ctrl +c
终止监控,按F
,再次进入监控模式
3.4 less命令查看多文件
less [选项] [文件...]
按:n
下一个文件
按:p
上一个文件
4、head
head [选项] [文件...]
常用选项:
-n 数字
: 显示文件的头数字
行。-c 数字
: 显示文件的头数字
字节。-q
或--quiet
: 不显示文件名。
root@localhost:/opt# head -c 3 hello.txt
第root@localhost:/opt# head -qn 3 hello.txt hello2.txt
第1行 测试
第2行 测试
第3行 测试
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 17:31 ? 00:01:20 /sbin/init
root 2 1 0 17:31 ? 00:00:00 /init
root@localhost:/opt#
root@localhost:/opt# head -n 3 hello.txt hello2.txt
==> hello.txt <==
第1行 测试
第2行 测试
第3行 测试
==> hello2.txt <==
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 17:31 ? 00:01:20 /sbin/init
root 2 1 0 17:31 ? 00:00:00 /init
5、tail
tail [选项] [文件...]
常用选项:
- -n 数字: 显示文件的最后
数字
行。 - -c 数字: 显示文件的最后
数字
字节。 - -f: 跟踪文件并持续显示新增内容。
- -q: 不显示文件名。
root@localhost:/opt# tail -n 3 hello.txt hello2.txt
==> hello.txt <==
第255行 测试
第256行 测试
==> hello2.txt <==
root 70311 70309 0 22:23 pts/4 00:00:00 -bash
root 70570 70311 0 22:24 pts/4 00:00:00 ps -ef
hello world
root@localhost:/opt# tail -qn 3 hello.txt hello2.txt
第255行 测试
第256行 测试
root 70311 70309 0 22:23 pts/4 00:00:00 -bash
root 70570 70311 0 22:24 pts/4 00:00:00 ps -ef
hello world
root@localhost:/opt# tail -qfn 3 hello.txt hello2.txt
第255行 测试
第256行 测试
root 70311 70309 0 22:23 pts/4 00:00:00 -bash
root 70570 70311 0 22:24 pts/4 00:00:00 ps -ef
hello world
hello tail
hello2 tail
root@localhost:/opt# tail -fn 3 hello.txt hello2.txt
==> hello.txt <==
第256行 测试
hello tail
==> hello2.txt <==
root 70570 70311 0 22:24 pts/4 00:00:00 ps -ef
hello world
hello2 tail
==> hello.txt <==
hello tail2
==> hello2.txt <==
hello2 tail2
第四章 Linux用户管理
1、用户组的管理
使用root账户查看当前系统用户组
cat /etc/group
查看用户所在组
groups [用户名...]
root@localhost:/opt# groups root xieyang
root : root docker
xieyang : xieyang adm dialout cdrom floppy sudo audio dip video plugdev netdev docker
1.1 用户组的添加
groupadd [选项] 组名
常用选项:
-g GID
:指定用户组的组 ID(GID)。-r
:创建系统组。-f
:如果组已经存在,则强制命令成功退出。-K
:覆盖/etc/login.defs
文件中的默认值。-p
:使用crypt(3)
加密密码。-o
:允许添加一个具有非唯一 GID 的组。
root@localhost:/opt# groupadd -g 1024 test
root@localhost:/opt# cat /etc/group | grep 'test'
test:x:1024:
1.2 用户组的修改
groupmod [选项] 组名
常用选项:
-g GID
:将组的组 ID(GID)更改为指定的 GID。-n 新组名
:将组的名称更改为指定的新组名
。-p 密码
:设置组的密码。密码将使用crypt(3)
加密。-o
:在使用-g
选项更改 GID 时,允许将 GID 更改为非唯一值。-a
:在使用-U
选项添加用户时,将用户追加到现有成员列表,而不是替换列表。-U 用户列表
:将用户列表添加到组中。-R 根目录
:在指定的根目录
中应用更改。-P 前缀目录
:在指定的前缀目录
中应用更改。
root@localhost:/opt# groupmod -g 2048 test
root@localhost:/opt# tail -n 1 /etc/group
test:x:2048:
root@localhost:/opt# groupmod -n test2 test
root@localhost:/opt# tail -n 1 /etc/group
test2:x:2048:
1.3 用户组的删除
groupdel [选项] 组名
常用选项:
-f
:如果组存在,则强制命令成功退出。
root@localhost:/opt# groupdel -f test2
root@localhost:/opt# cat /etc/group | grep 'test2'
2、用户的管理
2.1 添加用户
useradd [选项] 用户名
以下是一些常用的 useradd
命令选项:
-
-m
: 创建用户主目录。默认情况下,用户主目录位于/home/用户名
。 -
-u UID
:指定用户的用户 ID(UID)。 -
-g GID
:指定用户的初始组 ID(GID)。 -
-G 组列表
:指定用户所属的附加组。 -
-d 主目录
:指定用户的家目录。 -
-s Shell
:用户的登录 Shell。 -
-c 注释
:用户的注释信息。 -
-p 密码
:设置用户密码。密码将使用crypt(3)
加密。 -
-r
:创建系统用户。
root@localhost:/opt# useradd -p 123456 -g xieyang -G root -d /home/test -m test
root@localhost:/opt# groups test
test : xieyang root
注意:
- 未指定用户组
默认和用户名一致
。 - 未指定用户组目录
默认/home/{用户名}
。 -p
密码123456是密文,明文需要解密。
2.2 设置密码
passwd [选项] [用户名]
使用方法
以下是一些使用 passwd
命令的示例:
-
修改当前用户的密码:
passwd
系统会提示您输入当前密码和新密码。
-
修改其他用户的密码:
sudo passwd 用户名
-
强制用户立即更改密码:
sudo passwd -f 用户名
下次用户登录系统时,系统会提示用户输入新的密码。
2.4 修改用户
usermod [选项] 用户名
常用选项:
-l 新用户名
:修改用户的用户名。-u 新 UID
:修改用户的用户 ID(UID)。-g 新 GID
:修改用户的初始组 ID(GID)。-G 组列表
:修改用户所属的附加组。-d 新主目录
:修改用户的主目录。-s 新登录 Shell
:修改用户的登录 Shell。-c 新注释
:修改用户的注释信息。-L
:锁定用户账户。-U
:解锁用户账户。-p 新密码
:设置用户的密码。密码将使用crypt(3)
加密。
root@localhost:~# usermod -l test2 test
root@localhost:~# groups test2
test2 : test
2.4 删除用户
userdel [选项] 用户名
以下是一些常用的 userdel
命令选项:
-r
:删除用户的主目录。-f
:如果用户已登录,则强制删除用户。-R
:删除用户的主目录及其所有内容,即使主目录不为空。
root@localhost:/# userdel -Rf test
3、为用户组添加目录权限
chgrp [选项] [组名] [文件或目录]
常用选项:
-R
或--recursive
:递归地对文件和目录进行操作。-H
:如果命令行参数是目录的符号链接,则遍历它。与-R
选项一起使用。-L
:在递归遍历中,遍历遇到的目录的每个符号链接。与-R
选项一起使用。
root@localhost:/opt# mkdir java
root@localhost:/opt# ll
total 12
drwxr-xr-x 3 root root 4096 Jul 5 18:45 ./
drwxr-xr-x 20 root root 4096 Jul 5 18:27 ../
drwxr-xr-x 2 root root 4096 Jul 5 18:45 java/
root@localhost:/opt# chmod 775 java/
root@localhost:/opt# ll
total 12
drwxr-xr-x 3 root root 4096 Jul 5 18:45 ./
drwxr-xr-x 20 root root 4096 Jul 5 18:27 ../
drwxrwxr-x 2 root root 4096 Jul 5 18:45 java/
root@localhost:/opt# chgrp -R test java/
root@localhost:/opt# ll
total 12
drwxr-xr-x 3 root root 4096 Jul 5 18:45 ./
drwxr-xr-x 20 root root 4096 Jul 5 18:27 ../
drwxrwxr-x 2 root test 4096 Jul 5 18:45 java/
第六章 文件权限
1、文件权限查看
root@localhost:/opt# ll
total 12
drwxr-xr-x 3 root root 4096 Jul 5 18:45 ./
drwxr-xr-x 20 root root 4096 Jul 5 19:03 ../
drwxrwxr-x 2 root test 4096 Jul 5 19:05 java/
文件类型:
d
表示这是一个 目录 (directory),而不是普通文件。在 Linux 中,目录是用来存放文件的地方,它本身也是一种特殊的"文件"。-
: 表示普通文件,例如文本文件、图片文件、视频文件等等。b
: 表示块设备文件,通常用于存储设备,例如硬盘、U 盘、光盘等等。c
: 表示字符设备文件,通常用于串行设备,例如键盘、鼠标、串口等等。p
: 表示命名管道文件,用于进程间通信。l
: 表示符号链接文件,它指向另一个文件或目录。s
: 表示套接字文件,用于网络通信。
权限 (rwx):
- 权限信息由三个部分组成,分别表示
拥有者
、同组用户
和其他人
对目录的权限。 rwx
: 代表目录的 拥有者 拥有 读 (read)、写 (write) 和 执行 (execute) 权限。
特殊权限 (.):
- . 表示 没有设置特殊的权限,例如 setuid 或 sticky bit。
- setuid (set user ID) 允许文件以拥有者的身份运行,即使执行文件的人不是拥有者。
- sticky bit 允许只有拥有者可以删除目录下的文件,其他用户只能删除自己创建的文件。
2、ugo 和 421
在 Linux 系统中,chmod
命令使用两种方式来设置文件权限:
- 符号模式 (Symbolic Mode): 使用
ugo
和+ - = rwx
等符号来表示权限设置。 - 八进制模式 (Octal Mode): 使用三位数字来表示权限,其中每个数字代表一个权限类别(用户、组、其他)。
2.1 UGO的含义
ugo
代表了 Linux 权限控制的三个主要类别:
- u (user): 文件所有者。
- g (group): 文件所属组。
- o (other): 其他所有用户。
2.2 421 的含义
421
代表了八进制模式中的权限设置,对应于以下含义:
- 4: 读取权限
- 2: 写入权限
- 1: 执行权限
因此,421
的含义是:
- 4: 文件所有者拥有读取权限。
- 2: 文件所有者拥有写入权限。
- 1: 文件所有者拥有执行权限。
2.3 UGO和 421 的关系
ugo
和 421
是两种不同的表示方式,它们可以互相转换:
- 使用
ugo
符号模式可以表达421
中的权限设置。例如,chmod u+rwx file
等同于chmod 700 file
。 - 使用
421
八进制模式可以表达ugo
中的权限设置。例如,chmod 777 file
等同于chmod ugo+rwx file
。
3、chmod
chmod [选项] [模式] [文件或目录]
常用选项:
-R
或--recursive
:递归地对文件和目录进行操作。
模式:
模式可以是以下两种形式之一:
符号模式:
u
:用户(文件所有者)g
:组(文件所属组)o
:其他用户a
:所有用户(u、g 和 o)+
:添加权限-
:删除权限=
:设置精确权限r
:读取权限w
:写入权限x
:执行权限
示例:
chmod u+x file1
: 为文件所有者添加执行权限chmod g-w file2
: 从文件所属组中删除写入权限chmod o=rx file3
: 为其他用户设置读取和执行权限
八进制模式:
- 使用三位数字表示每个用户(用户、组、其他)的权限:
- 第一位:读取权限(4)
- 第二位:写入权限(2)
- 第三位:执行权限(1)
- 使用三位数字组合表示权限,例如:
7
=4+2+1
= 读、写、执行6
=4+2
= 读、写5
=4+1
= 读、执行0
=0
= 没有权限
示例:
chmod 777 file1
: 为所有用户设置读、写、执行权限chmod 644 file2
: 为用户和组设置读写权限,其他用户设置只读权限chmod 000 file3
: 为所有用户取消所有权限
4、chown
chown [选项] [所有者][:所属组] [文件或目录]
常用选项:
-R
或--recursive
:递归地对文件和目录进行操作。
所有者:
- 可以是用户名或用户 ID。
- 如果省略,则保持当前所有者不变。
所属组:
- 可以是组名或组 ID。
- 如果省略,则保持当前所属组不变。
- 所有者和所属组之间用冒号
:
分隔。
文件或目录:
- 是要更改所有权的目标文件或目录名。
chown
命令的示例:
- 将文件
file1
的所有者更改为user1
:
chown user1 file1
- 将目录
mydir
的所有者更改为user2
,并将其所属组更改为group1
:
chown user2:group1 mydir
- 递归地将目录
mydir
及其所有子目录和文件的拥有者更改为user1
,并将其所属组更改为group1
:
chown -R user1:group1 mydir
第七章 软件安装
1、yum
- 主要用于 Red Hat 系 Linux 发行版,如
CentOS、RHEL、Fedora
。 - 基于 RPM (Red Hat Package Manager) 格式。
基本用法:
sudo yum [操作] [参数] [软件包名称]
常用操作:
install
: 安装软件包update
: 更新所有已安装软件包到最新版本upgrade
: 更新所有软件包到最新版本(包括未安装的软件包)remove
: 删除软件包erase
: 删除软件包及所有配置文件search
: 搜索软件包list
: 列出所有已安装软件包info
: 显示软件包详细信息clean
: 清理缓存
常用参数:
-y
: 自动确认,不需要用户输入确认信息-q
: 静默模式,不显示任何信息
示例:
- 安装 Firefox:
sudo yum install firefox
- 更新所有软件包:
sudo yum update
- 删除 Firefox:
sudo yum remove firefox
- 搜索 Firefox:
sudo yum search firefox
- 显示 Firefox 详细信息:
sudo yum info firefox
2、apt
- 主要用于 Debian 系 Linux 发行版,如
Debian、Ubuntu、Mint
。 - 基于 deb (Debian Package) 格式。
基本用法:
sudo apt [操作] [参数] [软件包名称]
常用操作:
install
: 安装软件包update
: 更新软件源upgrade
: 更新所有已安装软件包到最新版本remove
: 删除软件包purge
: 删除软件包及所有配置文件search
: 搜索软件包list
: 列出所有软件包show
: 显示软件包详细信息autoremove
: 删除不再需要的依赖包
常用参数:
-y
: 自动确认,不需要用户输入确认信息-q
: 静默模式,不显示任何信息
示例:
- 安装 Firefox:
sudo apt install firefox
- 更新软件源:
sudo apt update
- 更新所有软件包:
sudo apt upgrade
- 删除 Firefox:
sudo apt remove firefox
- 搜索 Firefox:
sudo apt search firefox
- 显示 Firefox 详细信息:
sudo apt show firefox
3、安装jdk
基于
Ubuntu
系统安装多版本JDK
# 查询需要安装的jdk版本
sudo apt list | grep 'openjdk-8|openjdk-11|openjdk-17' -E
# 安装jdk8、jdk11、jdk17
sudo apt install -y openjdk-8-jdk
sudo apt install -y openjdk-11-jdk
sudo apt install -y openjdk-17-jdk
# 查看java、javac版本
java -version
javac -version
# 修改java默认版本
sudo update-alternatives --config java
第八章 Shell编程
1、Shell 的作用
- 命令解释器: Shell 负责解释用户输入的命令,并将其转换为内核可以理解的指令。
- 脚本语言: Shell 也是一种脚本语言,允许用户编写一系列命令,并将其保存为脚本文件,以便重复执行。
- 环境管理: Shell 提供了用户环境管理功能,例如设置环境变量、管理用户权限等。
- 程序控制: Shell 提供了各种控制结构,例如循环、分支等,可以让用户编写更复杂的脚本。
- 系统交互: Shell 可以与其他程序进行交互,例如调用系统命令、读取文件内容、输出结果等。
2、常用的 Shell 类型
- bash: 最常用的 Shell,也是大多数 Linux 发行版的默认 Shell。它功能强大、配置灵活,并提供丰富的扩展功能。
- zsh: 一个功能更强大的 Shell,它提供更丰富的命令自动补全、主题定制等功能。
- sh: 一种简单的 Shell,通常用作其他 Shell 的基础。
- ksh: Korn Shell,功能强大,提供对编程语言的支持。
- csh: C Shell,语法类似于 C 语言,适用于熟悉 C 语言的用户。
3、shell的基础语法
3.1 注释
单行注释
# 这是一行注释
echo "hello world" # 打印hello world
多行注释
:
+空格
+''
: '
打印hello world
语法 echo "hello world"
'
echo "hello world"
eg.
root@localhost:/opt# echo '#!/bin/bash' > test.sh
root@localhost:/opt#
root@localhost:/opt# echo -e "
# 这是一行注释
: '
打印hello world
语法 echo \"hello world\"
'
echo \"hello world\"" >> test.sh
root@localhost:/opt#
root@localhost:/opt# chmod 744 test.sh
root@localhost:/opt# ./test.sh
hello world
3.2 变量
变量类型
Shell 变量主要分为三种类型:
- 本地变量: 在当前 Shell 环境中定义的变量,只能在当前 Shell 中使用,子 Shell 无法访问。
- 环境变量: 在系统级别定义的变量,可以被所有子 Shell 继承,并且可以传递给子进程。
- 特殊变量: 由 Shell 预先定义的一些变量,用于存储系统信息或 Shell 状态。
变量命名规则
- 只能包含字母、数字和下划线,并且必须以字母或下划线开头。
- 区分大小写。
- 不能使用 Shell 的保留字(如
if
、else
、for
等)。
变量赋值
使用 =
号将值赋给变量。
name="张三"
age=25
引用变量
使用 $
符号引用变量的值。
echo "我的名字是 $name,我今年 $age 岁。"
变量类型声明
- 本地变量: 默认情况下,所有变量都是本地变量。
- 环境变量: 使用
export
命令将本地变量声明为环境变量。
# 写入环境变量
export PATH=$PATH:/usr/local/bin
# 打印所有环境变量
env
printenv
特殊变量
$0
: 当前脚本的文件名。$1
、$2
...$9
: 脚本的第一个、第二个...第九个参数。$*
: 所有参数,以空格分隔。$@
: 所有参数,每个参数用双引号括起来。$?
: 上一个命令的退出状态码。$$
: 当前 Shell 的进程 ID。$#
: 参数的个数。
变量操作
- 读取变量: 使用
echo
命令显示变量的值。 - 修改变量: 重新赋值即可修改变量的值。
- 删除变量: 使用
unset
命令删除变量。
变量的作用域
- 本地变量: 只在当前 Shell 中有效。
- 环境变量: 在所有子 Shell 中有效,并可以传递给子进程。
变量扩展
- 命令替换: 使用
$(command)
或 `` (反引号) 将命令的输出结果赋给变量。 - 算术扩展: 使用
$((expression))
进行算术运算。 - 字符串扩展: 使用
"${variable#pattern}"
、"${variable%pattern}"
等进行字符串操作。
#!/bin/bash
# 定义本地变量
name="李四"
age=30
# 定义环境变量
export HOME="/home/user"
# 使用特殊变量
echo "当前脚本文件名:$0"
echo "参数个数:$#"
# 读取变量
echo "我的名字是 $name,我今年 $age 岁。"
echo "我的主目录是 $HOME"
# 修改变量
age=31
echo "我今年 $age 岁。"
# 删除变量
unset name
# 命令替换
date_str=$(date +%Y-%m-%d)
echo "今天是 $date_str"
3.3 控制语句
3.3.1 if
-
if
:判断语句的开始。 -
elif
:前面的条件都不成立,判断条件。 -
[ ]
: 条件判断表达式。可以使用各种比较运算符。 -
then
:如果条件成立,执行该代码块。 -
else
:如果条件不成立,执行该代码块。(可选) -
fi
:if 语句结束标志。 -
比较运算符:
-eq
:等于-ne
:不等于-gt
:大于-lt
:小于-ge
:大于等于-le
:小于等于
#!/bin/bash if [ $1 -lt 18 ]; then echo "$1 小于 18 岁,未成年" elif [ $1 -ge 18 ]; then echo "$1 大于 18 岁,已成年" fi
-
字符串比较:
==
:字符串相等!=
:字符串不相等-z
:字符串为空-n
:字符串不为空
if [ "$name" == "张三" ]; then echo "你好,张三!" fi
-
文件测试:
-f
:文件存在且为普通文件-d
:文件存在且为目录-r
:文件存在且可读-w
:文件存在且可写-x
:文件存在且可执行
if [ -f /etc/passwd ]; then echo "/etc/passwd 文件存在" fi
-
逻辑运算符:
-a
:逻辑与(and)-o
:逻辑或(or)!
:逻辑非(not)
if [ "$age" -gt 18 -a "$gender" == "男" ]; then echo "你是成年男性" fi
3.3.2 for
for
:循环语句的开始。i in {1..5}
: 循环变量和循环范围。{1..5}
代表从 1 到 5 的整数序列。do
:循环体开始。done
:循环体结束。
#!/bin/bash
for i in {1..5}; do
echo "循环次数:$i"
done
3.3.3 while
while
:循环语句的开始。[ $count -lt 5 ]
: 循环条件。do
:循环体开始。done
:循环体结束。
#!/bin/bash
count=0
while [ $count -lt 5 ]; do
echo "循环次数:$count"
count=$((count + 1))
done
3.3.4 break、continue
break
:跳出当前循环。continue
:跳过当前循环的剩余语句,继续执行下一次循环。
#!/bin/bash
# 打印99乘法表
for i in {1..9}; do
for j in {1..9}; do
if [ $j -le $i ]; then
echo -ne "$j*$i=$((j*i))\t"
else
break
fi
done
echo
done
3.4、函数
在 Linux Shell 脚本中,函数是将一段代码封装成可重复使用的模块,类似于其他编程语言中的函数或方法。使用函数可以:
- 提高代码重用性: 将常用的代码块封装成函数,可以在脚本中多次调用,避免重复编写。
- 增强代码可读性: 将脚本逻辑划分成多个函数,使脚本结构更加清晰,易于理解和维护。
- 简化脚本逻辑: 将复杂的操作封装成函数,可以简化主脚本的代码,提高脚本的可维护性。
1. 函数定义
使用 function
关键字或直接使用函数名定义函数,函数体用花括号 {}
包含。
bash# 使用 function 关键字定义函数
function func_name {
# 函数体代码
}
# 直接使用函数名定义函数
func_name() {
# 函数体代码
}
#!/bin/bash
# 定义函数
print_echo() {
echo -ne "$1*$2=$(($1*$2))\t"
}
# 打印99乘法表
for i in {1..9}; do
for j in {1..9}; do
if [ $j -le $i ]; then
print_echo $j $i
else
break
fi
done
echo
done
#!/bin/bash
# 定义一个函数,计算两个数的和
function add {
sum=$(( $1 + $2 ))
echo "两个数的和为:$sum"
}
# 定义一个函数,判断一个数是否为偶数
function is_even {
if [ $(( $1 % 2 )) -eq 0 ]; then
echo "$1 是偶数"
else
echo "$1 不是偶数"
fi
}
# 主脚本代码
read -p "请输入第一个数字: " num1
read -p "请输入第二个数字: " num2
add $num1 $num2
read -p "请输入一个数字: " num
is_even $num
3.5 crontab定时任务
管理 crontab
-
编辑 crontab:
crontab -e
-
查看 crontab:
crontab -l
-
删除 crontab:
crontab -r
-
切换编辑器:
select-editor
crontab 格式定义
* * * * * command
其中,每个星号代表一个时间字段:
- 分钟 (0-59)
- 小时 (0-23)
- 日期 (1-31)
- 月份 (1-12)
- 星期 (0-6,0 代表周日)
每个字段可以使用以下字符:
- 星号 (*):代表所有可能的值。
- 逗号 (,): 分隔多个值。 例如:
0,30
表示 0 分和 30 分。 - 减号 (-):表示一个范围。 例如:
1-5
表示 1 到 5 的所有值。 - 斜杠 (/): 表示步长。 例如:
*/5
表示每 5 分钟执行一次。
常用 crontab 示例
-
每天凌晨 2:00 执行备份脚本:
0 2 * * * /path/to/backup_script.sh
-
每周日凌晨 4:00 清理系统日志:
0 4 * * 0 /path/to/cleanup_logs.sh
-
每小时的 15 分钟执行系统更新:
15 * * * * /usr/bin/apt-get update