linux教程

本文最后更新于:2024年11月21日 晚上

linux教程

正则表达式

终端 Terminal

mobxterm

xshell

作业控制

在 Linux 终端中使用作业控制时:

  • 使用 ctrl-z 可以将当前正在前台运行的进程暂停(挂起)。
  • 使用 fg %1(或 fg 1)命令可以将编号为 1 的作业恢复到前台继续执行。
  • 使用 jobs 命令可以列出当前在后台运行的所有作业及其作业号和状态。

script

终端复用tmux

Tmux(Terminal Multiplexer)是一款终端复用软件,可以让你在一个终端窗口中运行多个终端会话。以下是一些常用的 tmux 组合键命令:

会话管理

  • 启动 tmux 会话: tmux
  • 新建会话: tmux new -s <session-name>
  • 列出会话: tmux ls
  • 连接到会话: tmux attach -t <session-name>
  • 分离会话: Ctrl-b d
  • 选择会话分离: `Ctrl-b Shift-,可以解决【Tmux】窗口周围出现大量点点导致窗口面积减小的问题
  • 杀掉会话: tmux kill-session -t <session-name>

窗口管理

  • 新建窗口: Ctrl-b c
  • 切换窗口: Ctrl-b n (下一个窗口), Ctrl-b p (上一个窗口), Ctrl-b 0 (切换到窗口0),Ctrl-b 1 (切换到窗口1)
  • 选择窗口: Ctrl-b <window-number>
  • 重命名窗口: Ctrl-b ,
  • 关闭窗口: Ctrl-b &
  • 列出所有窗口: Ctrl-b w,使用箭头键选择目标窗口,按回车键切换到选定的窗口。

面板管理

  • 水平分割面板: Ctrl-b "
  • 垂直分割面板: Ctrl-b %
  • 切换面板: Ctrl-b o
  • 选择面板: Ctrl-b q 然后按面板编号
  • 面板之间进行切换: Ctrl-b <方向键>
  • 交换面板位置: Ctrl-b {(向左),Ctrl-b }(向右)
  • 杀掉面板: Ctrl-b x
  • 拆分面板成独立窗口: Ctrl+b !
  • 全屏化当前面板: Ctrl-b z
  • 恢复面板原始大小: 再次按 Ctrl-b z
  • 调整面板大小: Ctrl-b 后加上 Alt 键和方向键可以调整面板的大小。
  • 自动平衡面板: Ctrl-b 后加上 Space 键自动平衡所有面板大小。

滚动与复制模式

  • 进入复制模式: Ctrl-b [
  • 退出复制模式: q
  • 开始选择文本: Space
  • 复制选中文本: Enter
  • 粘贴文本: Ctrl-b ]
在tmux缓冲区中搜索
复制模式搜索

要在tmux历史记录缓冲区中搜索当前窗口,请按Ctrl- b [进入copy mode。

如果您正在使用emacs键绑定(默认设置),请按Ctrl- s然后输入要搜索的字符串,然后按Enter。按n再次搜索相同的字符串。按Shift- n进行反向搜索。按Escape两次退出copy mode。您可以使用Ctrl- r反向搜索。

请注意,由于tmux可以控制键盘copy mode,所以Ctrl- s不管stty ixon设置如何(我希望stty -ixon在Bash中启用向前搜索)都可以使用-。

如果您使用的是vi键绑定(Ctrl- b:set-window-option -g mode-keys vi),请按,/然后键入要搜索的字符串,然后按Enter。按n再次搜索相同的字符串。与emacs模式一样,按Shift- n进行反向搜索。按q两次退出copy mode。您可以使用?反向搜索。

查找窗口

如果要基于其中显示的内容(也包括窗口名称和标题但不包括历史记录)切换到窗口,(从打开多个窗口开始)请按Ctrl- b f然后键入要搜索的字符串,然后按Enter。如果找到该文本,您将切换到包含该文本的窗口。如果有多个窗口匹配,您将看到一个列表可供选择。

选择会话进行分离

此功能特别适用于当你在多个会话中工作,并且希望快速分离某个特定会话,而不必使用 Ctrl-b d 分离当前会话或手动输入会话名称。

tmux 嵌套使用

当你在本地使用 tmux 登录远程服务器时,如果服务器上也运行了 tmux,常见的问题是:tmux 的指令会被外层会话窗口(本地的 tmux)捕获,导致无法控制服务器上运行的 tmux。比如,当你想通过 Ctrl+b, d 退出服务器上的会话时,结果却退出了本地的 tmux 连接,非常令人沮丧。

解决这个问题的方法其实很简单:按住 Ctrl 键,然后快速按两次 b 键,这样发出的 tmux 指令就会发送到内层会话,也就是服务器上的 tmux,从而实现你想要的操作。

举例

  1. 你在本地机器上运行了一个 tmux 会话,并通过 SSH 登录到远程服务器。
  2. 在远程服务器上,你启动了另一个 tmux 会话。
  3. 想要从远程 tmux 会话中退出时,不要直接使用 Ctrl+b, d,而是按住 Ctrl,快速按两次 b 键,然后按 d 键。
  4. 这个操作将使你从远程会话中退出,而本地的 tmux 会话不会受到影响。

其他常用命令

  • 重新加载 tmux 配置: Ctrl-b :source-file ~/.tmux.conf
  • 显示时间: Ctrl-b t
  • 刷新屏幕: Ctrl-b r

这些是 tmux 中一些常见的组合键命令,使用这些命令可以大大提高终端操作的效率。你可以通过编辑 ~/.tmux.conf 文件来自定义这些快捷键。

自动退出

  1. 删除 tmux 中的 TMOUT 变量

检查 tmux 的全局环境中是否存在 TMOUT:

1
tmux showenv -g | grep TMOUT

使用以下命令删除该环境变量:

1
tmux setenv -ug TMOUT

xterm

在 Linux 系统上安装 xterm 终端仿真器,并使用 resize 命令调整 tmux 会话窗口的大小,可以按照以下步骤进行操作:

安装 xterm
  1. 打开终端并输入以下命令以使用 dnf 包管理器安装 xterm

    1
    sudo dnf install xterm
  2. 使用 resize 命令调整窗口大小:

    1
    resize

history

shell

父子shell

set

环境变量

忽略大小写

数组

test

重定向、后台运行

Bash 常用快捷键总结

控制相关命令

  • Ctrl+L:清屏。
  • Ctrl+C:终止前台程序。
  • Ctrl+\:终止前台程序(与 Ctrl+C 类似)。
  • Ctrl+Z:将当前进程挂起并切换到后台。

编辑相关命令

  • Tab:命令补齐。
  • Ctrl+A:光标移到行首。
  • Ctrl+E:光标移到行尾。
  • Ctrl+F:光标前进。
  • Ctrl+B:光标后退。
  • Ctrl+XX:光标在当前位置和行首之间切换。
  • Ctrl+U:删除光标之前的所有内容。
  • Ctrl+K:删除光标之后的所有内容。
  • Ctrl+H:删除光标处前一个字符。
  • Ctrl+D:删除当前光标所在字符。
  • Ctrl+W:删除光标前的单词。
  • Ctrl+Y:粘贴 Ctrl+KCtrl+W 删除的内容。
  • Alt+.Esc+.:粘贴上一条命令的最后一个参数。

!相关命令

  • !!:快速执行上一条命令。
  • !+字符串:执行最近使用过的以指定字符串开头的命令(如 !p 执行 ping 命令)。

历史命令

  • Ctrl+P:历史中上一条命令(与方向键↑作用一样)。
  • Ctrl+N:历史中下一条命令(与方向键↓作用一样)。
  • Ctrl+R:查找历史命令中的关键词。

python

ubuntu16.04中将python3设置为默认

直接执行这两个命令即可:

1
2
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 100
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 150

切换到Python2,执行:

1
sudo update-alternatives --config python

时间

时间协议

登录

日志

随机数

硬件信息

lshw

dmidecode

lstopo

进程

lsof

使用-c查看指定的命令正在使用的文件和网络连接:

1
2
3
4
5
6
7
lsof -c syslog-ng

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
syslog-ng 7547 root cwd DIR 3,3 4096 2 /
syslog-ng 7547 root rtd DIR 3,3 4096 2 /
syslog-ng 7547 root txt REG 3,3 113524 1064970 /usr/sbin/syslog-ng
-- snipped --

使用-p查看指定进程ID已打开的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
lsof -p 10075

-- snipped --
sshd 10068 root mem REG 3,3 34808 850407 /lib/libnss_files-2.4.so
sshd 10068 root mem REG 3,3 34924 850409 /lib/libnss_nis-2.4.so
sshd 10068 root mem REG 3,3 26596 850405 /lib/libnss_compat-2.4.so
sshd 10068 root mem REG 3,3 200152 509940 /usr/lib/libssl.so.0.9.7
sshd 10068 root mem REG 3,3 46216 510014 /usr/lib/liblber-2.3
sshd 10068 root mem REG 3,3 59868 850413 /lib/libresolv-2.4.so
sshd 10068 root mem REG 3,3 1197180 850396 /lib/libc-2.4.so
sshd 10068 root mem REG 3,3 22168 850398 /lib/libcrypt-2.4.so
sshd 10068 root mem REG 3,3 72784 850404 /lib/libnsl-2.4.so
sshd 10068 root mem REG 3,3 70632 850417 /lib/libz.so.1.2.3
sshd 10068 root mem REG 3,3 9992 850416 /lib/libutil-2.4.so
-- snipped --

-t选项只返回PID:

1
2
3
lsof -t -c Mail

350

同时使用-t和-c选项以给进程发送 HUP 信号:

1
kill -HUP `lsof -t -c sshd`

查找进程

进程与信号

杀死进程

lsof

使用-u显示指定用户打开了什么:

1
2
3
4
5
6
7
8
9
lsof -u daniel

-- snipped --
Dock 155 daniel txt REG 14,2 2798436 823208 /usr/lib/libicucore.A.dylib
Dock 155 daniel txt REG 14,2 1580212 823126 /usr/lib/libobjc.A.dylib
Dock 155 daniel txt REG 14,2 2934184 823498 /usr/lib/libstdc++.6.0.4.dylib
Dock 155 daniel txt REG 14,2 132008 823505 /usr/lib/libgcc_s.1.dylib
Dock 155 daniel txt REG 14,2 212160 823214 /usr/lib/libauto.dylib
-- snipped --

使用-u user来显示除指定用户以外的其它所有用户所做的事情:

1
2
3
4
5
6
7
8
9
lsof -u ^daniel

-- snipped --
Dock 155 jim txt REG 14,2 2798436 823208 /usr/lib/libicucore.A.dylib
Dock 155 jim txt REG 14,2 1580212 823126 /usr/lib/libobjc.A.dylib
Dock 155 jim txt REG 14,2 2934184 823498 /usr/lib/libstdc++.6.0.4.dylib
Dock 155 jim txt REG 14,2 132008 823505 /usr/lib/libgcc_s.1.dylib
Dock 155 jim txt REG 14,2 212160 823214 /usr/lib/libauto.dylib
-- snipped --

杀死指定用户所做的一切事情:

1
kill -9 `lsof -t -u daniel`

查看进程启动位置

列出某一CPU上跑的所有进程

系统状态

top

top主要快捷键

  • 全局命令
    • Z:切换颜色模式。
    • B:切换粗体文本。
    • E / e:切换内存缩放。
  • 摘要切换
    • l:显示负载平均值。
    • t:显示任务/CPU 统计。
    • m:显示内存信息。
  • 视图切换
    • 0:显示零值。
    • 1, 2, 3:切换 CPU/NUMA 节点视图。
    • I:切换 Irix 模式。
  • 字段管理与排序
    • M:按内存使用量排序。
    • P:按 CPU 使用量排序。
    • T:按时间/累积时间排序。
    新增 PSR 字段查看每个进程当前运行的 CPU 核心
    • f:进入字段管理模式。
    • 使用上下箭头键查找 PSR 字段(表示处理器)。
    • 选中 PSR 字段后,按 空格键d 将其标记为显示。
    • qEsc 退出字段管理界面,返回主界面。
    PSR 移动到PID字段前面
    • 按下 f 键进入字段管理界面。
    • 使用 上下箭头键 找到 PSR 字段(Processor),然后按 空格键d 键将其启用。
    • 接着按 右箭头键 PSR 选中,这会准备将 PSR 字段移动位置。
    • 使用 向上箭头键 PSR 字段移到列表的最上方位置(或其他你想要的位置)。
    • 移动完毕后,按 左箭头键 Enter 键确认位置。
    • 最后,按 qEsc 键返回 top 主界面。
    PSR 排序
    • 进入 top 后,按下f 键进入字段管理。
    • 使用方向键 移动选择 PSR 字段。
    • 按下 s 键将 PSR 字段设为排序字段。此时,进程会默认按 PSR 升序排序。
    • 若发现是降序排列,按下 R(Shift + r)键可以反转排序顺序,使之变为升序。
    • 确认后按 qEsc 退出设置界面返回 top 界面,即可看到进程按 PSR 升序排列。
  • 定位与排序
    • L / &:查找/再次查找。
    • < / >:移动排序列(左/右)(如按下P后按cpu使用率排序,按下>后可以移动到内存使用率排序)。
    • H:切换线程显示。
    • J:数字字段对齐。
    • C:显示坐标。
  • 过滤与操作
    • o:添加过滤条件(如 COMMAND=[可用来过滤内核线程)。
    • 再次按 o:添加更多过滤条件(如 COMMAND=/可用来进一步过滤pre cpu内核线程)。
    • u:按用户过滤。
    • =:清除所有过滤条件。
    • k:结束任务。
    • r:调整任务优先级(renice)。
  • 显示选项
    • c:显示命令名称/行。
    • i:显示空闲任务。
    • S:显示时间。
    • j:字符串字段对齐。
    • x:排序字段高亮。
    • y:运行任务高亮。
    • z:切换颜色/单色显示。
    • b:切换粗体/反转文本。
  • 视图模式
    • V:切换森林视图,显示树状进程父子关系、线程父子关系,类似pstree。先按H显示线程,再按V切换到森林视图。
    • v:隐藏/显示森林视图子项。
  • 配置与输出
    • ds:设置更新间隔(秒)。
    • W:保存配置。
    • Y:检查其他输出。
  • 退出
    • q:退出 top

这些操作帮助你高效地使用 top 进行系统监控、排序和进程管理。

根据你提供的 top 命令输出信息,这里是每个部分的解释:

top 命令输出解析

  • 任务统计
    • Tasks: 767 total:系统中总共有 767 个任务。
    • 1 running:当前有 1 个任务正在运行。
    • 766 sleeping:当前有 766 个任务在休眠状态。
    • 0 stopped:没有任务被停止。
    • 0 zombie:没有僵尸进程。
  • CPU 使用情况
    • %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
      • 0.0 us:用户空间 CPU 使用百分比。
      • 0.0 sy:系统空间 CPU 使用百分比。
      • 0.0 ni:用户空间内的优先级 CPU 使用百分比。
      • 100.0 id:空闲 CPU 百分比。
      • 0.0 wa:等待 I/O 操作的 CPU 百分比。
      • 0.0 hi:硬件中断 CPU 使用百分比。
      • 0.0 si:软件中断 CPU 使用百分比。
      • 0.0 st:虚拟机偷取的 CPU 百分比。
  • 内存使用情况
    • MiB Mem : 32147.1 total:总内存 32147.1 MiB。
    • 26527.6 free:可用内存 26527.6 MiB。
    • 648.0 used:已使用内存 648.0 MiB。
    • 4971.5 buff/cache:缓冲区和缓存占用的内存 4971.5 MiB。
  • 交换区使用情况
    • MiB Swap: 16144.0 total:总交换区 16144.0 MiB。
    • 16144.0 free:可用交换区 16144.0 MiB。
    • 0.0 used:已使用交换区 0.0 MiB。
    • 30980.1 avail Mem:可用内存 30980.1 MiB。
  • 进程列表
    • PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND:进程的详细信息,包括 PID、用户、优先级、虚拟内存、常驻内存、共享内存、状态、CPU 使用百分比、内存使用百分比、运行时间和命令。
    示例进程:
    • 275 root rt 0 0 0 0 S 0.0 0.0 0:01.31 migration/53
      • PID:275
      • USER:root
      • PR:实时优先级(rt)
      • NI:优先级(0)
      • VIRT:虚拟内存(0 KB)
      • RES:常驻内存(0 KB)
      • SHR:共享内存(0 KB)
      • S:进程状态(S,休眠)
      • %CPU:CPU 使用百分比(0.0%)
      • %MEM:内存使用百分比(0.0%)
      • TIME+:运行时间(0:01.31)
      • COMMAND:进程命令(migration/53)
    • 276 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/53
      • PID:276
      • USER:root
      • PR:普通优先级(20)
      • NI:优先级(0)
      • VIRT:虚拟内存(0 KB)
      • RES:常驻内存(0 KB)
      • SHR:共享内存(0 KB)
      • S:进程状态(S,休眠)
      • %CPU:CPU 使用百分比(0.0%)
      • %MEM:内存使用百分比(0.0%)
      • TIME+:运行时间(0:00.00)
      • COMMAND:进程命令(ksoftirqd/53)

这些信息可以帮助你了解系统的资源使用情况和各个进程的状态。

top 查看某个进程的详细资源使用情况

1
2
3
 ps aux | grep -i ksmd
root 503 0.0 0.0 0 0 ? SN Jul30 0:00 [ksmd]
wujing 71573 0.0 0.0 213264 892 pts/2 S+ 13:53 0:00 grep --color=auto -i ksmd
1
top -Hcp 503
  • -H:显示线程视图,每个线程占用一行。
  • -c:显示完整的命令行。
  • -p 503:只显示进程 ID 为 503 的信息,包括该进程的所有线程。

此命令用于查看进程 ID 为 503 的进程及其所有线程的详细资源使用情况。

top -Hcp 503

top 查看qemu-kvm进程的详细资源使用情况

top qemu-kvm

以下是 top 命令输出中每个字段的详细解释:

  1. P (PSR): Processor,表示线程当前在运行的物理 CPU 核心编号。
  2. NU: NUMA 节点编号,指示线程所关联的 NUMA 节点。
  3. PID: 进程 ID,标识进程的唯一编号。
  4. USER: 进程的所属用户,即运行该进程的用户。
  5. PR: 优先级(Priority),数值越小优先级越高。实时优先级范围通常为 0-99,普通优先级范围为 100-139。
  6. NI: nice 值,用于调整进程的优先级,范围为 -20(最高优先级)到 19(最低优先级)。
  7. VIRT: 虚拟内存大小(Virtual Memory Size),即进程使用的虚拟地址空间总量,包括交换分区和物理内存。
  8. RES: 常驻内存(Resident Memory),即进程实际占用的物理内存大小,不包含交换内存。
  9. SHR: 共享内存(Shared Memory),即进程与其他进程共享的内存大小。
  10. S: 进程状态(State),通常包括:
    • R: 运行中(Running)
    • S: 睡眠(Sleeping)
    • D: 不可中断的睡眠(Uninterruptible Sleep)
    • Z: 僵尸进程(Zombie)
    • T: 停止或追踪(Stopped or Traced)
  11. %CPU: 进程使用的 CPU 百分比,表示进程在最近一段时间内占用的 CPU 资源比例。
  12. %MEM: 进程使用的物理内存百分比,相对于系统总内存的占用情况。
  13. TIME+: 进程累计的 CPU 时间,格式为 分钟:秒.百分秒,表示进程启动以来的总 CPU 占用时间。
  14. COMMAND: 执行的命令行或进程名称。

关于 跨 NUMA 的情况: 在图中,NU 列显示了多个 QEMU 线程分布在不同的 NUMA 节点上(例如,节点 0 和节点 1),这表明 QEMU-KVM 进程的线程确实存在跨 NUMA 的情况。这种分布可能会导致内存访问延迟的增加,因为不同的 NUMA 节点访问内存时会有不同的延迟。如果性能要求较高,建议对线程的 NUMA 亲和性进行优化,以减少跨 NUMA 访问的影响。

htop

network

端口

nc

nc是网络工具中的瑞士军刀。

补充说明 nc命令 全称netcat,用于TCP、UDP或unix域套接字(uds)的数据流操作,它可以打开TCP连接,发送UDP数据包,监听任意TCP 和UDP端口,同时也可用作做端口扫描,支持IPv4和IPv6,与Telnet的不同在于nc可以编写脚本。

语法

1
2
nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p<通信端口>]
[-s<来源位址>][-v...][-w<超时秒数>][主机名称][通信端口...]

选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-4 只使用IPV4
-6 只使用IPV6
-c 使用tls连接或者监听
-D 启用socket调试开关
-g <网关> # 设置路由器跃程通信网关,最多可设置8个。
-G<指向器数目> # 设置来源路由指向器,其数值为4的倍数。
-h 在线帮助。
-i<延迟秒数> 设置时间间隔,以便传送信息及扫描通信端口。
-l 使用监听模式,管控传入的资料。
-n 直接使用IP地址,而不通过域名服务器。
-o<输出文件> # 指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存。
-p<通信端口> # 设置本地主机使用的通信端口。
-r 乱数指定本地与远端主机的通信端口。
-s<来源位址> # 设置本地主机送出数据包的IP地址。
-u 使用UDP传输协议。
-v 显示指令执行过程。
-w<超时秒数> # 设置等待连线的时间。
-z 使用0输入/输出模式,只在扫描通信端口时使用。

TCP端口扫描:

1
2
3
4
5
nc -v -z -w2 192.168.0.3 1-100
192.168.0.3: inverse host lookup failed: Unknown host
(UNKNOWN) [192.168.0.3] 80 (http) open
(UNKNOWN) [192.168.0.3] 23 (telnet) open
(UNKNOWN) [192.168.0.3] 22 (ssh) open

扫描192.168.0.3 的端口 范围是 1-100 扫描UDP端口:

1
nc -u -z -w2 192.168.0.3 1-1000

扫描指定端口,如 80:

1
2
3
nc -nvv 192.168.0.1 80
(UNKNOWN) [192.168.0.1] 80 (?) open
y //用户输入

端口占用

netstat

netstat 查看22端口是否被占用:

1
netstat  -anp  | grep   22
lsof

使用-i:port来显示与指定端口相关的网络信息:

1
2
3
4
5
lsof -i :22

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
sshd 7703 root 3u IPv6 6499 TCP *:ssh (LISTEN)
sshd 7892 root 3u IPv6 6757 TCP 10.10.1.5:ssh->192.168.1.5:49901 (ESTABLISHED)
ss

使用 ss 命令查看22端口是否被占用:

1
2
ss -tulnp | head -n1
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process

这条命令 ss -tulnp | head -n1 输出的是 ss 命令结果的第一行,它显示了 ss 输出的列标题。这些列分别表示:

  • Netid: 网络协议类型(如 TCP、UDP 等)。
  • State: 套接字状态(如 LISTEN、ESTABLISHED 等)。
  • Recv-Q: 接收队列的字节数。
  • Send-Q: 发送队列的字节数。
  • Local Address:Port: 本地地址和端口。
  • Peer Address:Port: 对等地址和端口(在监听状态下为空)。
  • Process: 正在使用该套接字的进程及其 PID。
1
2
3
4
ss -tulnp | grep ':22'

LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1234,fd=3))

ss 是一个用于查看网络连接、套接字统计和进程信息的工具。常用参数包括:

  • -t: 显示 TCP 套接字。
  • -u: 显示 UDP 套接字。
  • -l: 仅显示监听状态的套接字。
  • -n: 以数字形式显示地址和端口。
  • -p: 显示使用套接字的进程信息。

例如,sudo ss -tulnp 可以显示当前系统中监听的所有网络端口及其对应的进程。

ip

/etc/hosts

net-tools iproute2

brctl

iptables

dns

nslookup

traceroute

traceroute 是一个用于追踪网络数据包从源到目标主机的路径的工具。它显示数据包经过的每一跳(即每一个路由器或网关)以及每一跳的延迟时间。这对于网络故障排查、分析网络路径和了解网络拓扑非常有用。

基本用法

1
traceroute <目标主机或IP地址>

例如:

1
traceroute www.example.com

解释输出

traceroute 的输出会列出数据包从源到目标主机所经过的每一跳。每一行代表一跳,并显示以下信息:

  • 跳数: 每一跳的编号,从 1 开始。
  • 路由器 IP 地址: 数据包在这一跳所经过的路由器的 IP 地址。
  • 主机名: 该路由器的主机名(如果能解析)。
  • 延迟时间: 数据包从源到这一跳的往返时间(通常显示三次)。

常用选项

  • -n: 只显示 IP 地址,而不尝试解析主机名。
  • -I: 使用 ICMP 回显请求(类似于 ping)而不是默认的 UDP 数据包。
  • -T: 使用 TCP SYN 数据包进行追踪。
  • -m <max_hops>: 设置最大跳数,默认为 30。
  • -q <number_of_queries>: 每跳发送的探测包数量,默认为 3。

示例

  1. 基本使用:

    1
    traceroute google.com

    输出会显示数据包从你的位置到 Google 服务器经过的路径。

  2. 使用 ICMP 包进行追踪:

    1
    traceroute -I www.example.com

    这种方式更接近 ping 的工作方式,可能对某些防火墙更友好。

  3. 只显示 IP 地址:

    1
    traceroute -n www.example.com

    这样可以加快追踪速度,尤其在 DNS 解析慢的情况下。

traceroute 工具在网络诊断、排查网络延迟和确定网络路径时非常有帮助。

traceroute原理

traceroute 的工作原理基于 IP 数据包的 TTL(Time To Live) 字段,以及 ICMP(Internet Control Message Protocol)消息。它利用 TTL 的特性逐跳追踪数据包的路径,最终显示数据包从源到目标主机的路由信息。

  1. TTL 字段
    • 每个 IP 数据包都有一个 TTL 字段,表示数据包可以经过的最大路由器数量。
    • 当数据包经过一个路由器时,TTL 值会减 1。
    • 如果 TTL 值变为 0,路由器会丢弃该数据包,并返回一个 ICMP "Time Exceeded" 消息给发送者。
  2. 逐跳增加 TTL
    • traceroute 工具首先发送一个 TTL 为 1 的数据包。
    • 第一个路由器接收到该数据包后,将 TTL 减 1,TTL 变为 0,于是路由器丢弃该数据包,并返回一个 ICMP "Time Exceeded" 消息。
    • traceroute 记录下这个 ICMP 消息中的路由器信息(如 IP 地址和延迟时间),并将其作为第一个跳的结果输出。
    • 接着,traceroute 发送一个 TTL 为 2 的数据包,这个数据包能到达第二个路由器,再次触发 "Time Exceeded" 消息。
    • 这个过程一直重复,直到数据包到达目标主机,或者达到设置的最大跳数(通常为 30)。
  3. 识别目标主机
    • 当目标主机收到数据包后,会返回一个 "ICMP Port Unreachable" 消息(如果使用默认的 UDP 数据包)或者一个 TCP/ICMP 响应(如果使用 -I-T 选项)。
    • traceroute 接收到此消息时,停止追踪,并显示完整路径。
  4. 延迟时间的计算
    • traceroute 在每一跳发送三个探测包,并计算从发送数据包到收到 ICMP 响应的时间延迟。这些延迟反映了从源到该跳的往返时间。
其他重要概念
  • ICMP:默认情况下,traceroute 使用 UDP 数据包来进行探测,但它依赖于 ICMP "Time Exceeded" 和 "Port Unreachable" 消息来工作。使用 -I 选项时,traceroute 会直接使用 ICMP 回显请求(类似于 ping)。

  • 端口号:默认情况下,traceroute 使用 UDP 数据包,目标端口号从一个高的值(通常是33434)开始,并逐跳递增。目标主机通常会返回 "ICMP Port Unreachable" 消息,因为这些高端口号大多数没有实际服务监听。

典型问题
  • 防火墙和路由器过滤:某些防火墙和路由器会阻止 ICMP 或高端口的 UDP 数据包,导致 traceroute 无法获取某些跳的路由信息。
  • 多路径路由:在有些情况下,路径中的不同跳可能会变化,这导致 traceroute 显示不同的路径,特别是在负载均衡环境中。

traceroute 的原理非常适合用来诊断网络问题,了解数据包在网络中的传输路径,并发现可能的瓶颈或故障点。

代理

正向代理 反向代理

文件系统

rm

trash-cli

Linux 权限

mount

/etc/fstab

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
cat /etc/fstab
# /dev/nvme0n1p3
UUID=b8785205-a668-4d32-8cd8-e506b9850f01 / ext4 rw,relatime 0 1

# /dev/nvme0n1p2
UUID=89d974e1-1e99-49ac-a814-b340cc37b17a /boot ext4 rw,relatime 0 2

# /dev/nvme0n1p1
UUID=1762-ADDC /boot/efi vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 2

# /dev/nvme0n1p5
UUID=c614a533-2615-48e9-812d-dccc8871fcea /data ext4 rw,relatime 0 2

# /dev/nvme0n1p6
UUID=5a93ac13-1983-4a13-9e03-97494cf04f79 /recovery ext4 rw,relatime 0 2

# /dev/nvme0n1p7
UUID=3ac2cbc4-96f5-44ae-b7fc-449e3e963508 none swap defaults,pri=-2 0 0

/data/home /home none defaults,bind 0 0
/data/opt /opt none defaults,bind 0 0
/data/root /root none defaults,bind 0 0
/data/var /var none defaults,bind 0 0

# /dev/sda1
UUID=cc5da720-dbfb-4bc2-8f35-f566d1603508 /media/wujing/data ext4 rw,relatime 0 2
/media/wujing/data/Downloads /home/wujing/Downloads none defaults,bind 0 0
/media/wujing/data/Documents /home/wujing/Documents none defaults,bind 0 0
/media/wujing/data/code /home/wujing/code none defaults,bind 0 0

软链接和硬链接

dd

lsof

显示当前打开的 /var/log/messages 文件及相关进程信息:

1
2
3
4
lsof /var/log/messages

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
syslog-ng 7547 root 4w REG 3,3 217309 834024 /var/log/messages

lsof /var/log/messages 的输出可能会包含以下几列:

  • COMMAND: 打开文件的进程名。
  • PID: 进程 ID。
  • USER: 进程所属用户。
  • FD: 文件描述符(例如 cwd, txt, mem, 1, 2 等)。
  • TYPE: 文件类型(例如 REG 表示常规文件)。
  • DEVICE: 设备号。
  • SIZE/OFF: 文件大小或偏移量。
  • NODE: 节点号。
  • NAME: 文件名或路径。

stat

find

xargs

grep sed awk

grep

grep 特殊字符串

使用单引号并不能避免 * 等字符被解释为正则表达式的一部分。为了完全匹配包含这些特殊字符的字符串,以下是两种推荐的方式:

  1. 使用转义字符: 需要对特殊字符进行转义,例如 *( 等,确保它们不会被解释为正则表达式符号。

    1
    grep -rn "\(struct wait_queue_entry \*wq_entry, unsigned mode, int flags, void \*key\)" /path/to/source/code
  2. 使用 -F 选项: 如果想避免手动转义所有特殊字符,可以使用 grep -Ffgrep,将搜索字符串视为纯文本进行匹配。

    1
    grep -rnF "(struct wait_queue_entry *wq_entry, unsigned mode, int flags, void *key)" /path/to/source/code

这两种方式可以帮助你在代码中准确查找包含特殊字符的字符串。

sed

复制第 1119 行到 1224 行的内容:

1
sed -n '1119,1224'p kern.log > pm.log

awk

tail

cat EOF

tee

解压缩

分卷压缩

远程命令

上传下载文件

sftp

使用 sftp 连接远程服务器时,可以通过 -oPort 选项指定端口。以下是使用 sftp 指定端口的命令示例:

1
sftp -oPort=端口号 用户名@主机名

示例

假设你要通过端口 2222 连接到名为 example.com 的服务器,并且用户名是 user,可以使用以下命令:

1
sftp -oPort=2222 user@example.com

参数说明

  • -oPort=端口号:指定连接到服务器的端口号。
  • 用户名@主机名:指定用户名和主机名(或 IP 地址)以进行连接。

这种方式可以让你在连接到非默认端口的 SFTP 服务器时进行指定。

scp

使用 scp 命令时,如果需要指定端口,可以使用 -P 选项:

1
scp -P 2222 example.txt user@example.com:~

rsync

rsync 使用 -e 选项来指定通过 SSH 使用特定的端口:

1
rsync -avzP -e 'ssh -p 10000' linux-y.tar.gz root@10.63.8.158:/inf/yql/code

参数说明:

  • -a:归档模式,表示递归传输并保持文件属性。
  • -v:详细模式,显示传输过程中的详细信息。
  • -z:压缩传输文件,以减少传输的数据量。
  • -P:显示传输进度,并在传输中断后能够继续传输。
  • -e 'ssh -p 10000':使用指定的 SSH 命令和端口(这里是 10000)。
  • linux-y.tar.gz:要传输的本地文件。
  • root@10.63.8.158:/inf/yql/code:远程服务器的目标路径。

ssh

termux

crontab计划任务

Patch

BuildStream

输入法

其它


linux教程
https://realwujing.github.io/linux/linux教程/
作者
Wu Jing
发布于
2023年4月19日
许可协议