Linux tutorial Part 2

161 阅读1小时+

Linux tutorial part 2

06. common applications

  1. 多种互联网应用(A Wide Variety of Internet Applications)

Linux 提供了多种互联网应用程序,能够支持用户进行各种网络相关的任务。例如:

  • 浏览网页:Linux 支持多种图形化和文本模式的浏览器,可以轻松访问网页内容。
  1. 网页浏览器(Many Web Browsers, Graphical and Text)

在Linux中,有许多可供选择的浏览器,既有图形化用户界面的,也有基于文本的浏览器:

  • 图形化浏览器:像 FirefoxChromiumBrave 这样的浏览器,提供了完整的网页体验,支持图像、视频和复杂的网页交互。
  • 文本浏览器:例如 Lynxw3m,适用于在命令行界面(CLI)中浏览网页,这些浏览器占用资源少,适合处理简单网页或在没有图形界面的服务器上使用。
  1. 多种电子邮件应用程序(A Wide Variety of Email Applications)

Linux 系统提供了多种电子邮件客户端应用程序,帮助用户发送、接收和管理电子邮件:

  • 图形界面客户端:如 Thunderbird,提供了便捷的邮件管理界面。
  • 文本界面客户端:如 MuttAlpine,适合需要在终端环境下处理邮件的用户。
  1. 各种互联网相关任务的应用程序(Applications for Internet-Related Tasks)

Linux 拥有丰富的工具和应用程序,用于完成各种互联网相关的任务:

  • 文件传输:如 FileZillarsync 用于文件上传和下载。
  • 远程登录:如 SSH,用于远程管理服务器。
  • 聊天工具:如 PidginSlackTelegram
  1. 文档处理工具 LibreOffice(LibreOffice to Create & Edit Documents)

在Linux上,LibreOffice 是一款功能强大的办公套件,可以创建和编辑各种文档类型:

  • Writer:用于处理文字文档。
  • Calc:用于电子表格处理。
  • Impress:用于制作幻灯片演示文稿。 LibreOffice 完全免费,兼容 Microsoft Office 文件格式,广泛应用于各种文档处理场景。
  1. 开发应用与工具(Development Applications and Tools)

Linux 是开发者的首选操作系统,提供了强大的开发工具:

  • 文本编辑器:如 VimEmacsVisual 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中,moreless 都是用于查看文件内容的命令,它们的主要区别在于功能和操作的灵活性:

  1. 基本功能
  • more:只能向下翻页,不能向上滚动文件内容。适合查看简单的文件,但功能较为有限。
  • less:功能更强大,允许双向滚动(既可以向下翻页,也可以向上翻页)。同时,less 提供了更多的导航功能。
  1. 加载方式
  • more:当文件较大时,more 会一次性读取整个文件。如果文件特别大,可能会造成一定的延迟。
  • lessless 采用了按需加载(lazy loading),它不会一次性加载整个文件,而是根据你滚动的进度动态加载文件内容,这在查看大文件时非常高效。
  1. 使用的快捷键
  • more

    :基本的控制命令较少,常用的是:

    • Enter:向下滚动一行。
    • Space:向下滚动一页。
    • q:退出查看模式。
  • less

    :支持更多的快捷键,类似于

    vi
    

    的操作:

    • Enter:向下滚动一行。
    • Space:向下滚动一页。
    • b:向上滚动一页。
    • g:跳到文件的开头。
    • G:跳到文件的末尾。
    • /:用于搜索关键字。
    • q:退出查看模式。
  1. 搜索功能
  • more:可以通过 Ctrl+g 查看当前位置,但搜索功能比较基础,使用 / 可以搜索文本,但没有高亮功能。
  • less:支持更强大的搜索功能,并且可以高亮显示搜索结果。在使用 / 进行搜索时,匹配的内容会被标记出来,便于快速定位。
  1. 文件大小的处理
  • more:对大文件的支持较差,可能会因为需要一次性加载文件而卡顿。
  • less:专为处理大文件设计,可以快速滚动和搜索大文件内容,性能较优。

总结

  • more:适用于简单、快速查看文件内容的场景,但功能有限。
  • less:更灵活、功能更强大,尤其适合查看大文件或需要频繁翻页、搜索的场景。

简单来说, "less is more" ,因为 less 具有 more 的所有功能,并且提供了更多的操作选项。

head -20 00.c # 查看钱20行
tail -10 00.c # 查看后10行

locate zip | grep bin 是一个组合命令,包含了两个命令:locategrep,并使用了管道操作符 | 将它们连接在一起。让我们逐步解析这个命令的含义:

  1. locate zip
  • locate 是一个用于快速查找文件的命令。它根据系统中的文件索引数据库(通常由 updatedb 定期更新)来搜索文件的路径,而不直接在文件系统中搜索。
  • locate zip 的意思是查找系统中名称包含 "zip" 的所有文件和目录。这个命令会返回所有与 zip 相关的路径。
  1. | (管道操作符)
  • 管道 |locate zip 的输出传递给 grep 命令处理。也就是说,所有包含 zip 的文件路径将被传递给下一个命令 grep
  1. grep bin
  • grep 是一个用于匹配文本模式的工具。在这里,grep bin 的作用是筛选出包含 "bin" 的文件路径。bin 通常指的是系统的二进制文件目录(例如 /usr/bin//bin/),这些目录通常存放可执行程序。

7.2 查找文件locate and find

  • locate zip | grep bin
    

    的意思是:

    1. 先使用 locate zip 查找系统中所有与 "zip" 相关的文件路径。
    2. 然后通过 grep bin 过滤出这些路径中包含 "bin" 目录的结果。

这个命令的典型用途可能是查找与 zip 相关的可执行文件,比如 zipunzip 等二进制文件的路径。

plocatelocate 的替代品,功能上非常相似。它们的核心用途都是用来快速查找系统中的文件。

主要区别

  • 速度和资源占用plocate 在处理大型文件数据库时更快,并且它的索引更新过程使用更少的系统资源。
  • 现代化设计plocate 采用了一些更现代的技术,优化了查询速度,尤其是在具有大量文件的系统中。

Linux 中的 find 命令用于在指定目录下递归查找文件和目录,功能强大且灵活。它可以基于文件名、类型、大小、时间等多种条件进行筛选和匹配。以下是 find 命令的一些基本用法和示例:

  1. 基本语法
find [查找路径] [查找条件] [操作]
  • 查找路径:指定要查找的起始目录,默认为当前目录 (.)。
  • 查找条件:根据文件名、类型、大小等条件进行匹配。
  • 操作:对匹配的文件或目录执行特定操作(如删除、移动等)。
  1. 按文件名查找

查找某个目录下,名称为 filename.txt 的文件:

find /path/to/search -name "filename.txt"
  • -name:按文件名进行查找,区分大小写。

  • 例如:查找

    /home
    

    目录下所有名为

    file.txt
    

    的文件:

    find /home -name "file.txt"
    
  1. 不区分大小写的文件名查找

使用 -iname 选项忽略大小写:

find /path/to/search -iname "filename.txt"
  1. 按文件类型查找

查找特定类型的文件或目录:

  • 查找目录:查找 /home 目录下所有子目录:

    find /home -type d
    
    • -type d:表示查找的是目录。
  • 查找文件:查找 /home 目录下所有普通文件:

    find /home -type f
    
    • -type f:表示查找的是普通文件。
  1. 按文件大小查找

查找大于 100 MB 的文件:

find /path/to/search -size +100M
  • -size

    :按文件大小查找,单位可以是

    k
    

    (KB)、

    M
    

    (MB)、

    G
    

    (GB)。

    • + 表示大于指定大小,- 表示小于指定大小。
  1. 按时间查找
  • 按修改时间查找:查找在最近 7 天内修改的文件:

    find /path/to/search -mtime -7
    
    • -mtime:按文件的最后修改时间查找。-7 表示 7 天以内修改的文件,7 表示正好 7 天前修改的文件。
  • 按访问时间查找:查找在最近 3 天内被访问过的文件:

    find /path/to/search -atime -3
    
  1. 按权限查找

查找权限为 755 的文件或目录:

find /path/to/search -perm 755
  • -perm:按文件权限查找。
  1. 查找并执行操作
  • 删除匹配的文件:查找并删除扩展名为 .log 的文件:

    find /path/to/search -name "*.log" -exec rm {} ;
    
    • -exec:对匹配到的文件执行操作。{} 会被替换为匹配的文件名,; 表示命令的结束。
  • 查找并移动文件:查找 .txt 文件并将其移动到 /backup 目录:

    find /path/to/search -name "*.txt" -exec mv {} /backup ;
    
  1. 查找多个条件

查找文件名为 *.log 并且大小大于 10 MB 的文件:

find /path/to/search -name "*.log" -and -size +10M
  • -and:表示同时满足多个条件。
  1. 排除特定目录

在查找过程中排除某些目录:

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

psprocess status 的缩写,用于显示当前系统中运行的进程信息。它可以列出所有进程的 ID、状态、CPU 使用情况、内存使用情况、启动时间、命令名称等详细信息,是系统管理员和开发者监控和管理进程的常用工具。

运行 ps 时的常见用法包括:

  • ps:显示当前 shell 会话中运行的进程。
  • ps -eps aux:显示系统中所有进程。
  • ps -fps -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进程 ID484376863 是这些进程的唯一标识符
PPID父进程 ID,启动当前进程的父进程484 的父进程是 377376 的父进程是 375863 的父进程是 376
PRI优先级所有进程的优先级为 20,表示普通优先级
NI“nice” 值,表示优先级调整0 表示优先级没有额外调整
VSZ虚拟内存大小(以 KB 为单位)VSZ 分别为 623268207484,显示了每个进程所需的虚拟内存
RSS实际内存占用(以 KB 为单位)RSS 分别为 514459723144,表示物理内存的占用量
WCHAN等待的内核函数core_sdo_wai 表示进程当前在等待的内核函数。- 表示未等待
STAT状态S 表示睡眠状态,R 表示正在运行。 + 表示在前台运行
TTY关联的终端pts/1pts/0 是进程关联的虚拟终端
TIME累计 CPU 时间所有进程的累计 CPU 时间都为 0:00,表示它们几乎没有消耗 CPU
COMMAND启动进程的命令-bash 表示 Bash Shell,_ ps lf 表示执行了 ps lf 命令

每个进程的详细解释:

  1. -bash 进程 (PID 484)

    • 由 PID 为 377 的进程启动。
    • 当前在 pts/1 终端运行。
    • 处于睡眠状态(S+),几乎没有消耗 CPU。
  2. -bash 进程 (PID 376)

    • 由 PID 为 375 的进程启动。
    • 当前在 pts/0 终端运行。
    • 处于会话领导的睡眠状态(Ss),也几乎没有 CPU 消耗。
  3. 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 -efps 命令的一种常见用法,提供更详细的系统全局进程信息:

    • -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 -fps 命令的一个常用选项,-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 (378560):进程 ID,用于唯一标识每个进程。
    PPID (377378):父进程 ID,表示启动该进程的父进程。378 的父进程为 377,而 560 的父进程为 378。
    C (0):CPU 使用率,表示该进程的 CPU 使用情况(0 表示基本没有占用)。
    STIME (21:2321: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 表示是一个伪终端,会话编号是 1FROM:表示用户登录的来源。这里显示 -,可能是因为你是在本地终端打开的,没有通过远程主机登录。
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

wuptime 这两个命令的名称都不是特定英文单词的缩写,而是为了简洁和易于记忆:

  1. w:这是一个简短的单字母命令,没有明显的缩写含义。它主要用于方便地查看“Who is logged in”以及“what are they doing”(谁登录了系统、他们在做什么)。Linux 和 Unix 系统中常用简短命令名来提高输入效率。
  2. 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)

僵尸进程是指已经执行完毕、终止但仍占用一些系统资源的进程。它的特点是进程已经结束运行,但仍在进程表中占有一个条目

  • 原因:当子进程终止时,它需要父进程来读取和回收其退出状态信息(通过系统调用 waitwaitpid 完成)。如果父进程没有及时回收这个状态信息,子进程的进程表项就会暂时保留,变成僵尸进程。
  • 影响:僵尸进程不会占用内存或 CPU,但它占用一个进程 ID。如果有大量僵尸进程未被回收,系统的进程 ID 资源可能会被耗尽,影响系统性能。
  • 解决:通常可以通过重新启动父进程,或者强制结束父进程使孤立的僵尸进程交由 init 进程来处理,进而自动清理僵尸进程。

孤儿进程(Orphan Process)

孤儿进程是指其父进程已经终止,自己仍然在运行的进程

  • 原因:当父进程意外终止或正常退出时,其子进程会成为孤儿进程。
  • 处理方式:在 Unix 和 Linux 系统中,孤儿进程会自动被系统的 init 进程(PID 为 1)接管,init 进程成为它们的新父进程。init 负责清理这些子进程,以确保不会出现僵尸进程。
  • 影响:孤儿进程通常不会对系统造成直接的资源问题,因为它们被 init 进程管理,不会留下未回收的资源。

总结

  • 僵尸进程:已结束,但等待父进程回收状态信息的进程。
  • 孤儿进程:父进程已终止,但仍在运行的进程,由 init 进程接管

9.3 任务调度 at / cron

at 指令用于在指定的时间执行一次性任务或命令。它是一种任务调度工具,适合安排将来执行的单次任务,而不是重复性任务(对于重复性任务通常使用 cron)。at 可以让你指定精确的时间和日期来运行命令或脚本,适合那些需要在未来某一特定时间执行的操作。

at 命令的基本用法

  1. 启动 at 命令

    at <时间>
    
    • 例如 at 10:30 表示任务将在当天的 10:30 执行。
    • at now + 2 hours 表示当前时间的 2 小时后执行任务。
    • 还可以使用具体的日期,例如 at 14:00 2024-10-30,表示在 2024 年 10 月 30 日的 14:00 执行。
  2. 输入要执行的命令: 启动 at 后,会进入一个提示符界面,你可以在该界面下输入希望在指定时间执行的命令。例如:

    at> echo "Hello World" > /tmp/test.txt
    

    输入完所有命令后,按 Ctrl+D 来结束输入并保存任务。

  3. 查看已创建的 at 任务

    atq
    

    atq 列出当前用户所有等待执行的 at 任务。

  4. 删除一个 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 相关的文件操作都会直接访问该硬盘分区的内容。

挂载的步骤

挂载一个存储设备需要以下几个步骤:

  1. 识别设备:找到你想要挂载的设备路径(例如 /dev/sdb1)。
  2. 选择挂载点:确定一个空的目录作为挂载点(例如 /mnt/usb/media/disk)。
  3. 执行挂载:使用 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)的特点

  1. 文件共享:NFS 允许在网络上的不同计算机之间共享文件和目录。
  2. 透明访问:用户在本地访问 NFS 共享目录就像访问本地目录一样,无需额外操作。
  3. 集中管理:可以将重要的文件集中保存在一台服务器上,其他设备通过网络访问这些文件,便于管理。
  4. 跨平台支持: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.txtfile2.txtfile3.txt 的差异,并在标准输出中显示。
  • 如果 file2.txtfile3.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 进行传输,用于安全传输文件。

常用示例

  1. 本地目录同步

    rsync -av /path/to/source/ /path/to/destination/
    

    这会将 /path/to/source/ 中的所有文件同步到 /path/to/destination/

  2. 通过 SSH 远程同步

    rsync -av -e ssh /path/to/source/ user@remote:/path/to/destination/
    

    将本地的 /path/to/source/ 目录同步到远程主机 user@remote/path/to/destination/ 目录。

  3. 仅传输差异文件

    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 是结束标记,可以是任意单词(如 ENDFINISH),但开头和结尾必须一致。
  • > :重定向符号,将输出写入文件。
  • file2:目标文件名,表示将输出写入 file2

使用示例

cat << EOF > file2
This is line 1
This is line 2
This is line 3
EOF

解释流程

  1. 命令开始后,Shell 会等待输入内容,直到遇到 EOF
  2. 输入的所有内容将被写入到 file2 中。
  3. 当遇到 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,你可以将一个较长的命令缩写为更短的自定义命令,方便使用。

基本用法

  1. 创建别名

    alias 别名='实际命令'
    

    例如,将 ls -la 创建一个别名 ll

    alias ll='ls -la'
    

    现在你可以只输入 ll 来执行 ls -la

  2. 查看当前别名: 不带任何参数使用 alias 会列出所有当前定义的别名:

    alias
    
  3. 删除别名: 使用 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 中,创建和删除用户可以通过 useradduserdel 命令来实现。

  1. 创建用户

使用 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 <用户名>

系统会提示输入并确认新用户的密码。

  1. 删除用户

使用 userdel 命令

userdel 命令用于删除用户,可以选择是否删除用户的主目录。

sudo userdel <用户名>

删除用户及其主目录

使用 -r 选项可以删除用户的主目录和所有文件:

sudo userdel -r <用户名>

注意事项

  • 权限:这些操作需要管理员权限,通常需要使用 sudo
  • 配置文件useradduserdel 会自动更新系统的用户配置文件(如 /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)用于管理和控制用户的权限。组的相关操作可以帮助管理员将用户组织成不同的组,以便管理文件权限和系统资源访问。

  1. 创建组

使用 groupadd 命令

groupadd 命令用于创建新组。

sudo groupadd <组名>

创建组并指定 GID

可以使用 -g 选项指定组 ID(GID),否则系统会自动分配一个唯一的 GID。

sudo groupadd -g 1001 <组名>
  1. 删除组

使用 groupdel 命令

groupdel 命令用于删除指定的组。

sudo groupdel <组名>
  1. 将用户添加到组

使用 usermod 命令

可以使用 usermod 命令将用户添加到一个或多个组:

sudo usermod -aG <组名> <用户名>
  • -aG-a 表示“追加”,即将用户添加到指定组而不删除其他组;-G 表示指定的组。

示例:将用户添加到多个组

sudo usermod -aG group1,group2,group3 username
  1. 将用户从组中移除

使用 gpasswd 命令

gpasswd 命令可以移除用户的组成员身份。

sudo gpasswd -d <用户名> <组名>

示例:从组中移除用户

sudo gpasswd -d username group1
  1. 列出用户所属的组

使用 groups 命令

可以使用 groups 命令查看用户所属的所有组:

groups <用户名>

如果不加用户名,groups 会显示当前用户所属的组。

使用 id 命令

id 命令也可以显示用户的 UID、GID 和所属的组:

id <用户名>
  1. 更改用户的主组

每个用户有一个主组,创建文件时默认归属于主组。可以使用 usermod 命令更改用户的主组。

sudo usermod -g <主组名> <用户名>
  1. 修改组名

使用 groupmod 命令

groupmod 命令可以用于修改现有组的名称或 GID。

sudo groupmod -n <新组名> <旧组名>

示例操作

  1. 创建一个名为 developers 的组

    sudo groupadd developers
    
  2. 将用户 alice 添加到 developers

    sudo usermod -aG developers alice
    
  3. 查看用户 alice 的所有组

    groups alice
    
  4. 删除 developers

    sudo groupdel developers
    

通过这些组管理命令,管理员可以更高效地管理用户的权限和访问控制。


12.5 环境变量

环境变量是存储在操作系统中的一些名称-值对,提供了应用程序或脚本可以访问的系统或用户配置信息。在 Linux 中,环境变量非常常用,特别是对于 shell 和脚本操作。下面是一些常见的环境变量:

  1. PATH
  • 定义:指定可执行文件的搜索路径。

  • 作用:当你在命令行中输入命令时,系统会在 PATH 定义的目录中搜索该命令。多个目录使用冒号 : 分隔。

  • 示例

    echo $PATH
    

    输出类似

    /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
    

    ,表示在这些路径中依次搜索命令。

  1. HOME
  • 定义:用户的主目录路径。

  • 作用:表示当前用户的主目录路径,用于指向存储用户文件和配置文件的目录。

  • 示例

    echo $HOME
    

    输出

    /home/username
    

    ,表示用户的主目录路径。

  1. USER
  • 定义:当前登录用户的用户名。

  • 作用:用于表示当前会话的用户名。

  • 示例

    echo $USER
    

    输出

    username
    

    ,表示当前用户的用户名。

  1. SHELL
  • 定义:当前用户使用的默认 shell。

  • 作用:指定用户会话中使用的 shell 解释器(例如 /bin/bash)。

  • 示例

    echo $SHELL
    

    输出

    /bin/bash
    

    /bin/zsh
    

    ,表示用户使用的默认 shell。

  1. PWD (print working directory)
  • 定义:当前工作目录。

  • 作用:表示当前终端所在的目录,等同于 pwd 命令的输出。

  • 示例:

    echo $PWD
    

    输出

    /home/username/projects
    

    ,表示当前的工作路径。

  1. LANG
  • 定义:系统的语言和区域设置。

  • 作用:指定系统的默认语言和编码,用于国际化支持。

  • 示例

    echo $LANG
    

    输出

    en_US.UTF-8
    

    ,表示系统语言为英语,美国地区,字符编码为 UTF-8。

  1. EDITOR
  • 定义:默认文本编辑器。

  • 作用:表示系统中的默认文本编辑器,用于编辑器相关操作(如 crontab -e 调用)。

  • 示例

    echo $EDITOR
    

    输出

    vim
    

    nano
    

    ,表示默认文本编辑器为 Vim 或 Nano。

  1. PS1
  • 定义:命令行提示符的格式。

  • 作用:定义 shell 提示符的外观和格式。

  • 示例

    echo $PS1
    

    通常输出包含

    \u
    

    (用户名)、

    \h
    

    (主机名)和

    \w
    

    (当前目录),如

    [\u@\h \w]$
    

  1. MAIL
  • 定义:用户的电子邮件存放位置。

  • 作用:指定当前用户的邮件收件箱文件路径。

  • 示例

    echo $MAIL
    

    输出

    /var/mail/username
    

    ,表示存放当前用户邮件的位置。

  1. HISTSIZEHISTFILESIZE
  • 定义

    :控制命令历史的大小。

    • 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 系统中,文件和目录的权限管理是至关重要的。chownchgrpchmod 是三个核心命令,分别用于更改文件的所有权、组以及权限。

  1. 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
    
  1. chgrp - 更改文件或目录的所属组

chgrp 用于更改文件或目录的组属性,适合只想更改组而不更改文件所有者的情况。

基本用法

sudo chgrp <新组> <文件或目录>

示例

  • 更改文件的组

    sudo chgrp newgroup file.txt
    

    file.txt 的组更改为 newgroup

  • 递归更改目录下所有文件和子目录的组

    sudo chgrp -R newgroup /path/to/directory
    
  1. chmod - 更改文件或目录的权限

chmod 用于更改文件或目录的访问权限。权限分为三种:所有者(User)、组(Group)、其他人(Others),分别对应读取(r)、写入(w)、执行(x)权限。

基本用法

chmod [选项] <权限> <文件或目录>

两种权限表示方法

  • 符号模式:使用 ugo 表示用户、组、其他人,+-= 表示添加、删除、赋值权限。

    • 示例:

      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 会从标准输入读取数据。

常用选项

  1. 按字母顺序排序(默认)

    sort file.txt
    

    默认情况下,sort 按字母顺序对文件内容排序。

  2. 按数字排序(-n

    sort -n file.txt
    

    -n 选项将内容按数字顺序排序。如果文件内容包含数值,这个选项非常有用。

  3. 逆序排序(-r

    sort -r file.txt
    

    -r 选项将内容按相反顺序(降序)排序。

  4. 按指定列排序(-k

    sort -k 2 file.txt
    

    -k 选项指定按第几列进行排序。例如,-k 2 表示按第二列排序。

  5. 忽略大小写排序(-f

    sort -f file.txt
    

    -f 选项忽略大小写进行排序,将大写字母与小写字母视为相同。

  6. 移除重复行(-u

    sort -u file.txt
    

    -u 选项去除排序后的重复行,保留唯一行(相当于先 sortuniq)。bash

  7. 随机排序(-R

    sort -R file.txt
    

    -R 选项将文件内容随机排序(仅部分系统支持)。

  8. 指定分隔符(-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 的作用是将 file1file2 中的内容进行合并、排序,并去除重复行,然后将结果写入到 file3 文件中。具体的分步解释如下:

  1. sort file1 file2
  • sort:对文件内容进行排序。
  • file1 file2sort 会将这两个文件的内容合并并进行排序,按字母顺序(默认)排列。
  1. | uniq
  • uniq:去除相邻的重复行,仅保留唯一的行。
  • |(管道) :将 sort 的输出传递给 uniq,去除重复行。
  1. > file3
  • > :将最终的去重排序结果重定向到 file3
  • file3:结果文件,如果 file3 已存在则会被覆盖,不存在则会被创建。

示例

假设 file1file2 内容如下:

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

pastejoin 是 Linux 中用于处理文本文件的命令,它们都可以将文件的内容合并在一起,但方式不同,适用于不同场景。

  1. paste 命令

paste 命令用于将多个文件的每一行内容合并在一起,生成一个新的文件,通常按列进行拼接。

基本用法

paste file1 file2

该命令会将 file1file2 中的每一行内容合并为一行,默认用制表符分隔。

常用选项

  • -d <分隔符> :指定分隔符,默认是制表符。可以使用其他分隔符,例如 -d "," 用逗号分隔。
  • -s:将文件内容按行合并(串联),而不是逐行拼接。

示例

假设 file1file2 内容如下:

file1

apple
banana
cherry

file2

1
2
3

执行 paste file1 file2 后输出为:

apple   1
banana  2
cherry  3
  1. join 命令

join 命令用于按共同字段(类似 SQL 中的 JOIN 操作)将两个文件合并。文件需要按要合并的字段排序,且默认为文件的第一列。

基本用法

join file1 file2

该命令会将 file1file2 中具有相同字段的行合并在一起。

常用选项

  • -1 <列号> :指定 file1 中要匹配的字段(默认是第 1 列)。
  • -2 <列号> :指定 file2 中要匹配的字段(默认是第 1 列)。
  • -t <分隔符> :指定字段分隔符(默认为空格或制表符)。
  • -o:自定义输出格式,可以指定显示哪些字段。

示例

假设 file1file2 内容如下:

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 中,正则表达式被广泛应用于命令行工具和文本处理,如 grepsedawkfind 等命令。了解如何在 Linux 中使用正则表达式可以大大提升文本处理和自动化的效率。

  1. 正则表达式的种类

在 Linux 中,正则表达式主要有两种:

  • 基础正则表达式(BRE,Basic Regular Expressions) :用于大多数 Linux 命令中,例如 grep(默认)。
  • 扩展正则表达式(ERE,Extended Regular Expressions) :支持更多的正则表达式特性,例如 +?|,通常在 grep -Eegrep 中使用。
  1. 基本正则表达式符号
  • 普通字符:例如 abc 匹配字符串 "abc"。

  • . :匹配任意单个字符(换行符除外)。

  • [] 字符集

    :匹配括号内任意一个字符。

    • [aeiou] 匹配任一元音字母。
    • [a-z] 匹配小写字母。
    • [0-9] 匹配数字。
  • ^ :匹配字符串的开头。

  • $ :匹配字符串的结尾。

  • ``:用于转义特殊字符。

  1. 常用量词

在扩展正则表达式(ERE)中,量词表示字符重复的次数:

  • * :匹配前一个字符 0 次或多次。
  • + :匹配前一个字符 1 次或多次(ERE 中使用)。
  • ? :匹配前一个字符 0 次或 1 次。
  • {n} :匹配前一个字符 n 次。
  • {n,m} :匹配前一个字符 nm 次。
  1. 特殊字符
  • \d:匹配数字,等同于 [0-9]
  • \w:匹配单词字符(字母、数字、下划线)。
  • \s:匹配空白字符(空格、制表符等)。
  1. 常用命令及示例
  2. grep:文本搜索工具
  • 基本用法

    grep "正则表达式" 文件名
    
  • 查找包含数字的行

    grep '[0-9]' filename
    
  • 匹配以特定字符开头的行

    grep '^a' filename  # 匹配以 'a' 开头的行
    
  • 匹配以特定字符结尾的行

    grep 'z$' filename  # 匹配以 'z' 结尾的行
    
  1. sed:流编辑器

sed 可用于替换和处理文本内容。

  • 替换某个模式

    sed 's/正则表达式/替换文本/g' filename
    
  • 删除包含特定模式的行

    sed '/^$/d' filename  # 删除空行
    
  • 从文件中提取电子邮件地址

    grep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}" filename
    
  1. awk:强大的文本处理工具

awk 可使用正则表达式处理字段和行。

  • 查找包含某个模式的行

    awk '/pattern/ { print $0 }' filename
    
  • 过滤并处理特定字段

    awk '/[0-9]/ { print $1, $3 }' filename  # 输出包含数字的行的第 1 和第 3
  1. 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

常用选项

  1. 查询特定类型的记录 使用 -t 选项可以查询特定类型的 DNS 记录,比如 AMXCNAME 等。

    host -t A <域名>     # 查询 A 记录(IPv4 地址)
    host -t AAAA <域名>  # 查询 AAAA 记录(IPv6 地址)
    host -t MX <域名>    # 查询邮件交换记录
    host -t CNAME <域名> # 查询 CNAME 记录
    
  2. 指定 DNS 服务器 使用 host 命令时可以指定要使用的 DNS 服务器:

    host <域名> <DNS服务器IP>
    

    例如:

    host google.com 8.8.8.8
    

    这里会使用 Google 的公共 DNS 服务器(8.8.8.8)进行查询。

  3. 反向查询 IP 地址 反向查询 IP 地址对应的域名可以用:

    host <IP地址>
    

    例如:

    host 8.8.8.8
    

    输出类似:

    8.8.8.8.in-addr.arpa domain name pointer dns.google.
    
  4. 查询 NS 记录 NS 记录指定了域名的权威 DNS 服务器。可以使用以下命令查询:

    host -t NS <域名>
    
  5. 查询 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)。

常用选项

  1. 指定数据包发送数量 (-c) 发送指定数量的数据包后停止。例如,发送 5 个数据包:

    ping -c 5 google.com
    
  2. 设置发送间隔时间 (-i) 控制每个数据包发送之间的时间间隔(单位为秒)。例如,设置 2 秒的发送间隔:

    ping -i 2 google.com
    
  3. 设置数据包大小 (-s) 指定发送的数据包大小(以字节为单位)。例如,发送 100 字节的数据包:

    ping -s 100 google.com
    
  4. 指定存活时间 (TTL) (-t-m,不同系统略有不同) TTL 限制数据包经过的最大跳数。例如,设置 TTL 为 5:

    ping -t 5 google.com   # Linux
    ping -m 5 google.com   # macOS
    
  5. 启用无声模式(仅输出统计信息) (-q) 只显示开始和结束的统计信息,适合快速测试连通性:

    ping -q google.com
    
  6. 增加响应速度的详细信息 (-v) 显示更详细的调试信息,适用于需要更多诊断数据的情况:

    ping -v google.com
    

解释输出信息

  • icmp_seq:数据包序号,用于检测数据包丢失和顺序。
  • ttl:生存时间(Time To Live),表示数据包允许经过的最大跳数。
  • time:往返时间(Round-Trip Time),显示从发送到返回的时间(单位为毫秒)。

常见用途

  • 检测网络连通性:通过 ping 测试本地主机、网关和远程服务器的连通性。
  • 检测网络延迟:观察 time 值来查看往返时间(RTT),有助于评估网络速度和响应时间。
  • 检测数据包丢失:查看统计信息中的数据包丢失情况来判断网络是否稳定。
  • 追踪路径问题:结合 pingtraceroute 可帮助识别网络中断的位置。

14.3 route / ip route

route 是一个用于显示和管理 Linux 系统中的网络路由表的命令,帮助用户查看和配置数据包的路由路径。通过 route 命令,可以定义哪些 IP 地址走哪条网络路径,比如通过哪个网关或接口发送数据。下面是 route 命令的基本用法和常用选项。

基本用法

  1. 显示当前路由表

    route
    

    或者使用:

    route -n
    

    -n 选项使 IP 地址直接以数字形式显示,而不是尝试解析成域名,从而提高显示速度。

    输出通常包含以下字段:

    • Destination:目标网络或 IP。
    • Gateway:下一跳网关地址。
    • Genmask:子网掩码。
    • Flags:标志,表示路由项的状态(如 U 表示有效、G 表示网关等)。
    • Iface:使用的网络接口(如 eth0、wlan0)。
  2. 添加默认网关

    sudo route add default gw <网关IP地址>
    

    例如:

    sudo route add default gw 192.168.1.1
    

    该命令会将默认网关设置为 192.168.1.1,即没有其他匹配的情况下,数据包都会通过这个网关发送。

  3. 添加静态路由

    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 接口。

  4. 删除路由

    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:指定路由所使用的网络接口。

示例

  1. 查看路由表

    route -n
    
  2. 添加到特定网络的静态路由

    sudo route add -net 10.10.10.0 netmask 255.255.255.0 gw 192.168.1.1 dev eth0
    
  3. 设置默认网关

    sudo route add default gw 192.168.1.254
    
  4. 删除到特定网络的静态路由

    sudo route del -net 10.10.10.0 netmask 255.255.255.0
    

ip route 是 Linux 系统中的一个命令,用于显示和管理 IP 路由表。与较旧的 route 命令相比,ip routeip 命令集的一部分,功能更加强大,并且在现代 Linux 系统中更常用。ip route 可以帮助用户定义数据包的传输路径,包括添加、删除或修改路由,以及查看当前的路由配置。

基本用法

  1. 查看当前路由表

    bash
    
    
    复制代码
    ip route
    

    输出的内容通常包含以下字段:

    • default via:默认网关。
    • dev:用于路由的网络接口(例如 eth0、wlan0 等)。
    • proto:协议类型,例如 kernel 表示系统配置的内核默认路由。
    • src:源 IP 地址。
    • metric:路由优先级,数字越小优先级越高。
  2. 添加默认网关

    sudo ip route add default via <网关IP地址> dev <接口>
    

    例如:

    sudo ip route add default via 192.168.1.1 dev eth0
    

    这条命令将 192.168.1.1 设置为默认网关,数据包在没有特定路由时都会通过此网关发送。

  3. 添加静态路由

    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 接口。

  4. 删除路由

    sudo ip route del <目标网络>/<子网掩码>
    

    例如:

    sudo ip route del 10.10.10.0/24
    

    此命令删除到 10.10.10.0/24 网络的路由。

  5. 修改现有路由 修改一条现有路由可以用 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:用于高级路由,指定路由表的编号。

示例

  1. 查看所有路由

    ip route
    
  2. 添加到特定网络的路由

    sudo ip route add 192.168.2.0/24 via 192.168.1.1 dev eth0
    
  3. 添加默认路由

    sudo ip route add default via 192.168.1.254
    
  4. 删除到特定网络的路由

    sudo ip route del 192.168.2.0/24
    

ip routeroute 的区别

  • 功能更强大ip route 支持更复杂的配置,如多路由表、策略路由等。
  • 语法更统一ip 命令集包括了路由、地址和链路管理等网络相关的所有功能,比传统命令更加一致。
  • 性能更好ip 命令在处理大型路由表时更加高效。

14.4 traceroute

traceroute 是一个网络诊断工具,用于追踪数据包从源地址到目标地址的路径,并显示数据包经过的每一跳(即每个中间路由器或节点)。通过 traceroute 可以了解数据在网络中的传输路径、各节点的响应时间,以及识别是否存在网络瓶颈或连接问题。

工作原理

  1. traceroute 利用 ICMP(Internet Control Message Protocol)UDP(User Datagram Protocol) 数据包,通过逐步增加 TTL(Time To Live) 值来发送数据包。

    • 每个数据包的 TTL 表示数据包可以经过的最大跳数,默认从 1 开始,并逐渐递增。
    • 每经过一跳,TTL 会减少 1,当 TTL 为 0 时,路由器会丢弃该数据包并返回一个“超时”消息。
    • 这样,traceroute 可以依次识别经过的每个节点并记录响应时间。
  2. 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 地址,以及到达该路由器的延迟时间(单位为毫秒)。

常用选项

  1. -n:以数字形式显示 IP 地址,避免解析为域名,提高查询速度。

    traceroute -n google.com
    
  2. -m:设置最大跳数(TTL)。默认值为 30,设置更高的跳数以防止路径过长被中断。

    traceroute -m 50 google.com
    
  3. -w:设置等待时间(超时时间)。单位为秒,指定每一跳的响应超时。

    traceroute -w 2 google.com
    
  4. -I:使用 ICMP 进行 traceroute,而非默认的 UDP。ICMP 比较适合用于网络诊断。

    traceroute -I google.com
    
  5. -p:指定发送数据包的端口号(默认是 33434),适用于 UDP 数据包方式。

    traceroute -p 33435 google.com
    
  6. -q:设置每一跳发送数据包的数量(默认是 3)。

    traceroute -q 1 google.com
    

分析 traceroute 输出

  • 每一行代表一个网络中的路由节点(或“跳”),从源头到目标的顺序排列。
  • 响应时间:每一跳会显示多次响应时间,通常 3 次。它表示数据包到该节点的往返时间。
  • * * * :表示该节点未返回响应,这可能是因为防火墙或该节点配置不允许 ICMP 数据包通过。
  • 网络瓶颈:如果某一跳的延迟显著增加,可能表明该节点或其连接存在问题。

应用场景

  • 检测网络延迟:识别哪些节点导致网络延迟,通常用于网络优化。
  • 排查网络故障:定位网络连接中断的节点或区域,帮助确定网络故障位置。
  • 网络路径分析:了解从源地址到目标地址的数据路径,可以用于网络安全和流量优化。

注意事项

  • 某些路由器或节点会丢弃 ICMP 或 UDP 数据包,因此 traceroute 输出可能会出现星号(*),不一定代表网络故障。
  • 某些防火墙或安全配置会阻止 traceroute 工作。

14.5 ethtool

ethtool 是 Linux 系统中的一个命令行工具,用于查看和配置网络接口的各种参数,特别是以太网设备(Ethernet devices)。通过 ethtool,可以检查网卡的状态、调整网卡的特性(如速率、双工模式)、启用或禁用自动协商、监控网卡错误统计等。它在网络配置和调试中非常有用。

ethtool 的基本功能

  1. 查看网卡信息

    使用 ethtool 加上网络接口名称,可以查看网卡的详细信息,例如速率、双工模式、自动协商状态等。

    ethtool <接口名称>
    

    例如:

    ethtool eth0
    

    典型输出包括以下内容:

    • Supported ports:支持的端口类型(如 Twisted Pair、Fiber)。
    • Speed:当前网卡的速率(如 10Mbps、100Mbps、1Gbps)。
    • Duplex:双工模式(Full 表示全双工,Half 表示半双工)。
    • Auto-negotiation:自动协商状态(on/off)。
    • Link detected:是否检测到物理链路。
  2. 设置网卡速度和双工模式

    可以手动设置网卡的速率、双工模式和自动协商状态。例如:

    sudo ethtool -s eth0 speed 100 duplex full autoneg off
    

    该命令将 eth0 设置为 100Mbps 全双工,并关闭自动协商。

  3. 启用或禁用自动协商

    自动协商是网络设备之间自动选择最佳连接模式的过程。可以通过以下命令开启或关闭自动协商:

    sudo ethtool -s eth0 autoneg on
    sudo ethtool -s eth0 autoneg off
    
  4. 查看和清除网卡统计信息

    使用 -S 选项可以查看网卡的详细统计信息(如接收和发送的数据包数量、错误数量等),用于监控网络性能和排查问题:

    ethtool -S eth0
    
  5. 更改网卡的接收(RX)和发送(TX)缓冲区大小

    在网络流量较大的环境下,增加网卡的缓冲区大小可以提高性能。

    sudo ethtool -G eth0 rx 512 tx 512
    
  6. 设置和查看网卡的 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
    
  7. 测试网卡功能

    某些网卡支持通过 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:使用的网络接口(例如 eth0wlan0 等),表示数据包通过的接口。

示例

运行以下命令:

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

常用选项

  1. 下载到指定文件夹或文件名 使用 -O 选项指定下载文件的保存路径或名称。

    wget -O /path/to/folder/filename.zip https://example.com/file.zip
    
  2. 断点续传 使用 -c 选项支持从上次中断的地方继续下载。

    wget -c https://example.com/file.zip
    
  3. 递归下载 使用 -r 选项启用递归下载,通常用于下载整个网站或目录。

    wget -r https://example.com/
    
    • -l 设置递归的深度。例如 -l 2 表示递归两层。
    • 使用 -np 防止下载父目录(只下载指定目录及其子目录)。
  4. 后台下载 使用 -b 选项将下载任务放在后台运行,适用于大型文件。

    wget -b https://example.com/file.zip
    
  5. 限制下载速度 使用 --limit-rate 选项限制下载速度,例如 100K(每秒 100KB)。

    wget --limit-rate=100k https://example.com/file.zip
    
  6. 下载多个文件 可以将多个 URL 放在一个文本文件中,然后使用 -i 选项读取文件下载。

    wget -i urls.txt
    

    其中 urls.txt 文件中包含多个下载链接,每行一个 URL。

  7. 指定用户代理 使用 --user-agent 选项指定用户代理,模拟不同的浏览器。

    wget --user-agent="Mozilla/5.0" https://example.com/file.zip
    
  8. 跳过 SSL 证书验证 有些网站的 SSL 证书可能不被信任,用 --no-check-certificate 可以跳过验证。

    wget --no-check-certificate https://example.com/file.zip
    
  9. 指定用户名和密码 如果下载需要认证,可以用 --user--password 选项指定用户名和密码。

    wget --user=username --password=password https://example.com/protected-file.zip
    

示例

  1. 下载文件并保存为指定名称

    wget -O myfile.zip https://example.com/file.zip
    
  2. 断点续传下载

    wget -c https://example.com/large-file.zip
    
  3. 下载整个网站

    wget -r -l 2 -np https://example.com/
    
  4. 后台下载文件

    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

常用选项

  1. 下载文件 使用 -O 选项将文件保存为原始文件名,或使用 -o 指定保存文件名。

    curl -O https://example.com/file.zip
    curl -o myfile.zip https://example.com/file.zip
    
  2. 发送 GET 请求 默认情况下,curl <URL> 就是发送 GET 请求,用于获取数据。

  3. 发送 POST 请求 使用 -X POST 指定请求方法,使用 -d 选项传递数据。

    curl -X POST -d "param1=value1&param2=value2" https://example.com/api
    

    如果要发送 JSON 格式数据,需设置请求头为 application/json

    curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' https://example.com/api
    
  4. 添加请求头 使用 -H 添加自定义请求头(例如模拟浏览器或设置 API token)。

    curl -H "User-Agent: Mozilla/5.0" https://example.com
    curl -H "Authorization: Bearer <token>" https://example.com/api
    
  5. 显示响应头 使用 -I 选项仅显示响应头信息。

    curl -I https://example.com
    
  6. 查看详细信息 使用 -v 选项显示请求和响应的详细信息,用于调试。

    curl -v https://example.com
    
  7. 保存响应内容 使用 -o 将响应内容保存到指定文件中。

    curl -o response.html https://example.com
    
  8. 自动跟随重定向 使用 -L 选项自动跟随 3xx 重定向。

    curl -L https://example.com
    
  9. 上传文件 使用 -F 选项上传文件,适合文件上传接口。

    curl -X POST -F "file=@/path/to/file" https://example.com/upload
    
  10. 指定请求超时时间 使用 --connect-timeout-m 设置连接和总请求超时(单位为秒)。

    curl --connect-timeout 10 -m 30 https://example.com
    

示例

  1. 下载文件并重命名

    curl -o myfile.zip https://example.com/file.zip
    
  2. 发送 JSON 数据的 POST 请求

    curl -X POST -H "Content-Type: application/json" -d '{"name":"John", "age":30}' https://example.com/api
    
  3. 上传文件

    curl -X POST -F "file=@/path/to/myfile.zip" https://example.com/upload
    
  4. 带自定义请求头的 GET 请求

    curl -H "Authorization: Bearer mytoken123" https://example.com/api
    
  5. 查看网站的 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

常用选项

  1. 指定端口 (-p) SSH 默认使用端口 22,但如果服务器在其他端口提供 SSH 服务,可以用 -p 指定端口。

    ssh -p 2222 username@example.com
    
  2. 执行远程命令 可以在 SSH 会话中直接执行特定命令,然后退出会话。例如:

    ssh username@example.com "ls /var/www"
    

    这会在远程主机上列出 /var/www 目录的内容,然后断开连接。

  3. 代理转发 (-A) 启用 SSH 代理转发,允许在远程主机上使用本地主机的身份验证代理。适用于多跳 SSH 登录。

    ssh -A username@example.com
    
  4. X11 转发 (-X) 启用 X11 图形界面转发,允许在本地显示远程图形应用程序的界面(如果服务器和客户端都支持 X11)。

    ssh -X username@example.com
    
  5. 保持连接 (-o ServerAliveInterval) 避免连接超时,设置服务器保持活动消息的间隔(单位为秒)。例如:

    ssh -o ServerAliveInterval=60 username@example.com
    
  6. 使用指定的密钥文件 (-i) 如果使用非默认的 SSH 密钥文件,可以通过 -i 指定密钥文件路径。

    ssh -i ~/.ssh/custom_key username@example.com
    

SSH 密钥认证

SSH 支持通过密钥进行无密码认证。生成 SSH 密钥对后,可以将公钥上传到服务器,这样在登录时无需输入密码。

  1. 生成 SSH 密钥对 使用 ssh-keygen 命令生成密钥对,默认存储在 ~/.ssh/ 目录中。

    ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
    
  2. 将公钥复制到服务器 使用 ssh-copy-id 将公钥传输到远程主机,配置无密码登录。

    ssh-copy-id username@example.com
    
  3. 测试 SSH 连接 之后可以直接使用 ssh username@example.com 登录,无需输入密码。

SSH 端口转发

SSH 支持端口转发(端口隧道),用于加密其他网络服务的流量。

  1. 本地端口转发 (-L) 将本地机器的一个端口映射到远程服务器的指定端口,例如将本地 8080 端口转发到远程服务器的 80 端口:

    ssh -L 8080:localhost:80 username@example.com
    

    这样,本地访问 localhost:8080 时会被转发到远程服务器的 80 端口。

  2. 远程端口转发 (-R) 将远程服务器的一个端口转发到本地,例如将远程服务器的 9090 端口转发到本地 3000 端口:

    ssh -R 9090:localhost:3000 username@example.com
    
  3. 动态端口转发 (-D) 使用动态转发创建一个 SOCKS 代理,例如将本地的 1080 端口作为代理端口,适用于匿名浏览:

    ssh -D 1080 username@example.com
    

应用场景

  • 远程服务器管理:通过 SSH 登录服务器,进行文件操作、服务管理等。
  • 加密文件传输:通过 scp(基于 SSH 的命令)在本地和远程主机之间传输文件。
  • 端口转发:通过 SSH 隧道加密其他服务的流量,保障数据安全。
  • 自动化任务:结合 SSH 和脚本,可以实现远程服务器的批量管理。

SSH 是一种安全、强大的工具,可以通过加密网络连接来管理远程服务器,广泛应用于服务器管理和运维场景。