linux教程

本文最后更新于:2025年6月18日 下午

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

时间

时间协议

登录

sudo vs su

以下是 sudosu 及相关命令的行为对比表格,包含 Shell 类型环境变量处理$HOME 变化 等关键信息:


sudosu 命令对比总结

命令 Shell 类型 加载的配置文件 $HOME 行为 环境变量继承 是否需要密码 典型用途
sudo -s 非登录 Shell ~/.bashrc 强制改为 /root 部分重置(受 env_reset 影响) 当前用户密码 临时以 root 身份执行命令(不切换完整环境)
sudo -i 登录 Shell /etc/profile, ~/.bash_profile, ~/.profile 改为 /root 完全重置(全新 root 环境) 当前用户密码 完全模拟 root 登录(完整环境)
sudo su - 登录 Shell /etc/profile, ~/.bash_profile, ~/.profile 改为 /root 完全重置(全新 root 环境) 当前用户密码 sudo -i(兼容性写法)
su 非登录 Shell ~/.bashrc 保持原用户的 $HOME 继承当前环境(可能混用) 目标用户密码 不推荐(环境变量可能冲突)
su - 登录 Shell /etc/profile, ~/.bash_profile, ~/.profile 改为目标用户的家目录 完全重置(目标用户环境) 目标用户密码 安全切换到目标用户(完整环境)
sudo -Es 非登录 Shell ~/.bashrc 保持原用户的 $HOME 保留大部分环境变量(-E 选项) 当前用户密码 需要保留原环境变量的临时 root 操作

关键行为说明

  1. $HOME 变化
    • sudo -ssudo -i 都会将 $HOME 改为 /root,但前者是 非登录 Shell(仅通过 sudo 机制强制修改),后者是 登录 Shell(自然行为)。
    • su 保持原 $HOME,而 su - 会切换。
  2. 环境变量重置
    • sudo 默认启用 env_reset,会清理危险变量(如 PATH),但保留 HOMEUSER 等关键变量。
    • su -sudo -i 会加载目标用户的完整环境,而 su 可能混用环境变量(易出错)。
  3. 密码差异
    • sudo 需输入 当前用户密码(依赖 /etc/sudoers 配置)。
    • su 需输入 目标用户密码(直接切换身份)。

使用场景建议

需求 推荐命令 理由
临时执行单条 root 命令 sudo <command> 无需启动 Shell,安全且最小权限。
需要完整 root 环境 sudo -isudo su - 完全隔离的环境,避免变量污染。
保留当前环境变量 sudo -Es 调试或需要继承当前配置时使用。
切换到其他用户(非 root) su - <username> 安全加载目标用户环境(如 su - oracle)。

附:配置文件加载顺序

  • 登录 Shell
    /etc/profile~/.bash_profile~/.profile
  • 非登录 Shell
    ~/.bashrc(可能通过 /etc/bashrc 间接加载)

通过此表格可以快速对比不同命令的差异,根据需求选择最合适的权限提升方式!

日志

随机数

硬件信息

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

netstat -s 通常会显示网络协议(如 TCP、UDP、IP)的统计信息,包括:

  • 数据包发送和接收的数量
  • 错误数(如丢包或校验错误)
  • 重传和连接状态
1
netstat -s | less -N
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
30 Tcp:
31 450966 active connection openings
32 2047 passive connection openings
33 17088 failed connection attempts
34 2423 connection resets received
35 16 connections established
36 8134759 segments received
37 10437736 segments sent out
38 3591 segments retransmitted
39 0 bad segments received
40 15896 resets sent
41 Udp:
42 306430 packets received
43 4 packets to unknown port received
44 0 packet receive errors
45 12051 packets sent
46 0 receive buffer errors
47 0 send buffer errors
48 IgnoredMulti: 5829
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

ipcalc

1
2
3
4
5
6
7
8
9
[root@nm08-az2-compute-cm8ne-10e8e94e106 secure]# ipcalc 10.244.208.0/26
Network: 10.244.208.0/26 # 网络地址和前缀长度(CIDR表示法)
Netmask: 255.255.255.192 = 26 # 点分十进制子网掩码及其等效前缀长度
Broadcast: 10.244.208.63 # 广播地址(该子网最后一个IP)

Address space: Private Use # 地址空间类型(RFC1918私有地址)
HostMin: 10.244.208.1 # 可分配的最小主机IP
HostMax: 10.244.208.62 # 可分配的最大主机IP
Hosts/Net: 62 # 可用主机数量(2^6 - 2 = 62)

啥是网络地址、广播地址?

在IP网络中,网络地址和广播地址是子网中两个特殊的保留地址,它们有明确的定义和作用:


1. 网络地址(Network Address) • 定义:子网中的第一个IP地址,用于标识整个子网本身。

• 作用:

• 表示“这个子网”,类似于“XX小区”的门牌号。

• 不能被分配给任何设备(如主机、路由器)。

• 示例:

在子网 10.244.208.0/26 中:
• 网络地址是 10.244.208.0

• 二进制最后6位全为 0000000)。


2. 广播地址(Broadcast Address) • 定义:子网中的最后一个IP地址,用于向子网内所有设备发送广播消息。

• 作用:

• 发送到广播地址的数据包会被子网内所有主机接收。

• 不能被分配给任何设备。

• 示例:

在子网 10.244.208.0/26 中:
• 广播地址是 10.244.208.63

• 二进制最后6位全为 1111111)。


3. 为什么需要保留这两个地址?

地址类型 保留原因 类比解释
网络地址 标识子网范围,帮助路由器和设备区分不同子网。 类似“XX市XX区”的地域标识。
广播地址 支持ARP、DHCP等协议,允许一次性向子网内所有设备发送通知(如“找网关”)。 类似小区广播喇叭,全员通知。

4. 如何计算这两个地址?10.244.208.0/26 为例:

  1. 确定主机位:
    /26 表示前26位是网络位,后6位是主机位(32 - 26 = 6)。

  2. 网络地址:
    • 主机位全置 010.244.208.0000000010.244.208.0

  3. 广播地址:
    • 主机位全置 110.244.208.0011111110.244.208.63


5. 实际影响 • 可用IP范围:

10.244.208.0/26 中,实际可用的主机IP是 10.244.208.1 ~ 10.244.208.62(共62个)。
• 配置错误示例:

• ❌ 将 10.244.208.0 分配给服务器 → 网络不通。

• ❌ 将 10.244.208.63 设为网关 → 广播风暴风险。


6. 常见协议依赖广播地址 • ARP:通过广播地址 FF:FF:FF:FF:FF:FF 解析IP对应的MAC地址。

• DHCP:客户端通过广播地址 255.255.255.255 动态获取IP。

• NTP:时间同步协议可能使用广播。


总结 • 网络地址 = 子网的“身份证”,主机位全 0

• 广播地址 = 子网的“大喇叭”,主机位全 1

• 它们不可用作设备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 的原理非常适合用来诊断网络问题,了解数据包在网络中的传输路径,并发现可能的瓶颈或故障点。

代理

正向代理 反向代理

wsl2使用w11代理

在WSL 2中,Windows主机的IP通常可以通过以下命令获取:

1
2
3
ip route | grep default | awk '{print $3}'

172.27.16.1

在WSL中设置代理:

1
export https_proxy=http://172.27.16.1:7897 http_proxy=http://172.27.16.1:7897 all_proxy=socks5://172.27.16.1:7897

文件系统

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 使用 基础正则(BRE)、扩展正则(ERE)、Perl 兼容正则(PCRE) 的核心区别

以下是 grep 使用 基础正则(BRE)、扩展正则(ERE)、Perl 兼容正则(PCRE) 的核心区别总结,通过对比表格和示例说明:


1. 核心特性对比
特性 基础正则(BRE) 扩展正则(ERE) Perl 兼容正则(PCRE)
启用选项 grep(默认) grep -Eegrep grep -P(需支持)
元字符转义 大部分元字符需转义(如 \+ 元字符无需转义(如 + 元字符无需转义(如 \d
高级语法 不支持 \|?+ 支持 \|?+{} 支持零宽断言、非贪婪匹配等
常见用途 简单匹配 中等复杂度匹配 复杂模式(如日志分析)

2. 元字符差异示例
匹配 "error" 或 "warning"
  • BRE(需转义):
    1
    grep "error\|warning" file.txt
  • ERE(直接使用):
    1
    grep -E "error|warning" file.txt
  • PCRE(语法同 ERE,但功能更多):
    1
    grep -P "error|warning" file.txt
匹配 1~3 位数字
  • BRE(转义 {}):
    1
    grep "[0-9]\{1,3\}" file.txt
  • ERE/PCRE(无需转义):
    1
    grep -E "[0-9]{1,3}" file.txt

3. 高级功能对比
Perl 独有特性
  • \d(数字)、\s(空白符)、\w(单词字符)
    1
    grep -P "\d+" file.txt    # 匹配连续数字
  • 零宽断言(匹配位置):
    1
    grep -P "foo(?=bar)" file.txt   # 匹配 "foo" 且后接 "bar"
  • 非贪婪匹配
    1
    grep -P "a.*?b" file.txt  # 匹配最短的 "a...b"

4. 使用建议
  • 简单文本:用默认 BRE(如 grep "pattern")。
  • 逻辑或/重复:用 EREgrep -E)。
  • 复杂模式(如提取数据):用 PCREgrep -P)。
  • 兼容性
    • macOS 默认 grep 不支持 -P,需安装 GNU grep(brew install grep)。
    • 脚本中优先用 -E 保证可移植性。

经典示例
提取引号内内容
  • PCRE(简洁精准):
    1
    grep -Po '(?<=")[^"]*(?=")' file.txt
  • ERE(需迂回实现):
    1
    grep -Eo '"[^"]*"' file.txt | sed 's/"//g'

总结
  • BRE:适合基础搜索,但需频繁转义。
  • ERE:平衡功能与可读性,推荐日常使用。
  • PCRE:处理复杂场景的终极武器,但依赖环境。

根据需求选择正则类型,可以大幅提升文本处理效率!

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

解压缩


常用压缩/解压命令(简洁版)

.tar.xz 文件(高压缩率,较慢)

  • 压缩

    1
    tar -cJvf file.tar.xz file_or_dir
  • 解压

    1
    tar -xJvf file.tar.xz

.tar.gz 文件(压缩率与速度平衡)

  • 压缩

    1
    tar -czvf file.tar.gz file_or_dir
  • 解压

    1
    tar -xzvf file.tar.gz

.zip 文件(跨平台兼容)

  • 压缩

    1
    zip -r file.zip file_or_dir
  • 解压

    1
    unzip file.zip

总结对照表

格式 压缩命令 解压命令
.tar.xz tar -cJvf file.tar.xz file/ tar -xJvf file.tar.xz
.tar.gz tar -czvf file.tar.gz file/ tar -xzvf file.tar.gz
.zip zip -r file.zip file/ unzip file.zip

-v(verbose)参数可选,用于显示详细进度信息。 ✅ 解压 .tar.xz / .tar.gz 时,-J / -z 可省略,tar 通常会自动检测格式。

如需进一步精简去掉 -v,可以用如下形式:

  • .tar.xztar -cJf / tar -xJf
  • .tar.gztar -czf / tar -xzf
  • .zipzip -r / unzip

查看压缩包内容

下面是关于不解压查看 .tar.xz.tar.gz.zip 文件内容的方法总结,适用于 Linux 命令行环境:


✅ 一、.tar.gz 文件查看

1
tar -tzf yourfile.tar.gz
  • -t:列出归档内容(list)
  • -z:通过 gzip 解压
  • -f:指定归档文件
示例
1
tar -tzf archive.tar.gz

✅ 二、.tar.xz 文件查看

1
tar -tvf yourfile.tar.xz
  • -t:列出内容
  • -v:详细输出(可选)
  • -f:指定文件
  • 自动识别 .xz 压缩,无需手动加 -J
示例
1
tar -tvf archive.tar.xz

✅ 三、.zip 文件查看

1
unzip -l yourfile.zip
  • -l:列出 zip 包内文件

或使用更详细格式:

1
zipinfo yourfile.zip

📌 总结对比表

格式 命令 说明
.tar.gz tar -tzf file.tar.gz 查看 gzip 压缩的 tar 包
.tar.xz tar -tvf file.tar.xz 查看 xz 压缩的 tar 包
.zip unzip -l file.zipzipinfo file.zip 查看 zip 文件内容

如需进一步筛选(比如只看 .log 文件或某个目录),可以配合 grep

1
2
tar -tvf file.tar.xz | grep '\.log$'
unzip -l file.zip | grep '^.*\.conf$'

分卷压缩

以下是三种格式的分卷压缩和解压命令(简洁版),适合大文件分割打包:


.tar.gz / .tar.xz 分卷压缩

tar 本身不支持分卷,但可结合 split 命令实现:

压缩并分卷

1
tar -czf - dir/ | split -b 100M - file.tar.gz.part_

或:

1
tar -cJf - dir/ | split -b 100M - file.tar.xz.part_

-b 100M 指每卷大小,file.tar.gz.part_aafile.tar.gz.part_ab... 是输出文件名。

合并并解压

1
cat file.tar.gz.part_* | tar -xzf -

或:

1
cat file.tar.xz.part_* | tar -xJf -

.zip 分卷压缩(zip 本身支持)

压缩并分卷

1
zip -r -s 100m file.zip dir/

生成 file.z01file.z02… 和主文件 file.zip

解压

1
unzip file.zip

总结对照表

格式 分卷压缩命令 解压命令
.tar.gz tar -czf - dir/ \| split -b 100M - file.tar.gz.part_ cat file.tar.gz.part_* \| tar -xzf -
.tar.xz tar -cJf - dir/ \| split -b 100M - file.tar.xz.part_ cat file.tar.xz.part_* \| tar -xJf -
.zip zip -r -s 100m file.zip dir/ unzip file.zip

✅ 分卷文件一定不能重命名。 ✅ .zip 分卷压缩无需 cat 合并,直接 unzip.zip 文件即可。

远程命令

上传下载文件

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日
许可协议