Linux tutorial part 2
06. common applications
- 多种互联网应用(A Wide Variety of Internet Applications)
Linux 提供了多种互联网应用程序,能够支持用户进行各种网络相关的任务。例如:
- 浏览网页:Linux 支持多种图形化和文本模式的浏览器,可以轻松访问网页内容。
- 网页浏览器(Many Web Browsers, Graphical and Text)
在Linux中,有许多可供选择的浏览器,既有图形化用户界面的,也有基于文本的浏览器:
- 图形化浏览器:像 Firefox、Chromium、Brave 这样的浏览器,提供了完整的网页体验,支持图像、视频和复杂的网页交互。
- 文本浏览器:例如 Lynx 和 w3m,适用于在命令行界面(CLI)中浏览网页,这些浏览器占用资源少,适合处理简单网页或在没有图形界面的服务器上使用。
- 多种电子邮件应用程序(A Wide Variety of Email Applications)
Linux 系统提供了多种电子邮件客户端应用程序,帮助用户发送、接收和管理电子邮件:
- 图形界面客户端:如 Thunderbird,提供了便捷的邮件管理界面。
- 文本界面客户端:如 Mutt 和 Alpine,适合需要在终端环境下处理邮件的用户。
- 各种互联网相关任务的应用程序(Applications for Internet-Related Tasks)
Linux 拥有丰富的工具和应用程序,用于完成各种互联网相关的任务:
- 文件传输:如 FileZilla、rsync 用于文件上传和下载。
- 远程登录:如 SSH,用于远程管理服务器。
- 聊天工具:如 Pidgin、Slack、Telegram。
- 文档处理工具 LibreOffice(LibreOffice to Create & Edit Documents)
在Linux上,LibreOffice 是一款功能强大的办公套件,可以创建和编辑各种文档类型:
- Writer:用于处理文字文档。
- Calc:用于电子表格处理。
- Impress:用于制作幻灯片演示文稿。 LibreOffice 完全免费,兼容 Microsoft Office 文件格式,广泛应用于各种文档处理场景。
- 开发应用与工具(Development Applications and Tools)
Linux 是开发者的首选操作系统,提供了强大的开发工具:
- 文本编辑器:如 Vim、Emacs 和 Visual Studio Code。
- 编程工具链:如 GCC(GNU Compiler Collection)和 GDB(GNU Debugger)。
- 版本控制工具:如 Git,是 Linux 社区和开发者中最受欢迎的代码管理工具。
07. Command line operations
"Graphiocal user interfaces make easy tasks easier, while command line interfaces make difficult tasks possible."
7.1 more and less & head and tail
在Linux中,more 和 less 都是用于查看文件内容的命令,它们的主要区别在于功能和操作的灵活性:
- 基本功能
more:只能向下翻页,不能向上滚动文件内容。适合查看简单的文件,但功能较为有限。less:功能更强大,允许双向滚动(既可以向下翻页,也可以向上翻页)。同时,less提供了更多的导航功能。
- 加载方式
more:当文件较大时,more会一次性读取整个文件。如果文件特别大,可能会造成一定的延迟。less:less采用了按需加载(lazy loading),它不会一次性加载整个文件,而是根据你滚动的进度动态加载文件内容,这在查看大文件时非常高效。
- 使用的快捷键
-
more:基本的控制命令较少,常用的是:
Enter:向下滚动一行。Space:向下滚动一页。q:退出查看模式。
-
less:支持更多的快捷键,类似于
vi的操作:
Enter:向下滚动一行。Space:向下滚动一页。b:向上滚动一页。g:跳到文件的开头。G:跳到文件的末尾。/:用于搜索关键字。q:退出查看模式。
- 搜索功能
more:可以通过Ctrl+g查看当前位置,但搜索功能比较基础,使用/可以搜索文本,但没有高亮功能。less:支持更强大的搜索功能,并且可以高亮显示搜索结果。在使用/进行搜索时,匹配的内容会被标记出来,便于快速定位。
- 文件大小的处理
more:对大文件的支持较差,可能会因为需要一次性加载文件而卡顿。less:专为处理大文件设计,可以快速滚动和搜索大文件内容,性能较优。
总结
more:适用于简单、快速查看文件内容的场景,但功能有限。less:更灵活、功能更强大,尤其适合查看大文件或需要频繁翻页、搜索的场景。
简单来说, "less is more" ,因为 less 具有 more 的所有功能,并且提供了更多的操作选项。
head -20 00.c # 查看钱20行
tail -10 00.c # 查看后10行
locate zip | grep bin 是一个组合命令,包含了两个命令:locate 和 grep,并使用了管道操作符 | 将它们连接在一起。让我们逐步解析这个命令的含义:
locate zip
locate是一个用于快速查找文件的命令。它根据系统中的文件索引数据库(通常由updatedb定期更新)来搜索文件的路径,而不直接在文件系统中搜索。locate zip的意思是查找系统中名称包含 "zip" 的所有文件和目录。这个命令会返回所有与zip相关的路径。
|(管道操作符)
- 管道
|将locate zip的输出传递给grep命令处理。也就是说,所有包含zip的文件路径将被传递给下一个命令grep。
grep bin
grep是一个用于匹配文本模式的工具。在这里,grep bin的作用是筛选出包含 "bin" 的文件路径。bin通常指的是系统的二进制文件目录(例如/usr/bin/或/bin/),这些目录通常存放可执行程序。
7.2 查找文件locate and find
-
locate zip | grep bin的意思是:
- 先使用
locate zip查找系统中所有与 "zip" 相关的文件路径。 - 然后通过
grep bin过滤出这些路径中包含 "bin" 目录的结果。
- 先使用
这个命令的典型用途可能是查找与 zip 相关的可执行文件,比如 zip、unzip 等二进制文件的路径。
plocate 是 locate 的替代品,功能上非常相似。它们的核心用途都是用来快速查找系统中的文件。
主要区别
- 速度和资源占用:
plocate在处理大型文件数据库时更快,并且它的索引更新过程使用更少的系统资源。 - 现代化设计:
plocate采用了一些更现代的技术,优化了查询速度,尤其是在具有大量文件的系统中。
Linux 中的 find 命令用于在指定目录下递归查找文件和目录,功能强大且灵活。它可以基于文件名、类型、大小、时间等多种条件进行筛选和匹配。以下是 find 命令的一些基本用法和示例:
- 基本语法
find [查找路径] [查找条件] [操作]
- 查找路径:指定要查找的起始目录,默认为当前目录 (
.)。 - 查找条件:根据文件名、类型、大小等条件进行匹配。
- 操作:对匹配的文件或目录执行特定操作(如删除、移动等)。
- 按文件名查找
查找某个目录下,名称为 filename.txt 的文件:
find /path/to/search -name "filename.txt"
-
-name:按文件名进行查找,区分大小写。 -
例如:查找
/home目录下所有名为
file.txt的文件:
find /home -name "file.txt"
- 不区分大小写的文件名查找
使用 -iname 选项忽略大小写:
find /path/to/search -iname "filename.txt"
- 按文件类型查找
查找特定类型的文件或目录:
-
查找目录:查找
/home目录下所有子目录:find /home -type d-type d:表示查找的是目录。
-
查找文件:查找
/home目录下所有普通文件:find /home -type f-type f:表示查找的是普通文件。
- 按文件大小查找
查找大于 100 MB 的文件:
find /path/to/search -size +100M
-
-size:按文件大小查找,单位可以是
k(KB)、
M(MB)、
G(GB)。
+表示大于指定大小,-表示小于指定大小。
- 按时间查找
-
按修改时间查找:查找在最近 7 天内修改的文件:
find /path/to/search -mtime -7-mtime:按文件的最后修改时间查找。-7表示 7 天以内修改的文件,7表示正好 7 天前修改的文件。
-
按访问时间查找:查找在最近 3 天内被访问过的文件:
find /path/to/search -atime -3
- 按权限查找
查找权限为 755 的文件或目录:
find /path/to/search -perm 755
-perm:按文件权限查找。
- 查找并执行操作
-
删除匹配的文件:查找并删除扩展名为
.log的文件:find /path/to/search -name "*.log" -exec rm {} ;-exec:对匹配到的文件执行操作。{}会被替换为匹配的文件名,;表示命令的结束。
-
查找并移动文件:查找
.txt文件并将其移动到/backup目录:find /path/to/search -name "*.txt" -exec mv {} /backup ;
- 查找多个条件
查找文件名为 *.log 并且大小大于 10 MB 的文件:
find /path/to/search -name "*.log" -and -size +10M
-and:表示同时满足多个条件。
- 排除特定目录
在查找过程中排除某些目录:
find /path/to/search -path "/path/to/exclude" -prune -o -name "*.txt" -print
-prune:排除指定路径。-o:表示 "或者",结合-prune使用来排除目录后继续查找。
总结
find 是 Linux 中功能强大且灵活的查找命令。它允许基于文件名、文件类型、大小、时间、权限等多种条件进行筛选,并可以结合其他命令执行批量操作,非常适合处理大规模文件管理任务。
选择哪个工具取决于你的需求:如果你只需要快速找到文件,可以使用 locate;如果你需要精确查找或执行复杂的操作,使用 find 会更合适。
08. Finding Linux Documentation
8.1 man pages
man pages are the most often used source of Linux documentation
man -f sysctl 会显示与 sysctl 相关的手册页信息。-f 选项是 man 命令中的快捷方式,相当于 whatis 命令,用来快速查找命令或文件的简要描述。
和whatis sysctl 效果一样
man -f sysctl
# sysctl (8) - configure kernel parameters at runtime
# sysctl (2) - read/write system parameters
man -k sysctl 会显示包含关键词 sysctl 的所有手册页条目及其简要描述。-k 选项相当于 apropos 命令,用于搜索手册页中包含指定关键词的条目。
man -k sysctl
# _sysctl (2) - read/write system parameters
# sysctl (2) - read/write system parameters
# sysctl (8) - configure kernel parameters at runtime
# sysctl.conf (5) - sysctl preload/configuration file
# sysctl.d (5) - Configure kernel parameters at boot
# systemd-sysctl (8) - Configure kernel parameters at boot
# systemd-sysctl.service (8) - Configure kernel parameters at boot
man -a 命令用于显示指定命令或文件的所有手册页部分。如果一个命令在多个手册页部分中都有条目,man -a 会依次显示每个部分,直到你手动退出或者查看完所有部分。
8.2 The GPU infosystem
info make 命令用于打开 GNU make 工具的详细文档。make 是一个常用的构建自动化工具,而 info make 可以提供比 man make 更详细的说明,包含命令用法、规则定义、变量、函数和脚本等内容,帮助用户更深入地理解和使用 make。
在 info make 中,你可以使用快捷键导航文档,例如:
- 按
n查看下一页,按p查看上一页。 - 按
u回到上一层。 - 按
m键后输入章节名称,跳转到对应部分。 - 按
q退出。
info make
8.3 --help
man --help 命令用于显示 man 命令的帮助信息,列出其所有可用选项和用法说明。这通常包括如何指定手册页部分、搜索关键字、格式化输出等。
man --help
Usage: man [OPTION...] [SECTION] PAGE...
-C, --config-file=FILE use this user configuration file
-d, --debug emit debugging messages
-D, --default reset all options to their default values
--warnings[=WARNINGS] enable warnings from groff
Main modes of operation:
-f, --whatis equivalent to whatis
-k, --apropos equivalent to apropos
-K, --global-apropos search for text in all pages
-l, --local-file interpret PAGE argument(s) as local filename(s)
-w, --where, --path, --location
print physical location of man page(s)
-W, --where-cat, --location-cat
print physical location of cat file(s)
-c, --catman used by catman to reformat out of date cat pages
-R, --recode=ENCODING output source page encoded in ENCODING
Finding manual pages:
-L, --locale=LOCALE define the locale for this particular man search
-m, --systems=SYSTEM use manual pages from other systems
-M, --manpath=PATH set search path for manual pages to PATH
-S, -s, --sections=LIST use colon separated section list
-e, --extension=EXTENSION limit search to extension type EXTENSION
-i, --ignore-case look for pages case-insensitively (default)
-I, --match-case look for pages case-sensitively
--regex show all pages matching regex
--wildcard show all pages matching wildcard
--names-only make --regex and --wildcard match page names only,
not descriptions
-a, --all find all matching manual pages
-u, --update force a cache consistency check
--no-subpages don't try subpages, e.g. 'man foo bar' => 'man
foo-bar'
Controlling formatted output:
-P, --pager=PAGER use program PAGER to display output
-r, --prompt=STRING provide the `less' pager with a prompt
-7, --ascii display ASCII translation of certain latin1 chars
-E, --encoding=ENCODING use selected output encoding
--no-hyphenation, --nh turn off hyphenation
--no-justification, --nj turn off justification
-p, --preprocessor=STRING STRING indicates which preprocessors to run:
e - [n]eqn, p - pic, t - tbl,
g - grap, r - refer, v - vgrind
-t, --troff use groff to format pages
-T, --troff-device[=DEVICE] use groff with selected device
-H, --html[=BROWSER] use www-browser or BROWSER to display HTML output
-X, --gxditview[=RESOLUTION] use groff and display through gxditview
(X11):
-X = -TX75, -X100 = -TX100, -X100-12 = -TX100-12
-Z, --ditroff use groff and force it to produce ditroff
-?, --help give this help list
--usage give a short usage message
-V, --version print program version
Mandatory or optional arguments to long options are also mandatory or optional
for any corresponding short options.
Report bugs to cjwatson@debian.org.
09. Process
9.1 ps
ps
ps 是 process status 的缩写,用于显示当前系统中运行的进程信息。它可以列出所有进程的 ID、状态、CPU 使用情况、内存使用情况、启动时间、命令名称等详细信息,是系统管理员和开发者监控和管理进程的常用工具。
运行 ps 时的常见用法包括:
ps:显示当前 shell 会话中运行的进程。ps -e或ps aux:显示系统中所有进程。ps -f或ps -ef:显示进程的详细信息(长格式)。ps -u username:查看特定用户的进程。ps -p PID:查看指定 PID 的进程信息。
通过 ps 命令,可以获取进程的 PID 和其他信息,便于进一步操作,比如终止特定进程或查看资源消耗情况。
ps -lf
ps -lf 命令用于显示当前会话中进程的详细信息(长格式),提供了更多关于进程的字段,帮助深入了解进程的状态和特性。
ps -lf
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
4 1000 484 377 20 0 6232 5144 core_s S+ pts/1 0:00 -bash
4 1000 376 375 20 0 6820 5972 do_wai Ss pts/0 0:00 -bash
0 1000 863 376 20 0 7484 3144 - R+ pts/0 0:00 _ ps lf
下面是对每列的解释,以及这些进程各字段的含义:
| 列名 | 含义 | 进程解释 |
|---|---|---|
| F | 标志位,用于表示进程的特定属性 | 4 表示有特定的系统权限,0 表示一般权限 |
| UID | 用户 ID,进程所属用户 | 这些进程都属于用户 ID 为 1000 的用户 |
| PID | 进程 ID | 484、376 和 863 是这些进程的唯一标识符 |
| PPID | 父进程 ID,启动当前进程的父进程 | 484 的父进程是 377,376 的父进程是 375,863 的父进程是 376 |
| PRI | 优先级 | 所有进程的优先级为 20,表示普通优先级 |
| NI | “nice” 值,表示优先级调整 | 0 表示优先级没有额外调整 |
| VSZ | 虚拟内存大小(以 KB 为单位) | VSZ 分别为 6232、6820 和 7484,显示了每个进程所需的虚拟内存 |
| RSS | 实际内存占用(以 KB 为单位) | RSS 分别为 5144、5972 和 3144,表示物理内存的占用量 |
| WCHAN | 等待的内核函数 | core_s、do_wai 表示进程当前在等待的内核函数。- 表示未等待 |
| STAT | 状态 | S 表示睡眠状态,R 表示正在运行。 + 表示在前台运行 |
| TTY | 关联的终端 | pts/1 和 pts/0 是进程关联的虚拟终端 |
| TIME | 累计 CPU 时间 | 所有进程的累计 CPU 时间都为 0:00,表示它们几乎没有消耗 CPU |
| COMMAND | 启动进程的命令 | -bash 表示 Bash Shell,_ ps lf 表示执行了 ps lf 命令 |
每个进程的详细解释:
-
-bash进程 (PID 484) :- 由 PID 为
377的进程启动。 - 当前在
pts/1终端运行。 - 处于睡眠状态(
S+),几乎没有消耗 CPU。
- 由 PID 为
-
-bash进程 (PID 376) :- 由 PID 为
375的进程启动。 - 当前在
pts/0终端运行。 - 处于会话领导的睡眠状态(
Ss),也几乎没有 CPU 消耗。
- 由 PID 为
-
ps lf进程 (PID 863) :- 由
376号进程启动(即在pts/0终端上运行的 Bash)。 - 处于运行状态(
R+),正在前台执行ps lf命令以列出进程信息。
bg and fg commands run a process in the background and foreground
ps命令用于显示当前系统中的进程信息,通常用于查看哪些进程正在运行及其相关状态。ps是“process status”(进程状态)的缩写。ps的基本用法执行
ps可以看到当前终端下的进程信息。例如,执行ps默认会显示当前用户会话的进程,例如:PID TTY TIME CMD 1234 pts/1 00:00:00 bash 2345 pts/1 00:00:00 ps- PID:进程 ID。
- TTY:与进程相关联的终端。
- TIME:进程已用的 CPU 时间。
- CMD:启动进程的命令。
ps -ef的含义ps -ef是ps命令的一种常见用法,提供更详细的系统全局进程信息:-e:显示系统中所有进程(equivalent to--all)。-f:以完整格式显示进程信息,增加了更多详细字段。
执行
ps -ef后,会看到如下输出格式:UID PID PPID C STIME TTY TIME CMD root 1 0 0 12:00 ? 00:00:05 systemd user 1234 1233 0 12:01 pts/1 00:00:00 bash user 2345 1234 0 12:02 pts/1 00:00:00 ps- UID:用户 ID,表示启动该进程的用户。
- PID:进程 ID。
- PPID:父进程 ID。
- C:CPU 使用率。
- STIME:进程启动时间。
- TTY:进程的终端。
- TIME:进程累计的 CPU 使用时间。
- CMD:启动进程的命令。
ps -ef常用于系统管理和调试,因为它提供了系统中所有正在运行的进程信息,包括后台和其他用户的进程。ps -f是ps命令的一个常用选项,-f表示“full format”(完整格式)。这个选项会显示更加详细的进程信息,包括用户、进程 ID、父进程 ID、CPU 使用率、启动时间等字段。与基本的ps命令相比,ps -f提供了更全面的输出,可以帮助用户更好地了解进程的上下文和关系。ps -f UID PID PPID C STIME TTY TIME CMD gracefu+ 378 377 0 21:23 pts/0 00:00:00 -bash gracefu+ 560 378 0 21:34 pts/0 00:00:00 ps -f UID (gracefu+):表示运行该进程的用户(用户名为 gracefu+,即你)。 PID (378 和 560):进程 ID,用于唯一标识每个进程。 PPID (377 和 378):父进程 ID,表示启动该进程的父进程。378 的父进程为 377,而 560 的父进程为 378。 C (0):CPU 使用率,表示该进程的 CPU 使用情况(0 表示基本没有占用)。 STIME (21:23 和 21:34):进程的启动时间。-bash 在 21:23 启动,ps -f 在 21:34 启动。 TTY (pts/0):进程所属的终端,pts/0 表示该会话是在伪终端 0 上运行的。 TIME (00:00:00):累计的 CPU 时间,表示该进程使用的 CPU 总时间。两个进程均显示 00:00:00,说明占用的 CPU 时间非常少。 CMD:运行的命令。-bash 是你的 Bash shell 进程,而 ps -f 是你刚刚运行的 ps 命令。 总结来说,这个输出表示: 进程 ID 为 378 的 -bash 是你当前的 shell 进程,于 21:23 启动。 进程 ID 为 560 的 ps -f 是你刚执行的 ps 命令,于 21:34 启动,并显示了这个输出。ps -l命令中的-l选项表示“long format”(长格式),它提供更详细的进程信息。与ps -f的完整格式相比,ps -l显示了一些更底层的字段,特别是与进程的优先级和状态相关的信息ps -l F:进程标志。4 表示该进程是用户级别的普通进程,而 0 表示没有特别的标志。 S:进程状态。这里 S 表示休眠(sleeping)状态,而 R 表示运行(running)状态。 UID:用户 ID。1000 表示启动这些进程的用户。 PID:进程 ID,378 是你的 Bash shell 的进程 ID,579 是 ps 命令的进程 ID。 PPID:父进程 ID。378 的父进程是 377,而 579 的父进程是 378。 C:CPU 使用率,两个进程均为 0,表示 CPU 占用率低。 PRI:优先级。默认优先级为 80,数值越低优先级越高。 NI:Nice 值,默认是 0,越小优先级越高。 ADDR:内存地址。通常用户进程显示为 -。 SZ:进程使用的内存大小,单位是页面。bash 使用了 1564 页,ps 使用了 1871 页。 WCHAN:进程等待的内核函数。do_wai 表示 bash 进程在等待某个事件,而 ps 正在运行,没有等待。 TTY:终端,pts/0 表示虚拟终端。 TIME:进程累计的 CPU 时间。两个进程均显示 00:00:00,说明它们的 CPU 时间占用极低。 CMD:启动进程的命令,分别为 bash 和 ps。
- 由
nice 的范围:
nice值范围通常为 -20 到 +19,用于调整进程的优先级。较低的值(接近 -20)意味着更高的优先级,而较高的值(接近 +19)意味着较低的优先级。- 负值(例如 -10)通常需要管理员权限,表示进程有较高优先级,会更多占用 CPU。
- 正值(例如 +10)表示较低的优先级,进程会相对少占用 CPU 资源。
renice +5 376
命令 renice +5 376 用于将进程 ID 为 376 的进程的 nice 值调整为 +5。这会降低进程的优先级,使它在系统的 CPU 调度中处于较低的位置,从而减少其 CPU 资源的占用。
解释:
renice:用于调整正在运行的进程的优先级。+5:新的nice值,这里设置为+5,意味着该进程会比默认优先级(通常为0)更少获取 CPU 时间。376:目标进程的 PID。
使用场景:
这种调整通常用于减缓资源密集型进程的 CPU 使用,尤其在需要将更多资源让给其他进程时。
VSZ 和 RSS :
- VSZ(Virtual Memory Size)表示进程占用的虚拟内存大小,包括进程实际使用的内存,以及未实际使用但被分配的内存。它代表了进程地址空间的总大小,包括代码段、数据段、共享库等。
- RSS(Resident Set Size)表示进程实际占用的物理内存大小,即进程当前驻留在物理内存中的部分。这是进程实际使用的内存量,不包含已交换到磁盘的部分。
RSS 是 VSZ 的一个子集,因为 RSS 只计算实际驻留在物理内存中的部分,而 VSZ 则包含虚拟内存中所有已分配的部分。
9.2 查看负载指令 w/ top/ uptime
查看负载均衡可以用w, top, uptime 三个指令查看
w 指令用于查看当前登录到系统的用户信息和他们的活动情况。它提供关于当前用户、活动、系统负载等的综合信息。执行 w 命令后,会显示以下内容:
- 用户信息:列出每个当前登录用户的用户名。
- 登录终端:显示用户登录的终端名。
- 远程主机:如果用户通过远程主机登录,会显示该主机的 IP 地址。
- 登录时间:显示用户的登录时间。
- 空闲时间:显示用户终端的空闲时间。
- JCPU 和 PCPU:显示用户会话的总 CPU 使用时间和当前进程的 CPU 使用时间。
- 当前活动:显示用户正在运行的命令或活动。
w
# 输出
21:23:34 up 0 min, 1 user, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
graceful pts/1 - 21:23 1.00s 0.01s 0.01s -bash
21:23:34:这是当前系统时间。
up 0 min:表示系统已经运行了 0 分钟(刚启动)。
1 user:系统当前有 1 个用户在线。
load average: 0.00, 0.00, 0.00:表示系统的负载均值。三个数字分别代表过去 1 分钟、5 分钟和 15 分钟的平均负载。所有值为 0.00 表示当前系统负载很低。
在下方的用户信息表格中:
USER:显示当前登录的用户名,即 graceful。
TTY:显示用户的终端,pts/1 表示是一个伪终端,会话编号是 1。
FROM:表示用户登录的来源。这里显示 -,可能是因为你是在本地终端打开的,没有通过远程主机登录。
LOGIN@:用户的登录时间,21:23 表示你在 21:23 登录。
IDLE:显示用户终端的空闲时间,1.00s 表示空闲了 1 秒。
JCPU:显示用户会话的总 CPU 使用时间,0.01s 表示会话总共使用了 0.01 秒 CPU。
PCPU:显示当前进程的 CPU 使用时间,0.01s 表示当前进程(-bash)用了 0.01 秒 CPU。
WHAT:显示用户当前运行的命令,即 -bash,这是你的 Bash shell 会话。
uptime 命令用于显示系统的运行时间及其状态信息,包括当前时间、系统启动后的运行时长、当前在线用户数和系统的平均负载。执行 uptime 命令会输出类似以下的信息:
uptime
21:26:57 up 3 min, 1 user, load average: 0.00, 0.00, 0.00
w 和 uptime 这两个命令的名称都不是特定英文单词的缩写,而是为了简洁和易于记忆:
w:这是一个简短的单字母命令,没有明显的缩写含义。它主要用于方便地查看“Who is logged in”以及“what are they doing”(谁登录了系统、他们在做什么)。Linux 和 Unix 系统中常用简短命令名来提高输入效率。uptime:这个命令也没有明确的缩写,名称来源于“up time”(运行时间)。它直观地表示系统已经“运行了多长时间”的信息,因此被称为uptime。
这两个命令的命名在 Linux 和 Unix 系统中形成了标准,便于管理员快速检查系统状态。
top 指令的名称来源于“top processes”的缩写,它主要用于显示系统中占用资源最多的进程,方便用户了解系统的资源使用情况和进程状态。top 命令会实时更新系统的状态信息,让用户可以动态监控 CPU、内存等资源的占用情况。
运行 top 命令后,通常会看到以下信息:
- 系统总体状态:显示系统的当前时间、系统运行时间(uptime)、在线用户数、负载平均值。
- CPU、内存、交换分区的使用情况:显示 CPU 使用率(用户进程、系统进程、空闲等)、物理内存和交换分区的总量和已使用量。
- 进程列表:按资源占用排序列出当前正在运行的进程。列出的内容包括进程 ID(PID)、用户(USER)、优先级(PR)、虚拟内存占用(VIRT)、物理内存占用(RES)、CPU 使用率(%CPU)、内存使用率(%MEM)、运行时间(TIME+)、命令名称(COMMAND)等。
top 是系统监控的一个重要工具,它帮助用户实时跟踪系统性能、查找资源密集型进程、监控系统负载等。
top - 21:45:31 up 22 min, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 34 total, 1 running, 33 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 15638.3 total, 14834.7 free, 586.5 used, 217.1 buff/cache
MiB Swap: 4096.0 total, 4096.0 free, 0.0 used. 14789.3 avail Mem
头部信息
top - 21:45:31:当前时间,即 top 命令执行的时间为 21:45:31。
up 22 min:系统已经运行了 22 分钟。
1 user:系统当前有 1 位用户登录。
load average: 0.00, 0.00, 0.00:显示系统的负载均值。三个数字分别代表过去 1 分钟、5 分钟和 15 分钟的负载,所有值为 0.00 表示系统负载非常低。
任务信息
Tasks: 34 total:系统中有 34 个任务(即进程)。
1 running:其中有 1 个进程正在运行。
33 sleeping:33 个进程处于休眠状态。
0 stopped:没有被停止的进程。
0 zombie:没有僵尸进程。僵尸进程是已经终止但未被父进程回收的进程。
CPU 使用情况(%Cpu(s))
0.0 us:用户空间进程的 CPU 使用率(0.0%)。
0.0 sy:内核空间进程的 CPU 使用率(0.0%)。sy是system的意思
0.0 ni:使用调整了 Nice 值的进程的 CPU 使用率(0.0%)。
100.0 id:CPU 空闲时间百分比(100.0%),表示 CPU 目前处于空闲状态。
0.0 wa:等待 I/O 操作的 CPU 时间(0.0%)。
0.0 hi:硬件中断处理的 CPU 时间(0.0%)。
0.0 si:软件中断处理的 CPU 时间(0.0%)。
0.0 st:虚拟机偷取的 CPU 时间(0.0%),即该时间段被虚拟机占用。
内存使用情况(MiB Mem)
15638.3 total:总物理内存为 15638.3 MiB。
14834.7 free:空闲内存为 14834.7 MiB。
586.5 used:已使用的内存为 586.5 MiB。
217.1 buff/cache:用于缓存和缓冲的内存为 217.1 MiB。
交换分区使用情况(MiB Swap)
4096.0 total:交换分区的总大小为 4096.0 MiB。
4096.0 free:空闲交换分区为 4096.0 MiB,说明交换分区尚未使用。
0.0 used:已使用的交换分区为 0.0 MiB。
14789.3 avail Mem:系统中可用的物理内存(包括空闲内存和 buff/cache 的一部分)为 14789.3 MiB。
总结
你的系统目前负载极低,CPU 和内存资源都几乎没有使用,交换分区未被使用,系统处于非常空闲的状态。
僵尸进程(Zombie Process)
僵尸进程是指已经执行完毕、终止但仍占用一些系统资源的进程。它的特点是进程已经结束运行,但仍在进程表中占有一个条目。
- 原因:当子进程终止时,它需要父进程来读取和回收其退出状态信息(通过系统调用
wait或waitpid完成)。如果父进程没有及时回收这个状态信息,子进程的进程表项就会暂时保留,变成僵尸进程。 - 影响:僵尸进程不会占用内存或 CPU,但它占用一个进程 ID。如果有大量僵尸进程未被回收,系统的进程 ID 资源可能会被耗尽,影响系统性能。
- 解决:通常可以通过重新启动父进程,或者强制结束父进程使孤立的僵尸进程交由
init进程来处理,进而自动清理僵尸进程。
孤儿进程(Orphan Process)
孤儿进程是指其父进程已经终止,自己仍然在运行的进程。
- 原因:当父进程意外终止或正常退出时,其子进程会成为孤儿进程。
- 处理方式:在 Unix 和 Linux 系统中,孤儿进程会自动被系统的
init进程(PID 为 1)接管,init进程成为它们的新父进程。init负责清理这些子进程,以确保不会出现僵尸进程。 - 影响:孤儿进程通常不会对系统造成直接的资源问题,因为它们被
init进程管理,不会留下未回收的资源。
总结
- 僵尸进程:已结束,但等待父进程回收状态信息的进程。
- 孤儿进程:父进程已终止,但仍在运行的进程,由
init进程接管
9.3 任务调度 at / cron
at 指令用于在指定的时间执行一次性任务或命令。它是一种任务调度工具,适合安排将来执行的单次任务,而不是重复性任务(对于重复性任务通常使用 cron)。at 可以让你指定精确的时间和日期来运行命令或脚本,适合那些需要在未来某一特定时间执行的操作。
at 命令的基本用法
-
启动
at命令:at <时间>- 例如
at 10:30表示任务将在当天的 10:30 执行。 at now + 2 hours表示当前时间的 2 小时后执行任务。- 还可以使用具体的日期,例如
at 14:00 2024-10-30,表示在 2024 年 10 月 30 日的 14:00 执行。
- 例如
-
输入要执行的命令: 启动
at后,会进入一个提示符界面,你可以在该界面下输入希望在指定时间执行的命令。例如:at> echo "Hello World" > /tmp/test.txt输入完所有命令后,按 Ctrl+D 来结束输入并保存任务。
-
查看已创建的
at任务:atqatq列出当前用户所有等待执行的at任务。 -
删除一个
at任务:atrm <任务编号>atrm用于取消特定的at任务,可以通过atq查看任务编号。
示例
# 安排一个任务在 15 分钟后执行
echo "ls /home/user" | at now + 15 minutes
上例中,系统会在 15 分钟后执行 ls /home/user 命令。
cron 是 Linux 和 Unix 系统中的一个任务调度器,用于自动执行定期任务。它适合安排那些需要在特定时间周期内(例如每天、每周或每月)重复运行的任务。通过 cron,用户可以设置在后台定期执行的脚本或命令,例如备份数据、清理文件或发送邮件提醒等。
cron 的基本组成
cron 使用的调度配置文件称为 crontab,其中可以设定任务的执行频率和时间。每个用户都可以有自己的 crontab 文件。
设置 crontab 任务
通过以下命令可以创建或编辑 crontab 文件:
crontab -e
在 crontab 文件中,每行代表一个任务。任务的时间格式通常为五个时间字段,后面跟要执行的命令。时间字段的格式如下:
* * * * * command
五个星号表示的时间含义如下:
- 第一个
*:表示分钟(0 - 59)。 - 第二个
*:表示小时(0 - 23)。 - 第三个
*:表示日期中的天(1 - 31)。 - 第四个
*:表示月份(1 - 12)。 - 第五个
*:表示星期几(0 - 7,其中 0 和 7 都表示周日)。
示例:
0 5 * * * /path/to/script.sh:每天早上 5 点执行script.sh。30 2 * * 1 /path/to/backup.sh:每周一凌晨 2:30 执行backup.sh。*/15 * * * * /path/to/check.sh:每隔 15 分钟执行check.sh。0 0 1 * * /path/to/report.sh:每月 1 日的午夜运行report.sh。
管理 crontab 任务
-
查看当前用户的
crontab:crontab -l -
删除当前用户的
crontab:crontab -r
cron 日志
cron 执行的任务通常会被记录在系统日志文件中。可以通过查看 /var/log/cron 或 /var/log/syslog 来确认任务是否正确执行。
10. File Operations
10.1 挂载 mount 和取消挂载 umount
Linux Filesystem types
sudo mount /dev/sda5 /home
挂载(mount)是在 Linux 和 Unix 系统中,将存储设备(例如硬盘分区、USB 驱动器、光盘等)连接到系统文件系统的过程。通过挂载,系统可以访问和使用该设备的内容,就像操作文件夹中的文件一样。
挂载(mount)是在 Linux 和 Unix 系统中,将存储设备(例如硬盘分区、USB 驱动器、光盘等)连接到系统文件系统的过程。通过挂载,系统可以访问和使用该设备的内容,就像操作文件夹中的文件一样。
挂载的原理和用途
在 Linux 中,所有文件和目录都是从根目录 / 开始的一个单一目录树结构。挂载操作将外部存储设备的文件系统“连接”到这个目录树的某个位置(称为挂载点),让用户能够访问设备上的文件。
举例来说:
- 当你将一个 USB 驱动器挂载到
/mnt/usb,你就可以通过访问/mnt/usb这个目录来操作 USB 驱动器中的文件。 - 同样,将硬盘分区挂载到
/home后,所有与/home相关的文件操作都会直接访问该硬盘分区的内容。
挂载的步骤
挂载一个存储设备需要以下几个步骤:
- 识别设备:找到你想要挂载的设备路径(例如
/dev/sdb1)。 - 选择挂载点:确定一个空的目录作为挂载点(例如
/mnt/usb或/media/disk)。 - 执行挂载:使用
mount命令,将设备挂载到挂载点。
挂载命令示例
sudo mount /dev/sdb1 /mnt/usb
这个命令会将设备 /dev/sdb1 挂载到目录 /mnt/usb,之后你可以通过 /mnt/usb 来访问设备中的文件。
卸载(umount)
当设备不再需要时,可以使用 umount 命令卸载:
sudo umount /mnt/usb
卸载后,系统将不再能通过 /mnt/usb 访问该设备上的内容。
挂载的常见用途
- 连接外部设备:如 USB 驱动器或外部硬盘。
- 访问不同的文件系统:可以挂载 NTFS、exFAT 等文件系统格式的分区。
- 管理分区:例如,将特定的分区挂载到
/home、/data等目录来专门存储用户文件或数据。
挂载是 Linux 系统中灵活、高效的存储管理方法,通过挂载可以灵活地调整和使用存储设备。
Linux 中的挂载操作并不是复制或移动数据,而是建立一个访问路径,让系统能够直接读取或写入外部设备上的数据。
在 Windows 中,当你插入一个 U 盘,系统会自动为它分配一个盘符(比如 E:),这就相当于在 Linux 中的挂载过程。挂载之后,U 盘的数据就可以被直接访问,而不需要复制到系统内其他盘符中。
举例说明
假设有一个 U 盘,你想在 Windows 和 Linux 上访问它:
- 在 Windows 中:插入 U 盘后,它会出现在文件资源管理器中,比如
E:。从这里访问 U 盘内容相当于在 Linux 中将 U 盘挂载到/mnt/usb。 - 在 Linux 中:插入 U 盘后,你可以手动将它挂载到系统中某个目录(如
/mnt/usb),然后可以直接在/mnt/usb中访问它的内容,和访问本地文件夹一样。
总结
挂载并不会将 U 盘的文件复制到系统中,而是提供一个入口,以直接访问和操作外部存储设备上的数据。
10.2 NFS and Network Filesystems
NFS(Network File System) 是一种允许不同计算机通过网络共享文件和目录的协议。它属于网络文件系统(Network Filesystems)的一种,最常用于 Unix 和 Linux 系统之间的文件共享,但也可以用于其他操作系统中,比如 Windows 和 macOS。NFS 通过网络将远程文件系统挂载到本地系统,让用户可以像访问本地文件一样访问远程文件。
NFS(Network File System)的特点
- 文件共享:NFS 允许在网络上的不同计算机之间共享文件和目录。
- 透明访问:用户在本地访问 NFS 共享目录就像访问本地目录一样,无需额外操作。
- 集中管理:可以将重要的文件集中保存在一台服务器上,其他设备通过网络访问这些文件,便于管理。
- 跨平台支持:NFS 虽然主要用于 Unix 和 Linux,但也可以在 Windows 和 macOS 上使用。
NFS 的工作方式
在 NFS 中,有一个文件服务器(NFS Server)和一个或多个客户端(NFS Client):
- NFS 服务器:管理共享的文件目录,通过配置将这些目录设置为“共享”状态。
- NFS 客户端:通过挂载 NFS 服务器共享的目录,在本地访问这些远程文件系统。
NFS 典型的应用场景
- 企业和组织内部文件共享:例如,共享项目文件、数据库等,所有用户可以在不同计算机上同时访问。
- 集中存储:将用户的主目录保存在 NFS 服务器上,这样用户可以在任何客户端设备上登录并访问相同的主目录。
网络文件系统(Network Filesystems)
NFS 是网络文件系统(Network Filesystems)的一种,其他常见的网络文件系统还有:
- SMB(Server Message Block)/CIFS(Common Internet File System) :通常用于 Windows 环境中的文件共享,Linux 和 macOS 也支持它。
- AFP(Apple Filing Protocol) :主要用于 macOS 系统之间的文件共享。
- FTP(File Transfer Protocol) :一种文件传输协议,主要用于文件上传和下载,而不是直接文件系统访问。
- WebDAV(Web Distributed Authoring and Versioning) :基于 HTTP 协议的文件系统,支持在网络上协同编辑和管理文件。
总结
- NFS 是一种网络文件系统协议,主要用于在不同计算机之间共享文件和目录。
- Network Filesystems 是更广义的文件系统类型,包括 NFS、SMB、AFP 等多种协议,适合不同的操作系统和需求场景。
10.3 diff3
diff3 指令用于对比三个文件的差异,并显示它们之间的不同之处。它通常用于合并和比较文件版本,特别是在版本控制或团队协作中,帮助查看三方文件的不同内容并进行合并。
用法
diff3 [选项] 文件1 文件2 文件3
- 文件1:原始版本的文件。
- 文件2:第一个更改后的文件(通常是本地修改的文件)。
- 文件3:第二个更改后的文件(通常是远程或共享修改的文件)。
diff3 会比较文件1、文件2 和文件3 的内容,并标记出每个文件中不同的地方。如果文件2 和文件3 都修改了同一行,则标记为冲突(conflict),需要手动解决。
常用选项
-e:输出一个ed脚本,可以用来将文件1修改成文件2和文件3的合并版本。-m:将三个文件的差异合并为一个输出文件,标记出冲突部分(推荐用于合并)。-A:自动合并非冲突的部分,冲突部分仍然会标记出来供人工解决。
示例
diff3 -m file1.txt file2.txt file3.txt
- 上述命令会合并
file1.txt、file2.txt和file3.txt的差异,并在标准输出中显示。 - 如果
file2.txt和file3.txt中的更改有冲突,diff3会在输出中标记冲突区域,方便用户识别。
合并输出格式
diff3 的输出格式通常如下:
====1======
< file1的内容
====2======
< file2的内容
====3======
< file3的内容
这种格式会标记出三个文件在对应位置的内容,便于用户查看和解决冲突。
例子
diff3 00 01 03
====
1:2c
world1
2:2,3c
world2
3:2c
world3
====
1:2c
world1
2:2,3c
world2
3:2c
world3
====:分隔符,表示文件之间的差异部分开始。
1:2c:表示在文件 00 的第 2 行(2c 表示该行内容需要更改),内容是 world1。
1 代表第一个文件,即 00。
2c 表示第 2 行需要更改。
world1 是文件 00 中的内容。
2:2,3c:表示文件 01 在第 2 行和第 3 行(2,3c)的内容是 world2。
2 代表第二个文件,即 01。
2,3c 表示第 2 到第 3 行需要更改。
world2 是文件 01 中的内容。
3:2c:表示在文件 03 的第 2 行(2c)内容是 world3。
3 代表第三个文件,即 03。
2c 表示第 2 行需要更改。
world3 是文件 03 中的内容。
总结
diff3 告诉我们:
文件 00 的第 2 行是 world1。
文件 01 的第 2 和第 3 行是 world2。
文件 03 的第 2 行是 world3。
这些文件在对应行上的内容不一致,且显示出彼此的不同内容,便于用户合并或选择适合的修改版本。
10.4 file
file * 是一个命令,用于查看当前目录下所有文件的类型信息。file 命令会检测指定文件的内容,然后输出文件的类型描述,而 * 是通配符,表示匹配当前目录中的所有文件。
示例
在目录中执行 file * 可能会得到类似以下的输出:
file1.txt: ASCII text
image.png: PNG image data, 800 x 600, 8-bit/color RGBA, non-interlaced
script.sh: Bourne-Again shell script, ASCII text executable
archive.zip: Zip archive data, at least v2.0 to extract
binaryfile: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked
输出解释
每行包含文件名和文件类型的描述:
file1.txt是一个 ASCII 文本文件。image.png是一个 PNG 图像文件,显示了图像的分辨率和颜色深度。script.sh是一个 shell 脚本文件,类型为 ASCII 文本,可执行。archive.zip是一个压缩文件,类型为 Zip。binaryfile是一个二进制可执行文件,符合 ELF 格式,适用于 x86-64 架构。
常见用法
- 查看单个文件类型:
file filename - 查看当前目录下所有文件类型:
file * - 查看包含子目录的文件类型:
file * -r
file 命令能够识别大多数常见文件类型,通过这种方式,可以快速了解文件的内容类型,便于管理或进一步处理。
10.5 高效传输工具Rsync
高效传输工具Rsync, 可用于备份
rsync 是一个高效的文件传输和同步工具,常用于在本地目录之间或不同计算机之间同步文件和目录。它具有增量传输的特点,只复制源文件和目标文件之间的差异,从而节省带宽和时间。
基本用法
rsync 的基本语法如下:
rsync [选项] 源 目标
- 源:要复制的文件或目录路径。
- 目标:文件或目录的目的地路径,可能是本地路径或远程主机上的路径。
常用选项
-a:归档模式,保持文件的权限、时间戳、符号链接等信息,常用于备份。-v:详细模式,显示传输过程中的详细信息。-z:压缩传输,适合用于网络传输,可以节省带宽。-P:显示传输进度,并在传输被打断时可以继续传输。--delete:删除目标目录中源目录没有的文件,使目标目录与源目录完全同步。-e ssh:通过 SSH 进行传输,用于安全传输文件。
常用示例
-
本地目录同步:
rsync -av /path/to/source/ /path/to/destination/这会将
/path/to/source/中的所有文件同步到/path/to/destination/。 -
通过 SSH 远程同步:
rsync -av -e ssh /path/to/source/ user@remote:/path/to/destination/将本地的
/path/to/source/目录同步到远程主机user@remote的/path/to/destination/目录。 -
仅传输差异文件:
rsync -av --delete /path/to/source/ /path/to/destination/--delete选项会删除目标中源目录中没有的文件,使目标与源完全同步。
rsync 的特点
- 增量传输:只传输文件的差异部分,效率很高。
- 快速校验:rsync 使用哈希算法进行快速文件校验,以确定哪些文件需要更新。
- 灵活性:支持本地和远程同步,适用于多种场景。
- 备份和恢复:可用于定期备份文件,并在系统故障时快速恢复。
总结
rsync 是一个功能强大且灵活的文件同步工具,特别适合在备份和分布式环境中使用,是 Linux 和 Unix 系统中备份和同步的常用工具。
11 Text editors
Basic editors: nano , gedit
Adcanced editors: vi, emacs
如果不使用编辑器,只能使用echo的方式
echo line1 > file1
echo line2 >> file1
echo line3 >> file1
cat file1
cat << EOF > file2
cat << EOF > file2 是一种用于向文件中写入多行文本的 Bash 命令。它使用 Here Document(即“内嵌文档”)的方式,将多行内容重定向到文件 file2 中,直到遇到 EOF 关键字结束。
命令结构解释
cat:显示或处理文本内容的命令。<< EOF:<<表示开启 Here Document,EOF是结束标记,可以是任意单词(如END、FINISH),但开头和结尾必须一致。>:重定向符号,将输出写入文件。file2:目标文件名,表示将输出写入file2。
使用示例
cat << EOF > file2
This is line 1
This is line 2
This is line 3
EOF
解释流程
- 命令开始后,Shell 会等待输入内容,直到遇到
EOF。 - 输入的所有内容将被写入到
file2中。 - 当遇到
EOF后,输入结束,cat命令完成,内容已保存到file2。
运行结果
运行以上命令后,file2 中的内容如下:
This is line 1
This is line 2
This is line 3
总结
cat << EOF > file2 是一种快捷方式,用于将多行文本写入文件。
nano
gedit
emacs
vim
12. User environment
12.1 who / whoami
who指令 和 whoami指令
who 指令
who 命令用于查看当前登录到系统的所有用户的信息。它会列出每个用户的登录终端、登录时间等详细信息,适合了解系统上有哪些用户在线。
-
命令:
who -
输出示例:
username1 tty1 2024-10-25 08:15 username2 pts/0 2024-10-25 09:30- username:登录用户的用户名。
- tty / pts:表示用户登录的终端,
tty表示本地登录,pts表示通过网络或远程登录。 - 时间:用户的登录时间。
whoami 指令
whoami 命令用于显示当前用户的用户名,即你正在以哪个用户身份操作系统。它是 who am i 的缩写。
-
命令:
whoami -
输出示例:
gracefulblack输出当前登录用户的用户名,例如
gracefulblack
区别总结
who:显示当前系统上所有已登录用户的信息。whoami:显示执行命令的当前用户的用户名。
12.2 alias
alias 是用于创建命令别名的命令,主要用于简化复杂或常用命令的输入。通过 alias,你可以将一个较长的命令缩写为更短的自定义命令,方便使用。
基本用法
-
创建别名:
alias 别名='实际命令'例如,将
ls -la创建一个别名ll:alias ll='ls -la'现在你可以只输入
ll来执行ls -la。 -
查看当前别名: 不带任何参数使用
alias会列出所有当前定义的别名:alias -
删除别名: 使用
unalias命令可以删除别名:unalias 别名例如,删除
ll别名:unalias ll
常见示例
-
为 grep添加颜色高亮:
alias grep='grep --color=auto' -
简化
cd ..命令:
alias ..='cd ..' -
定义快速更新系统的命令(以 Debian 系列为例):
alias update='sudo apt update && sudo apt upgrade'
使别名永久生效
创建的别名在当前会话有效,但重启后会失效。要使别名永久生效,可以将别名写入到 shell 配置文件中,例如 ~/.bashrc 或 ~/.zshrc,然后重新加载配置文件:
source ~/.bashrc
总结
alias 是一个有效的工具,可以简化输入、提高工作效率,尤其在使用频繁命令或复杂命令时非常有用。
12.3 用户操作 useradd / userdel
在 Linux 中,创建和删除用户可以通过 useradd 和 userdel 命令来实现。
- 创建用户
使用 useradd 命令
useradd 用于创建新用户,并可设置一些用户属性(如主目录、shell 等)。
sudo useradd <用户名>
创建用户并设置主目录和 shell
可以指定用户的主目录、登录 shell、用户组等属性。
sudo useradd -m -d /home/<用户名> -s /bin/bash <用户名>
-m:自动创建用户的主目录。-d /home/<用户名>:指定主目录的位置。-s /bin/bash:指定用户登录使用的 shell(这里是/bin/bash)。
设置用户密码
新创建的用户没有默认密码。使用 passwd 命令为用户设置密码:
sudo passwd <用户名>
系统会提示输入并确认新用户的密码。
- 删除用户
使用 userdel 命令
userdel 命令用于删除用户,可以选择是否删除用户的主目录。
sudo userdel <用户名>
删除用户及其主目录
使用 -r 选项可以删除用户的主目录和所有文件:
sudo userdel -r <用户名>
注意事项
- 权限:这些操作需要管理员权限,通常需要使用
sudo。 - 配置文件:
useradd和userdel会自动更新系统的用户配置文件(如/etc/passwd和/etc/shadow)。
示例
创建一个名为 newuser 的用户并为其设置密码:
sudo useradd -m -s /bin/bash newuser
sudo passwd newuser
删除 newuser 用户及其主目录:
sudo userdel -r newuser
以上操作完成后,用户的主目录、所有数据和系统配置均已移除。
12.4 组操作指令 groupadd / groupdel / usermod / gpasswd / groups/ id
在 Linux 中,组(Group)用于管理和控制用户的权限。组的相关操作可以帮助管理员将用户组织成不同的组,以便管理文件权限和系统资源访问。
- 创建组
使用 groupadd 命令
groupadd 命令用于创建新组。
sudo groupadd <组名>
创建组并指定 GID
可以使用 -g 选项指定组 ID(GID),否则系统会自动分配一个唯一的 GID。
sudo groupadd -g 1001 <组名>
- 删除组
使用 groupdel 命令
groupdel 命令用于删除指定的组。
sudo groupdel <组名>
- 将用户添加到组
使用 usermod 命令
可以使用 usermod 命令将用户添加到一个或多个组:
sudo usermod -aG <组名> <用户名>
-aG:-a表示“追加”,即将用户添加到指定组而不删除其他组;-G表示指定的组。
示例:将用户添加到多个组
sudo usermod -aG group1,group2,group3 username
- 将用户从组中移除
使用 gpasswd 命令
gpasswd 命令可以移除用户的组成员身份。
sudo gpasswd -d <用户名> <组名>
示例:从组中移除用户
sudo gpasswd -d username group1
- 列出用户所属的组
使用 groups 命令
可以使用 groups 命令查看用户所属的所有组:
groups <用户名>
如果不加用户名,groups 会显示当前用户所属的组。
使用 id 命令
id 命令也可以显示用户的 UID、GID 和所属的组:
id <用户名>
- 更改用户的主组
每个用户有一个主组,创建文件时默认归属于主组。可以使用 usermod 命令更改用户的主组。
sudo usermod -g <主组名> <用户名>
- 修改组名
使用 groupmod 命令
groupmod 命令可以用于修改现有组的名称或 GID。
sudo groupmod -n <新组名> <旧组名>
示例操作
-
创建一个名为
developers的组:sudo groupadd developers -
将用户
alice添加到developers组:sudo usermod -aG developers alice -
查看用户
alice的所有组:groups alice -
删除
developers组:sudo groupdel developers
通过这些组管理命令,管理员可以更高效地管理用户的权限和访问控制。
12.5 环境变量
环境变量是存储在操作系统中的一些名称-值对,提供了应用程序或脚本可以访问的系统或用户配置信息。在 Linux 中,环境变量非常常用,特别是对于 shell 和脚本操作。下面是一些常见的环境变量:
PATH
-
定义:指定可执行文件的搜索路径。
-
作用:当你在命令行中输入命令时,系统会在
PATH定义的目录中搜索该命令。多个目录使用冒号:分隔。 -
示例
echo $PATH输出类似
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin,表示在这些路径中依次搜索命令。
HOME
-
定义:用户的主目录路径。
-
作用:表示当前用户的主目录路径,用于指向存储用户文件和配置文件的目录。
-
示例
echo $HOME输出
/home/username,表示用户的主目录路径。
USER
-
定义:当前登录用户的用户名。
-
作用:用于表示当前会话的用户名。
-
示例
echo $USER输出
username,表示当前用户的用户名。
SHELL
-
定义:当前用户使用的默认 shell。
-
作用:指定用户会话中使用的 shell 解释器(例如
/bin/bash)。 -
示例
echo $SHELL输出
/bin/bash或
/bin/zsh,表示用户使用的默认 shell。
PWD(print working directory)
-
定义:当前工作目录。
-
作用:表示当前终端所在的目录,等同于
pwd命令的输出。 -
示例:
echo $PWD输出
/home/username/projects,表示当前的工作路径。
LANG
-
定义:系统的语言和区域设置。
-
作用:指定系统的默认语言和编码,用于国际化支持。
-
示例
echo $LANG输出
en_US.UTF-8,表示系统语言为英语,美国地区,字符编码为 UTF-8。
EDITOR
-
定义:默认文本编辑器。
-
作用:表示系统中的默认文本编辑器,用于编辑器相关操作(如
crontab -e调用)。 -
示例
echo $EDITOR输出
vim或
nano,表示默认文本编辑器为 Vim 或 Nano。
PS1
-
定义:命令行提示符的格式。
-
作用:定义 shell 提示符的外观和格式。
-
示例
echo $PS1通常输出包含
\u(用户名)、
\h(主机名)和
\w(当前目录),如
[\u@\h \w]$。
MAIL
-
定义:用户的电子邮件存放位置。
-
作用:指定当前用户的邮件收件箱文件路径。
-
示例
echo $MAIL输出
/var/mail/username,表示存放当前用户邮件的位置。
HISTSIZE和HISTFILESIZE
-
定义
:控制命令历史的大小。
HISTSIZE:保存的命令历史条数。HISTFILESIZE:.bash_history文件中存储的历史条数。
-
作用:控制命令行历史记录的条数。
-
示例
echo $HISTSIZE echo $HISTFILESIZE默认值一般为
1000,表示保存最近的 1000 条命令。
设置和使用环境变量
-
临时设置环境变量:
export MY_VAR="Hello"使用
echo $MY_VAR查看值。
-
永久设置环境变量:将变量添加到
~/.bashrc或~/.bash_profile文件中,然后使用source ~/.bashrc使其生效。
这些环境变量在用户和系统级别均可使用,为系统配置和自动化脚本提供了灵活性和便利性。
12.6 文件权限 chown / chgrp / chmod
Linux 和 Unix 系统中,文件和目录的权限管理是至关重要的。chown、chgrp 和 chmod 是三个核心命令,分别用于更改文件的所有权、组以及权限。
chown- 更改文件或目录的所有者
chown 用于更改文件或目录的拥有者和/或所属组。
基本用法
sudo chown [选项] <新用户>[:<新组>] <文件或目录>
示例
-
更改文件所有者:
sudo chown newuser file.txt将
file.txt的所有者更改为newuser。 -
更改文件所有者和组:
sudo chown newuser:newgroup file.txt将
file.txt的所有者更改为newuser,并将组更改为newgroup。 -
递归更改目录下的所有文件和子目录的所有者:
sudo chown -R newuser:newgroup /path/to/directory
chgrp- 更改文件或目录的所属组
chgrp 用于更改文件或目录的组属性,适合只想更改组而不更改文件所有者的情况。
基本用法
sudo chgrp <新组> <文件或目录>
示例
-
更改文件的组:
sudo chgrp newgroup file.txt将
file.txt的组更改为newgroup。 -
递归更改目录下所有文件和子目录的组:
sudo chgrp -R newgroup /path/to/directory
chmod- 更改文件或目录的权限
chmod 用于更改文件或目录的访问权限。权限分为三种:所有者(User)、组(Group)、其他人(Others),分别对应读取(r)、写入(w)、执行(x)权限。
基本用法
chmod [选项] <权限> <文件或目录>
两种权限表示方法
-
符号模式:使用
u、g、o表示用户、组、其他人,+、-、=表示添加、删除、赋值权限。-
示例:
chmod u+x file.txt # 添加所有者执行权限 chmod g-w file.txt # 移除组的写权限 chmod o=r file.txt # 仅赋予其他人读权限
-
-
八进制模式:使用 3 个数字分别表示所有者、组、其他人权限。
-
常用数字表示:
4- 读取权限(r)2- 写入权限(w)1- 执行权限(x)
-
组合数字(相加)表示权限:
7- 读、写、执行权限(4+2+1)6- 读、写权限(4+2)5- 读、执行权限(4+1)0- 无权限
-
示例:
chmod 755 file.txt # 设置为所有者7(读写执行)、组5(读执行)、其他人5(读执行) chmod 644 file.txt # 设置为所有者6(读写)、组4(读)、其他人4(读)
-
递归更改权限
可以使用 -R 选项递归更改目录及其所有子目录和文件的权限。
chmod -R 755 /path/to/directory
总结
chown:更改文件或目录的所有者和组。chgrp:更改文件或目录的组。chmod:更改文件或目录的访问权限。
这些命令是文件权限管理中最重要的工具,有助于维护系统的安全性和资源访问控制。
13. manipulating Text
13.1 排序指令sort
sort指令
sort 是 Linux 和 Unix 系统中用于对文件或文本内容进行排序的命令。它可以按字母顺序、数字顺序、指定列或特定的排序规则进行排序,并提供了许多灵活的选项。
基本用法
sort [选项] 文件名
如果不指定文件,sort 会从标准输入读取数据。
常用选项
-
按字母顺序排序(默认)
sort file.txt默认情况下,
sort按字母顺序对文件内容排序。 -
按数字排序(
-n)sort -n file.txt-n选项将内容按数字顺序排序。如果文件内容包含数值,这个选项非常有用。 -
逆序排序(
-r)sort -r file.txt-r选项将内容按相反顺序(降序)排序。 -
按指定列排序(
-k)sort -k 2 file.txt-k选项指定按第几列进行排序。例如,-k 2表示按第二列排序。 -
忽略大小写排序(
-f)sort -f file.txt-f选项忽略大小写进行排序,将大写字母与小写字母视为相同。 -
移除重复行(
-u)sort -u file.txt-u选项去除排序后的重复行,保留唯一行(相当于先sort再uniq)。bash -
随机排序(
-R)sort -R file.txt-R选项将文件内容随机排序(仅部分系统支持)。 -
指定分隔符(
-t)sort -t ',' -k 2 file.csv-t选项可以指定分隔符。例如,-t ','指定,为分隔符,用于 CSV 文件或其他分隔格式的数据。
示例
假设有一个文件 data.txt,内容如下:
Alice 30
Bob 25
Charlie 35
Alice 28
-
按名字(第一列)排序:
sort -k 1 data.txt输出:
Alice 28 Alice 30 Bob 25 Charlie 35 -
按年龄(第二列)排序:
sort -k 2 -n data.txt输出:
Bob 25 Alice 28 Alice 30 Charlie 35
管道配合使用
sort 常与其他命令通过管道配合使用,例如:
cat file.txt | sort | uniq
这会对 file.txt 进行排序并去除重复行。
sort -n 适合纯数字处理
我们希望对这些数字按从小到大的顺序进行排序,可以使用 sort -n 命令(-n 表示按数字排序):
sort -n numbers.txt
输出结果
3
8
17
29
42
100
逆序排序
如果希望按从大到小的顺序排序,可以使用 -nr 选项:
sort -nr numbers.txt
输出结果
100
42
29
17
8
3
1
这种按数字排序的方式非常适合处理纯数字数据,并确保排序结果符合数值的逻辑顺序。
命令 sort file1 file2 | uniq > file3 的作用是将 file1 和 file2 中的内容进行合并、排序,并去除重复行,然后将结果写入到 file3 文件中。具体的分步解释如下:
sort file1 file2
sort:对文件内容进行排序。file1 file2:sort会将这两个文件的内容合并并进行排序,按字母顺序(默认)排列。
| uniq
uniq:去除相邻的重复行,仅保留唯一的行。|(管道) :将sort的输出传递给uniq,去除重复行。
> file3
>:将最终的去重排序结果重定向到file3。file3:结果文件,如果file3已存在则会被覆盖,不存在则会被创建。
示例
假设 file1 和 file2 内容如下:
file1 内容
apple
banana
cherry
apple
file2 内容
banana
date
apple
fig
执行命令 sort file1 file2 | uniq > file3 后,file3 的内容为:
apple
banana
cherry
date
fig
总结
这个命令的作用是将两个文件合并排序,并去除重复行,结果保存在 file3 中。
uniq -c filename 命令用于统计并显示文件中连续重复行的次数,并在每行开头添加出现次数的计数。
示例
假设 filename 的内容如下:
apple
apple
banana
banana
banana
cherry
apple
执行 uniq -c filename 后的输出将是:
2 apple
3 banana
1 cherry
1 apple
输出解释
- 每行的第一个数字表示该行内容的连续重复次数。
- 例如,
2 apple表示apple出现了 2 次连续重复,3 banana表示banana出现了 3 次连续重复。 - 如果行内容没有连续重复,则计数为 1。
注意事项
uniq 默认只统计连续的重复行,如果文件中相同内容的行没有连续,则不会统计。可以使用 sort 命令将文件排序后再使用 uniq -c 统计所有重复行的总数:
sort filename | uniq -c
13.2 paste 和 join
paste 和 join 是 Linux 中用于处理文本文件的命令,它们都可以将文件的内容合并在一起,但方式不同,适用于不同场景。
paste命令
paste 命令用于将多个文件的每一行内容合并在一起,生成一个新的文件,通常按列进行拼接。
基本用法
paste file1 file2
该命令会将 file1 和 file2 中的每一行内容合并为一行,默认用制表符分隔。
常用选项
-d <分隔符>:指定分隔符,默认是制表符。可以使用其他分隔符,例如-d ","用逗号分隔。-s:将文件内容按行合并(串联),而不是逐行拼接。
示例
假设 file1 和 file2 内容如下:
file1:
apple
banana
cherry
file2:
1
2
3
执行 paste file1 file2 后输出为:
apple 1
banana 2
cherry 3
join命令
join 命令用于按共同字段(类似 SQL 中的 JOIN 操作)将两个文件合并。文件需要按要合并的字段排序,且默认为文件的第一列。
基本用法
join file1 file2
该命令会将 file1 和 file2 中具有相同字段的行合并在一起。
常用选项
-1 <列号>:指定file1中要匹配的字段(默认是第 1 列)。-2 <列号>:指定file2中要匹配的字段(默认是第 1 列)。-t <分隔符>:指定字段分隔符(默认为空格或制表符)。-o:自定义输出格式,可以指定显示哪些字段。
示例
假设 file1 和 file2 内容如下:
file1:
apple 10
banana 20
cherry 30
file2:
apple A
banana B
grape C
执行 join file1 file2 后输出为:
apple 10 A
banana 20 B
总结
paste:按行合并文件内容,适用于并列显示每一行的多个字段。join:按指定字段合并文件内容,适用于类似数据库的关联操作。
13.3 正则表达式
在 Linux 中,正则表达式被广泛应用于命令行工具和文本处理,如 grep、sed、awk、find 等命令。了解如何在 Linux 中使用正则表达式可以大大提升文本处理和自动化的效率。
- 正则表达式的种类
在 Linux 中,正则表达式主要有两种:
- 基础正则表达式(BRE,Basic Regular Expressions) :用于大多数 Linux 命令中,例如
grep(默认)。 - 扩展正则表达式(ERE,Extended Regular Expressions) :支持更多的正则表达式特性,例如
+、?、|,通常在grep -E或egrep中使用。
- 基本正则表达式符号
-
普通字符:例如
abc匹配字符串 "abc"。 -
.:匹配任意单个字符(换行符除外)。 -
[]字符集:匹配括号内任意一个字符。
[aeiou]匹配任一元音字母。[a-z]匹配小写字母。[0-9]匹配数字。
-
^:匹配字符串的开头。 -
$:匹配字符串的结尾。 -
``:用于转义特殊字符。
- 常用量词
在扩展正则表达式(ERE)中,量词表示字符重复的次数:
*:匹配前一个字符 0 次或多次。+:匹配前一个字符 1 次或多次(ERE 中使用)。?:匹配前一个字符 0 次或 1 次。{n}:匹配前一个字符n次。{n,m}:匹配前一个字符n到m次。
- 特殊字符
\d:匹配数字,等同于[0-9]。\w:匹配单词字符(字母、数字、下划线)。\s:匹配空白字符(空格、制表符等)。
- 常用命令及示例
grep:文本搜索工具
-
基本用法
grep "正则表达式" 文件名 -
查找包含数字的行
grep '[0-9]' filename -
匹配以特定字符开头的行
grep '^a' filename # 匹配以 'a' 开头的行 -
匹配以特定字符结尾的行
grep 'z$' filename # 匹配以 'z' 结尾的行
sed:流编辑器
sed 可用于替换和处理文本内容。
-
替换某个模式
sed 's/正则表达式/替换文本/g' filename -
删除包含特定模式的行
sed '/^$/d' filename # 删除空行 -
从文件中提取电子邮件地址
grep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}" filename
awk:强大的文本处理工具
awk 可使用正则表达式处理字段和行。
-
查找包含某个模式的行
awk '/pattern/ { print $0 }' filename -
过滤并处理特定字段
awk '/[0-9]/ { print $1, $3 }' filename # 输出包含数字的行的第 1 和第 3 列
find:文件查找工具
find 命令可使用正则表达式匹配文件名或路径。
-
查找匹配模式的文件
find /path -name "*.txt" # 查找 .txt 文件
示例总结
假设有一个文件 example.txt,内容如下:
apple 42
banana 100
cherry 23
apple 15
可以使用以下正则表达式命令:
-
查找包含 "apple" 的行:
grep 'apple' example.txt -
查找包含数字的行:
grep '[0-9]' example.txt -
删除文件中的空行:
sed '/^$/d' example.txt
这些正则表达式和命令让文本处理、查找、替换操作更加灵活高效,特别适合批量数据处理和日志分析等场景。
14. Network Operations
14.1 host指令
host 指令在 Linux 和 macOS 系统中用于 DNS 查询和解析域名信息。它可以帮助你查找域名对应的 IP 地址、MX 记录、CNAME 记录等 DNS 信息。以下是一些常用的 host 指令及其功能:
基本用法
host <域名>
这个命令会返回域名对应的 IP 地址。例如:
host google.com
输出类似:
google.com has address 142.250.74.110
google.com has IPv6 address 2607:f8b0:4007:80e::200e
常用选项
-
查询特定类型的记录 使用
-t选项可以查询特定类型的 DNS 记录,比如A、MX、CNAME等。host -t A <域名> # 查询 A 记录(IPv4 地址) host -t AAAA <域名> # 查询 AAAA 记录(IPv6 地址) host -t MX <域名> # 查询邮件交换记录 host -t CNAME <域名> # 查询 CNAME 记录 -
指定 DNS 服务器 使用
host命令时可以指定要使用的 DNS 服务器:host <域名> <DNS服务器IP>例如:
host google.com 8.8.8.8这里会使用 Google 的公共 DNS 服务器(8.8.8.8)进行查询。
-
反向查询 IP 地址 反向查询 IP 地址对应的域名可以用:
host <IP地址>例如:
host 8.8.8.8输出类似:
8.8.8.8.in-addr.arpa domain name pointer dns.google. -
查询 NS 记录
NS记录指定了域名的权威 DNS 服务器。可以使用以下命令查询:host -t NS <域名> -
查询 TXT 记录
TXT记录通常用于验证域名所有权或存储其他信息,如 SPF、DKIM 信息等:host -t TXT <域名>
示例
查询 google.com 的 MX(邮件交换)记录:
host -t MX google.com
通过指定的 DNS 服务器查询 example.com 的 A 记录:
host example.com 1.1.1.1
这些 host 命令可以帮助你进行快速的 DNS 查询和故障排查。
14.2 ping指令
ping 是一个网络诊断命令,用于测试与目标 IP 地址或域名之间的网络连通性。它通过发送 ICMP(Internet Control Message Protocol)回显请求数据包,并计算返回的时间来评估网络连接的质量、速度和丢包率。
基本用法
ping <目标域名或IP地址>
例如:
ping google.com
输出类似于:
PING google.com (142.250.74.110): 56 data bytes
64 bytes from 142.250.74.110: icmp_seq=0 ttl=54 time=12.5 ms
64 bytes from 142.250.74.110: icmp_seq=1 ttl=54 time=12.4 ms
每行输出显示从目标收到的数据包信息,其中包括往返时间(time),序列号(icmp_seq)以及生存时间(ttl)。
常用选项
-
指定数据包发送数量 (
-c) 发送指定数量的数据包后停止。例如,发送 5 个数据包:ping -c 5 google.com -
设置发送间隔时间 (
-i) 控制每个数据包发送之间的时间间隔(单位为秒)。例如,设置 2 秒的发送间隔:ping -i 2 google.com -
设置数据包大小 (
-s) 指定发送的数据包大小(以字节为单位)。例如,发送 100 字节的数据包:ping -s 100 google.com -
指定存活时间 (TTL) (
-t或-m,不同系统略有不同) TTL 限制数据包经过的最大跳数。例如,设置 TTL 为 5:ping -t 5 google.com # Linux ping -m 5 google.com # macOS -
启用无声模式(仅输出统计信息) (
-q) 只显示开始和结束的统计信息,适合快速测试连通性:ping -q google.com -
增加响应速度的详细信息 (
-v) 显示更详细的调试信息,适用于需要更多诊断数据的情况:ping -v google.com
解释输出信息
icmp_seq:数据包序号,用于检测数据包丢失和顺序。ttl:生存时间(Time To Live),表示数据包允许经过的最大跳数。time:往返时间(Round-Trip Time),显示从发送到返回的时间(单位为毫秒)。
常见用途
- 检测网络连通性:通过
ping测试本地主机、网关和远程服务器的连通性。 - 检测网络延迟:观察
time值来查看往返时间(RTT),有助于评估网络速度和响应时间。 - 检测数据包丢失:查看统计信息中的数据包丢失情况来判断网络是否稳定。
- 追踪路径问题:结合
ping和traceroute可帮助识别网络中断的位置。
14.3 route / ip route
route 是一个用于显示和管理 Linux 系统中的网络路由表的命令,帮助用户查看和配置数据包的路由路径。通过 route 命令,可以定义哪些 IP 地址走哪条网络路径,比如通过哪个网关或接口发送数据。下面是 route 命令的基本用法和常用选项。
基本用法
-
显示当前路由表
route或者使用:
route -n-n选项使 IP 地址直接以数字形式显示,而不是尝试解析成域名,从而提高显示速度。输出通常包含以下字段:
Destination:目标网络或 IP。Gateway:下一跳网关地址。Genmask:子网掩码。Flags:标志,表示路由项的状态(如 U 表示有效、G 表示网关等)。Iface:使用的网络接口(如 eth0、wlan0)。
-
添加默认网关
sudo route add default gw <网关IP地址>例如:
sudo route add default gw 192.168.1.1该命令会将默认网关设置为
192.168.1.1,即没有其他匹配的情况下,数据包都会通过这个网关发送。 -
添加静态路由
sudo route add -net <目标网络> netmask <子网掩码> gw <网关IP地址> dev <接口>例如:
sudo route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.1.1 dev eth0该命令会将
192.168.2.0/24网络的流量通过192.168.1.1网关,并使用eth0接口。 -
删除路由
sudo route del -net <目标网络> netmask <子网掩码>例如:
sudo route del -net 192.168.2.0 netmask 255.255.255.0该命令删除到
192.168.2.0/24网络的路由。删除默认网关
sudo route del default gw <网关IP地址>例如:
sudo route del default gw 192.168.1.1
常用选项
-n:以数字形式显示 IP 地址,避免解析域名。add:添加新的路由。del:删除指定路由。default:指定默认路由。-net:用于添加网络地址。netmask:指定子网掩码。gw:指定下一跳网关。dev:指定路由所使用的网络接口。
示例
-
查看路由表
route -n -
添加到特定网络的静态路由
sudo route add -net 10.10.10.0 netmask 255.255.255.0 gw 192.168.1.1 dev eth0 -
设置默认网关
sudo route add default gw 192.168.1.254 -
删除到特定网络的静态路由
sudo route del -net 10.10.10.0 netmask 255.255.255.0
ip route 是 Linux 系统中的一个命令,用于显示和管理 IP 路由表。与较旧的 route 命令相比,ip route 是 ip 命令集的一部分,功能更加强大,并且在现代 Linux 系统中更常用。ip route 可以帮助用户定义数据包的传输路径,包括添加、删除或修改路由,以及查看当前的路由配置。
基本用法
-
查看当前路由表
bash 复制代码 ip route输出的内容通常包含以下字段:
- default via:默认网关。
- dev:用于路由的网络接口(例如 eth0、wlan0 等)。
- proto:协议类型,例如
kernel表示系统配置的内核默认路由。 - src:源 IP 地址。
- metric:路由优先级,数字越小优先级越高。
-
添加默认网关
sudo ip route add default via <网关IP地址> dev <接口>例如:
sudo ip route add default via 192.168.1.1 dev eth0这条命令将
192.168.1.1设置为默认网关,数据包在没有特定路由时都会通过此网关发送。 -
添加静态路由
sudo ip route add <目标网络>/<子网掩码> via <网关IP地址> dev <接口>例如:
sudo ip route add 10.10.10.0/24 via 192.168.1.1 dev eth0此命令添加了到
10.10.10.0/24网络的静态路由,数据包将通过192.168.1.1网关,使用eth0接口。 -
删除路由
sudo ip route del <目标网络>/<子网掩码>例如:
sudo ip route del 10.10.10.0/24此命令删除到
10.10.10.0/24网络的路由。 -
修改现有路由 修改一条现有路由可以用
replace参数:sudo ip route replace <目标网络>/<子网掩码> via <新网关IP地址> dev <接口>例如:
sudo ip route replace 10.10.10.0/24 via 192.168.1.2 dev eth0
常用选项
add:添加一条新的路由。del:删除一条路由。replace:替换现有路由,若不存在则添加。default:指定默认路由。via:指定下一跳的网关 IP。dev:指定网络接口。table:用于高级路由,指定路由表的编号。
示例
-
查看所有路由
ip route -
添加到特定网络的路由
sudo ip route add 192.168.2.0/24 via 192.168.1.1 dev eth0 -
添加默认路由
sudo ip route add default via 192.168.1.254 -
删除到特定网络的路由
sudo ip route del 192.168.2.0/24
ip route 与 route 的区别
- 功能更强大:
ip route支持更复杂的配置,如多路由表、策略路由等。 - 语法更统一:
ip命令集包括了路由、地址和链路管理等网络相关的所有功能,比传统命令更加一致。 - 性能更好:
ip命令在处理大型路由表时更加高效。
14.4 traceroute
traceroute 是一个网络诊断工具,用于追踪数据包从源地址到目标地址的路径,并显示数据包经过的每一跳(即每个中间路由器或节点)。通过 traceroute 可以了解数据在网络中的传输路径、各节点的响应时间,以及识别是否存在网络瓶颈或连接问题。
工作原理
-
traceroute利用 ICMP(Internet Control Message Protocol) 或 UDP(User Datagram Protocol) 数据包,通过逐步增加 TTL(Time To Live) 值来发送数据包。- 每个数据包的 TTL 表示数据包可以经过的最大跳数,默认从 1 开始,并逐渐递增。
- 每经过一跳,TTL 会减少 1,当 TTL 为 0 时,路由器会丢弃该数据包并返回一个“超时”消息。
- 这样,
traceroute可以依次识别经过的每个节点并记录响应时间。
-
traceroute在收到返回信息后,会显示每一跳的 IP 地址和每次响应的延迟时间。通过递增 TTL 值,traceroute可以逐步追踪到目标地址的完整路径。
基本用法
traceroute <目标地址或域名>
例如:
traceroute google.com
输出示例:
traceroute to google.com (142.250.74.110), 30 hops max, 60 byte packets
1 router.local (192.168.1.1) 1.123 ms 1.082 ms 1.075 ms
2 100.64.0.1 (100.64.0.1) 10.678 ms 10.742 ms 10.691 ms
3 ...
每一行显示了经过的路由器的 IP 地址,以及到达该路由器的延迟时间(单位为毫秒)。
常用选项
-
-n:以数字形式显示 IP 地址,避免解析为域名,提高查询速度。
traceroute -n google.com -
-m:设置最大跳数(TTL)。默认值为 30,设置更高的跳数以防止路径过长被中断。
traceroute -m 50 google.com -
-w:设置等待时间(超时时间)。单位为秒,指定每一跳的响应超时。
traceroute -w 2 google.com -
-I:使用 ICMP 进行 traceroute,而非默认的 UDP。ICMP 比较适合用于网络诊断。
traceroute -I google.com -
-p:指定发送数据包的端口号(默认是 33434),适用于 UDP 数据包方式。
traceroute -p 33435 google.com -
-q:设置每一跳发送数据包的数量(默认是 3)。
traceroute -q 1 google.com
分析 traceroute 输出
- 每一行代表一个网络中的路由节点(或“跳”),从源头到目标的顺序排列。
- 响应时间:每一跳会显示多次响应时间,通常 3 次。它表示数据包到该节点的往返时间。
* * *:表示该节点未返回响应,这可能是因为防火墙或该节点配置不允许 ICMP 数据包通过。- 网络瓶颈:如果某一跳的延迟显著增加,可能表明该节点或其连接存在问题。
应用场景
- 检测网络延迟:识别哪些节点导致网络延迟,通常用于网络优化。
- 排查网络故障:定位网络连接中断的节点或区域,帮助确定网络故障位置。
- 网络路径分析:了解从源地址到目标地址的数据路径,可以用于网络安全和流量优化。
注意事项
- 某些路由器或节点会丢弃 ICMP 或 UDP 数据包,因此
traceroute输出可能会出现星号(*),不一定代表网络故障。 - 某些防火墙或安全配置会阻止
traceroute工作。
14.5 ethtool
ethtool 是 Linux 系统中的一个命令行工具,用于查看和配置网络接口的各种参数,特别是以太网设备(Ethernet devices)。通过 ethtool,可以检查网卡的状态、调整网卡的特性(如速率、双工模式)、启用或禁用自动协商、监控网卡错误统计等。它在网络配置和调试中非常有用。
ethtool 的基本功能
-
查看网卡信息
使用
ethtool加上网络接口名称,可以查看网卡的详细信息,例如速率、双工模式、自动协商状态等。ethtool <接口名称>例如:
ethtool eth0典型输出包括以下内容:
Supported ports:支持的端口类型(如 Twisted Pair、Fiber)。Speed:当前网卡的速率(如 10Mbps、100Mbps、1Gbps)。Duplex:双工模式(Full 表示全双工,Half 表示半双工)。Auto-negotiation:自动协商状态(on/off)。Link detected:是否检测到物理链路。
-
设置网卡速度和双工模式
可以手动设置网卡的速率、双工模式和自动协商状态。例如:
sudo ethtool -s eth0 speed 100 duplex full autoneg off该命令将
eth0设置为 100Mbps 全双工,并关闭自动协商。 -
启用或禁用自动协商
自动协商是网络设备之间自动选择最佳连接模式的过程。可以通过以下命令开启或关闭自动协商:
sudo ethtool -s eth0 autoneg on sudo ethtool -s eth0 autoneg off -
查看和清除网卡统计信息
使用
-S选项可以查看网卡的详细统计信息(如接收和发送的数据包数量、错误数量等),用于监控网络性能和排查问题:ethtool -S eth0 -
更改网卡的接收(RX)和发送(TX)缓冲区大小
在网络流量较大的环境下,增加网卡的缓冲区大小可以提高性能。
sudo ethtool -G eth0 rx 512 tx 512 -
设置和查看网卡的 Wake-on-LAN (WOL) 状态
ethtool支持配置 Wake-on-LAN 功能,即在网络上接收到特定的“唤醒”数据包时启动计算机。可以用以下命令查看和设置 WOL 状态:ethtool eth0 | grep Wake-on sudo ethtool -s eth0 wol g # 设置WOL sudo ethtool -s eth0 wol d # 禁用WOL -
测试网卡功能
某些网卡支持通过
ethtool进行诊断测试。可以运行自检命令:sudo ethtool -t eth0
常用选项bash
- -i`:显示网卡驱动程序和固件版本等信息。
-k:查看和设置网卡的 offload 功能,如校验和、分段等。-p:使网卡闪烁,以便识别特定网卡(通常用于多网卡环境)。-r:重启网卡的自动协商。
应用场景
- 性能优化:调整网卡速率、双工模式和 offload 设置,以优化网络性能。
- 网络调试:查看网卡状态和统计信息,排查网络故障。
- 节能设置:使用 WOL 和自动协商功能,降低能耗或远程唤醒设备。
ethtool 是网络管理员在 Linux 系统中管理和调试以太网设备的一个重要工具。
14.6 netstat
netstat -r 命令用于显示系统的路由表信息,类似于 route 命令的输出。它可以帮助用户查看数据包的路由路径及网络接口的配置,常用于网络诊断和查看路由设置。netstat 是一个网络管理工具,提供关于网络连接、接口状态和路由表的信息,而 -r 选项专门用于显示路由表。
netstat -r 的输出信息
运行 netstat -r 命令时,通常会看到以下字段:
-
Destination:目标网络或主机地址,指向数据包的目的地。
-
Gateway:网关地址。如果某条路由使用了网关转发数据包,则显示网关 IP 地址;如果不使用网关,通常显示
*。 -
Genmask:子网掩码,定义了网络的范围。
-
Flags
:标志,描述路由的属性,如:
U:表示该路由是可达的(up)。G:表示使用网关。H:表示目标是主机。D:表示由路由重定向创建。M:表示该路由是由路由修改的。
-
Metric:路由的优先级(数字越小优先级越高)。
-
Ref:引用计数,表示路由被多少个连接使用。
-
Use:使用计数,表示该路由被使用的次数。
-
Iface:使用的网络接口(例如
eth0、wlan0等),表示数据包通过的接口。
示例
运行以下命令:
netstat -r
输出可能如下所示:
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
10.10.10.0 192.168.1.254 255.255.255.0 UG 0 0 0 eth1
解释
- 第一行
default表示默认路由,通过网关192.168.1.1和接口eth0发送数据包。 - 第二行
192.168.1.0表示本地网络,所有在192.168.1.0/24网段的数据包直接在eth0接口发送,而不需要网关。 - 第三行
10.10.10.0表示10.10.10.0/24网段的数据包通过网关192.168.1.254发送,使用eth1接口。
常见用途
- 查看默认网关:用于确认数据包的默认路由设置。
- 排查网络连接问题:检查是否有错误的路由条目导致网络无法访问。
- 多接口路由配置:在多网卡环境中,查看数据包如何选择不同的网卡接口发送。
netstat -r 提供了系统的 IP 路由表信息,帮助用户了解数据包在网络中转发的路径和接口选择。
14.7 wget
wget 是一个命令行工具,用于从网络下载文件。它支持 HTTP、HTTPS 和 FTP 协议,可以在终端中执行批量下载、断点续传、递归下载等操作。wget 非常适合自动化下载任务,并且可以在后台静默运行,适用于脚本和批处理。
基本用法
wget <URL>
例如:
wget https://example.com/file.zip
常用选项
-
下载到指定文件夹或文件名 使用
-O选项指定下载文件的保存路径或名称。wget -O /path/to/folder/filename.zip https://example.com/file.zip -
断点续传 使用
-c选项支持从上次中断的地方继续下载。wget -c https://example.com/file.zip -
递归下载 使用
-r选项启用递归下载,通常用于下载整个网站或目录。wget -r https://example.com/-l设置递归的深度。例如-l 2表示递归两层。- 使用
-np防止下载父目录(只下载指定目录及其子目录)。
-
后台下载 使用
-b选项将下载任务放在后台运行,适用于大型文件。wget -b https://example.com/file.zip -
限制下载速度 使用
--limit-rate选项限制下载速度,例如 100K(每秒 100KB)。wget --limit-rate=100k https://example.com/file.zip -
下载多个文件 可以将多个 URL 放在一个文本文件中,然后使用
-i选项读取文件下载。wget -i urls.txt其中
urls.txt文件中包含多个下载链接,每行一个 URL。 -
指定用户代理 使用
--user-agent选项指定用户代理,模拟不同的浏览器。wget --user-agent="Mozilla/5.0" https://example.com/file.zip -
跳过 SSL 证书验证 有些网站的 SSL 证书可能不被信任,用
--no-check-certificate可以跳过验证。wget --no-check-certificate https://example.com/file.zip -
指定用户名和密码 如果下载需要认证,可以用
--user和--password选项指定用户名和密码。wget --user=username --password=password https://example.com/protected-file.zip
示例
-
下载文件并保存为指定名称
wget -O myfile.zip https://example.com/file.zip -
断点续传下载
wget -c https://example.com/large-file.zip -
下载整个网站
wget -r -l 2 -np https://example.com/ -
后台下载文件
wget -b https://example.com/file.zip
应用场景
- 批量文件下载:自动下载多个文件,适合下载文件列表。
- 网站备份:递归下载网站页面,备份静态内容。
- 自动化下载:用于脚本中自动下载文件,适合数据采集和备份任务。
wget 功能强大、灵活,是命令行文件下载的利器。
14.8 curl
curl 是一个命令行工具,用于在终端中与服务器进行数据传输。curl 支持多种协议,包括 HTTP、HTTPS、FTP 等,因此它不仅可以用于文件下载,还能发送各种请求(如 GET、POST、PUT 等),以及查看和调试 HTTP 请求和响应。它广泛应用于数据传输、API 调用、网络调试等场景。
基本用法
curl <URL>
例如:
curl https://example.com
常用选项
-
下载文件 使用
-O选项将文件保存为原始文件名,或使用-o指定保存文件名。curl -O https://example.com/file.zip curl -o myfile.zip https://example.com/file.zip -
发送 GET 请求 默认情况下,
curl <URL>就是发送 GET 请求,用于获取数据。 -
发送 POST 请求 使用
-X POST指定请求方法,使用-d选项传递数据。curl -X POST -d "param1=value1¶m2=value2" https://example.com/api如果要发送 JSON 格式数据,需设置请求头为
application/json。curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' https://example.com/api -
添加请求头 使用
-H添加自定义请求头(例如模拟浏览器或设置 API token)。curl -H "User-Agent: Mozilla/5.0" https://example.com curl -H "Authorization: Bearer <token>" https://example.com/api -
显示响应头 使用
-I选项仅显示响应头信息。curl -I https://example.com -
查看详细信息 使用
-v选项显示请求和响应的详细信息,用于调试。curl -v https://example.com -
保存响应内容 使用
-o将响应内容保存到指定文件中。curl -o response.html https://example.com -
自动跟随重定向 使用
-L选项自动跟随 3xx 重定向。curl -L https://example.com -
上传文件 使用
-F选项上传文件,适合文件上传接口。curl -X POST -F "file=@/path/to/file" https://example.com/upload -
指定请求超时时间 使用
--connect-timeout和-m设置连接和总请求超时(单位为秒)。curl --connect-timeout 10 -m 30 https://example.com
示例
-
下载文件并重命名
curl -o myfile.zip https://example.com/file.zip -
发送 JSON 数据的 POST 请求
curl -X POST -H "Content-Type: application/json" -d '{"name":"John", "age":30}' https://example.com/api -
上传文件
curl -X POST -F "file=@/path/to/myfile.zip" https://example.com/upload -
带自定义请求头的 GET 请求
curl -H "Authorization: Bearer mytoken123" https://example.com/api -
查看网站的 HTTP 响应头
curl -I https://example.com
应用场景
- 数据下载和文件传输:用于从网络下载文件或上传文件到服务器。
- 调用 API 接口:在终端中发送各种请求,调用 RESTful API 进行数据操作。
- 调试 HTTP 请求:通过查看详细请求和响应,调试网络连接和 API 调用。
- 批量数据传输:结合脚本和
curl,批量获取数据或上传文件。
curl 是命令行网络请求的多功能工具,非常适合自动化任务和脚本化的数据传输操作。
14.9 ssh
ssh (Secure Shell) 是一种用于在不安全网络中提供安全加密的网络协议,主要用于通过远程主机的命令行界面进行安全连接。使用 SSH 可以安全地访问远程服务器、传输文件、执行命令等。它广泛用于服务器管理和远程登录操作。
SSH 基本用法
SSH 命令的基本格式如下:
ssh [user]@[hostname] [command]
例如,要以用户 username 连接到主机 example.com:
ssh username@example.com
常用选项
-
指定端口 (
-p) SSH 默认使用端口 22,但如果服务器在其他端口提供 SSH 服务,可以用-p指定端口。ssh -p 2222 username@example.com -
执行远程命令 可以在 SSH 会话中直接执行特定命令,然后退出会话。例如:
ssh username@example.com "ls /var/www"这会在远程主机上列出
/var/www目录的内容,然后断开连接。 -
代理转发 (
-A) 启用 SSH 代理转发,允许在远程主机上使用本地主机的身份验证代理。适用于多跳 SSH 登录。ssh -A username@example.com -
X11 转发 (
-X) 启用 X11 图形界面转发,允许在本地显示远程图形应用程序的界面(如果服务器和客户端都支持 X11)。ssh -X username@example.com -
保持连接 (
-o ServerAliveInterval) 避免连接超时,设置服务器保持活动消息的间隔(单位为秒)。例如:ssh -o ServerAliveInterval=60 username@example.com -
使用指定的密钥文件 (
-i) 如果使用非默认的 SSH 密钥文件,可以通过-i指定密钥文件路径。ssh -i ~/.ssh/custom_key username@example.com
SSH 密钥认证
SSH 支持通过密钥进行无密码认证。生成 SSH 密钥对后,可以将公钥上传到服务器,这样在登录时无需输入密码。
-
生成 SSH 密钥对 使用
ssh-keygen命令生成密钥对,默认存储在~/.ssh/目录中。ssh-keygen -t rsa -b 4096 -C "your_email@example.com" -
将公钥复制到服务器 使用
ssh-copy-id将公钥传输到远程主机,配置无密码登录。ssh-copy-id username@example.com -
测试 SSH 连接 之后可以直接使用
ssh username@example.com登录,无需输入密码。
SSH 端口转发
SSH 支持端口转发(端口隧道),用于加密其他网络服务的流量。
-
本地端口转发 (
-L) 将本地机器的一个端口映射到远程服务器的指定端口,例如将本地8080端口转发到远程服务器的80端口:ssh -L 8080:localhost:80 username@example.com这样,本地访问
localhost:8080时会被转发到远程服务器的80端口。 -
远程端口转发 (
-R) 将远程服务器的一个端口转发到本地,例如将远程服务器的9090端口转发到本地3000端口:ssh -R 9090:localhost:3000 username@example.com -
动态端口转发 (
-D) 使用动态转发创建一个 SOCKS 代理,例如将本地的1080端口作为代理端口,适用于匿名浏览:ssh -D 1080 username@example.com
应用场景
- 远程服务器管理:通过 SSH 登录服务器,进行文件操作、服务管理等。
- 加密文件传输:通过
scp(基于 SSH 的命令)在本地和远程主机之间传输文件。 - 端口转发:通过 SSH 隧道加密其他服务的流量,保障数据安全。
- 自动化任务:结合 SSH 和脚本,可以实现远程服务器的批量管理。
SSH 是一种安全、强大的工具,可以通过加密网络连接来管理远程服务器,广泛应用于服务器管理和运维场景。