BSD & System V 风格

BSD(Berkeley Software Distribution)和 System V 都是 Unix 操作系统的重要分支和变体,它们在 Unix 的发展历程中有着重要地位,在系统架构、功能特性和应用场景等方面存在一定差异,以下是具体介绍:

BSD

  • 起源与发展:BSD 起源于 20 世纪 70 年代末的加州大学伯克利分校。它是在 AT&T 的 Unix 基础上进行开发的,添加了许多新的特性和功能。在发展过程中,产生了如 FreeBSD、NetBSD、OpenBSD 等多个衍生版本,这些版本在服务器、嵌入式系统等领域都有广泛应用。
  • 特点
    • 网络功能强大:BSD 在网络方面的支持非常出色,它率先实现了许多重要的网络协议和功能,如 TCP/IP 协议栈的完善和优化,为现代网络通信奠定了基础。像 FreeBSD 就因其强大的网络性能,常被用于构建网络服务器和防火墙等设备。
    • 开源与社区活跃:BSD 及其衍生版本大多采用开源的方式发布,拥有活跃的社区。社区成员积极参与开发和维护,不断为系统添加新功能、修复漏洞,使其技术不断更新和进步。
    • 可移植性高:BSD 具有良好的可移植性,能够在多种硬件平台上运行,包括 x86、PowerPC、ARM 等。这使得它可以广泛应用于不同类型的设备和系统中。
  • 应用场景:BSD 及其衍生版本在服务器领域应用广泛,如 Web 服务器、邮件服务器等。此外,在嵌入式系统中也有大量应用,如网络设备、智能家居等。

System V

  • 起源与发展:System V 是 AT&T 开发的 Unix 版本,它在 Unix 的发展中也占据着重要地位。System V 经历了多个版本的发展,如 System V Release 4 等,对 Unix 的标准化和商业化起到了重要推动作用。
  • 特点
    • 系统架构稳定:System V 具有一套相对稳定和成熟的系统架构,其进程管理、内存管理等核心功能的设计较为完善,为系统的稳定性和可靠性提供了保障。许多商业 Unix 系统都基于 System V 进行开发。
    • 标准化程度高:System V 在 Unix 的标准化方面做出了重要贡献,它定义了一系列的系统接口和规范,如 System V IPC(进程间通信)机制等,这些规范成为了后来许多 Unix 系统和类 Unix 系统遵循的标准。
    • 商业应用广泛:由于其稳定性和标准化,System V 在商业领域得到了广泛应用。许多大型企业和机构选择基于 System V 的 Unix 系统来运行关键业务应用,如银行系统、企业资源规划(ERP)系统等。
  • 应用场景:主要应用于商业环境中的关键任务系统,如大型企业的核心业务系统、金融交易系统等。同时,在一些对系统稳定性和兼容性要求较高的科研、政府等领域也有应用。




certificate 证书

  1. Linux 系统中的证书位置

在 Linux 系统中,根证书和信任的证书通常存储在以下目录中:

  • 根证书存储路径

    • /etc/ssl/certs/
    • /usr/share/ca-certificates/(某些发行版)
    • /etc/pki/tls/certs/(某些发行版,如 RedHat/CentOS)
  • 管理证书

    • ca-certificates 软件包通常用于管理信任的根证书。
    • 使用 update-ca-certificates 命令来更新系统证书库。
  • 验证证书内容

    您可以通过 openssl 命令查看该证书的详细信息,确认它是否是 USERTrust RSA Certification Authority 根证书。运行以下命令:

    1
    openssl x509 -in USERTrust_RSA_Certification_Authority.pem -text -noout

    这将显示证书的详细信息,其中包括:

    • Issuer:应为 USERTrust RSA Certification Authority
    • Subject:通常会显示证书本身的标识信息。
  • 安装证书

    • .pem 格式的证书文件拷贝到 /usr/local/share/ca-certificates/ 目录,然后运行以下命令:

      1
      sudo update-ca-certificates

  1. macOS 系统中的证书位置

macOS 中,根证书存储在 钥匙串访问(Keychain Access)中。您可以通过 钥匙串访问 查看和管理根证书。

  • 证书存储位置

    • 系统钥匙串(System Keychain):存储系统信任的根证书。
    • 用户钥匙串(Login Keychain):存储用户自己添加或信任的证书。
  • 查看证书

    • 打开 钥匙串访问(Keychain Access),选择 系统根证书(System Roots),查看所有受信任的证书。
  • 安装证书

    • 将证书拖动到 钥匙串访问 中,或双击证书文件,系统会提示是否安装该证书。




dig

dig 命令是一个用于查询 DNS(域名系统)信息的工具,主要用于测试和诊断域名解析问题。它可以获取域名的 IP 地址、MX 记录、NS 记录、TTL 值等详细信息。以下是关于 dig 命令的详细介绍:


基本用途

  • 查询域名对应的 IP 地址(A 记录)。
  • 反向查询 IP 对应的域名(PTR 记录)。
  • 获取 DNS 服务器返回的权威信息(如 NS 记录、SOA 记录)。
  • 诊断 DNS 解析过程中的错误或异常。

基本语法

1
dig [选项] [域名] [查询类型]
  • 选项:控制查询行为(如指定 DNS 服务器、显示详细信息等)。
  • 域名:需要查询的目标域名(如 example.com)。
  • 查询类型:可选值包括 A(IP 地址)、MX(邮件交换记录)、NS(名称服务器)、TXT(文本记录)等。

常用选项及示例

  1. 查询默认记录(A 记录)

    1
    dig example.com

    输出结果中包含 ANSWER SECTION,显示域名对应的 IP 地址。

  2. 指定查询类型

    • 查询 MX 记录

      1
      dig mx example.com
    • 查询 NS 记录

      1
      dig ns example.com
  3. 反向查询(IP 转域名)

    1
    dig -x 192.168.1.1

    输出结果显示该 IP 对应的 PTR 记录(如果存在)。

  4. 指定 DNS 服务器

    1
    dig @8.8.8.8 example.com

    使用 Google DNS(8.8.8.8)查询 example.com 的信息。

  5. 显示所有记录

    1
    dig any example.com

    获取域名的所有 DNS 记录(A、MX、NS、TXT 等)。

  6. 简化输出

    1
    dig +short example.com

    仅显示查询结果的关键信息(如 IP 地址)。


输出结果说明

dig 的输出通常包含以下部分:

  • HEADER:查询的基本信息(如查询状态、查询时间)。
  • QUESTION SECTION:查询的域名和类型。
  • ANSWER SECTION:查询结果(如 IP 地址、MX 优先级)。
  • AUTHORITY SECTION:提供权威解析的 DNS 服务器。
  • ADDITIONAL SECTION:附加信息(如 DNS 服务器的 IP 地址)。

注意事项

  1. 权限问题:某些查询可能需要管理员权限(使用 sudo)。
  2. 参数中的特殊字符:如果域名包含特殊字符(如 _),需用引号包裹。
  3. nslookup 的区别dig 是更强大的 DNS 诊断工具,而 nslookup 功能相对简单。

示例

  • 查询 baidu.com 的 IP 地址:

    1
    dig baidu.com
  • 查询 qq.com 的 MX 记录:

    1
    dig mx qq.com
  • 反向查询 IP 202.108.22.5 的域名:

    1
    dig -x 202.108.22.5

通过 dig 命令,用户可以深入分析 DNS 解析过程,解决域名解析失败、记录配置错误等问题。





file

查看文件类型(文本、二进制、符号链接等)

1
2
3
file 文件名
# 示例:查看 /bin/bash 的类型
file /bin/bash

输出示例:

1
/bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=...




grep & less 查看日志

1
cat -n <文件名> | grep "<关键词>" | less

grep过滤条件:

and

1
cat -n <文件名> | grep "<关键词1>" | grep "<关键词2>" | less

or

-E 启用正则

1
cat -n <文件名> | grep -E "<关键词1>|<关键词2>"" | less

not

使用 -v 选项排除包含指定模式的行

1
cat -n <文件名> | grep -v "<关键词>" | less

排序

结合sort命令

1
pending...

count

使用 -c 选项统计匹配的行数:

1
cat -n <文件名> | grep -c "<关键词>"

less查看

一、基本导航(移动)

按键 功能说明
k 向上移动一行
j 向下移动一行
空格 向下翻一页(相当于 PageDown
b 向上翻一页(相当于 PageUp
Ctrl+f 向下翻一页(同空格)
Ctrl+b 向上翻一页(同 b
G 跳转到文件末尾
g 跳转到文件开头
数字+G 跳转到指定行(如 50G 到第 50 行)

二、搜索功能

按键 功能说明
/关键词 从当前位置向下搜索关键词(按回车执行)
?关键词 从当前位置向上搜索关键词(按回车执行)
n 跳转到下一个匹配结果
N 跳转到上一个匹配结果
Ctrl+l 高亮显示当前搜索的关键词(重新绘制屏幕)

三、行号与显示设置

按键 / 命令 功能说明
:set nu 显示行号(nunumber 缩写)
:set nonu 隐藏行号

五、其他实用操作

按键 功能说明
Ctrl+c 中断正在执行的操作(如搜索卡住时)
= 显示当前文件信息(总行数、当前行位置等)
m+字母 标记当前位置(如 ma 标记为 a
标记只能用 小写字母a-z),共 26 个可用标记位,每个字母对应唯一位置。 若用同一个字母再次标记(如再次 m+a),会覆盖之前的 a 标记位置。
'+字母 跳转到之前标记的位置(如 'a 跳回 a 标记处)




lsof

lsof 即 “list open files”,用于查看系统中被打开的文件,由于在 Unix 中一切皆文件,所以它也能查看网络连接、进程打开的文件等多种信息。

命令语法

1
lsof [选项] [参数]

常用选项及示例

选项 含义 示例
-i 显示所有网络连接相关的文件,可搭配端口号、协议等使用 lsof -i:显示所有网络连接信息 lsof -i :8080:显示占用 8080 端口的网络连接信息 lsof -i TCP:80:显示占用 TCP 80 端口的网络连接信息
-p 根据进程 ID(PID)查看该进程打开的文件 lsof -p 1234:查看 PID 为 1234 的进程打开的所有文件
-u 根据用户查看该用户打开的文件 lsof -u root:查看 root 用户打开的所有文件
-c 根据命令名查看该命令对应的进程打开的文件 lsof -c nginx:查看 nginx 进程打开的所有文件
-d 指定要查看的文件描述符 lsof -d 0,1,2:查看文件描述符为 0(标准输入)、1(标准输出)、2(标准错误输出)的文件信息

输出字段解释

字段 含义
COMMAND 进程对应的命令名称
PID 进程的 ID
USER 进程的所有者
FD 文件描述符,用于标识文件或网络连接,如 cwd(当前工作目录)、txt(程序代码)、mem(内存映射文件)、IPv4/IPv6(网络连接)等
TYPE 文件类型,如 DIR(目录)、REG(普通文件)、CHR(字符设备)、BLK(块设备)、FIFO(命名管道)、SOCK(套接字)等
DEVICE 设备号
SIZE/OFF 文件大小或偏移量
NODE 文件的索引节点号
NAME 文件或网络连接的名称

常见应用场景

  1. 查找占用端口的进程:当启动服务时提示端口被占用,使用 lsof -i :端口号 可快速找到占用该端口的进程及对应的 PID,然后可使用 kill -9 PID 终止该进程。
  2. 排查文件被哪些进程占用:如要删除某个文件但提示被占用,使用 lsof 文件名 能找出占用该文件的进程。
  3. 监控特定用户或进程的文件操作:通过 -u-p 选项可监控指定用户或进程打开的文件,了解其操作行为。

注意事项

  • lsof 命令需要较高的权限来查看系统中所有进程的信息,通常需要使用 sudo 来执行。
  • 输出信息较多时,可结合 grep 命令进行过滤,如 lsof -i | grep 8080 只显示包含 8080 端口的信息。




openssl s_client

openssl s_client 命令的作用

openssl s_client 是一个用于测试和调试 SSL/TLS 连接的工具,它允许您与远程服务器建立 SSL/TLS 连接,并查看服务器返回的证书链、加密算法以及其他 SSL/TLS 协议信息。


命令的常用语法:

1
openssl s_client -connect <host>:<port> -showcerts
  • -connect <host>:<port>:指定要连接的远程服务器和端口(例如 api.push.apple.com:443)。
  • -showcerts:显示服务器返回的完整证书链。

openssl s_client 输出解读:

  • Certificate chain:显示服务器返回的证书链,包含服务器证书、中间证书和根证书。
  • SSL handshake:显示 SSL/TLS 握手过程中的详细信息。
  • Verification:显示证书验证结果,通常为 Verification: OK,表示证书验证成功。
  • Server certificate:显示服务器证书的详细信息,包括证书颁发者、有效期、主题等。
  • Cipher:显示所使用的加密算法。

示例:

1
openssl s_client -connect api.push.apple.com:443 -showcerts

此命令将连接到 api.push.apple.com 服务器的 443 端口(HTTPS),并显示其证书链。

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
guowei.gong@GJVXWHGXQ1 ~ % openssl s_client -connect api.push.apple.com:443 -showcerts

Connecting to 17.188.180.78
CONNECTED(00000006)
depth=2 C=GB, ST=Greater Manchester, L=Salford, O=Comodo CA Limited, CN=AAA Certificate Services
verify return:1
depth=1 CN=Apple Public Server RSA CA 12 - G1, O=Apple Inc., ST=California, C=US
verify return:1
depth=0 C=US, ST=California, O=Apple Inc., CN=api.push.apple.com
verify return:1
---
Certificate chain
0 s:C=US, ST=California, O=Apple Inc., CN=api.push.apple.com
i:CN=Apple Public Server RSA CA 12 - G1, O=Apple Inc., ST=California, C=US
a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
v:NotBefore: Jun 19 16:31:31 2024 GMT; NotAfter: Apr 10 00:00:00 2025 GMT
-----BEGIN CERTIFICATE-----
MIIHqjCCBpKgAwIBAgIQKiA7SuAYHNdvnlNP26uvTDANBgkqhkiG9w0BAQsFADBk
MSswKQYDVQQDEyJBcHBsZSBQdWJsaWMgU2VydmVyIFJTQSBDQSAxMiAtIEcxMRMw
EQYDVQQKEwpBcHBsZSBJbmMuMRMwEQYDVQQIEwpDYWxpZm9ybmlhMQswCQYDVQQG
EwJVUzAeFw0yNDA2MTkxNjMxMzFaFw0yNTA0MTAwMDAwMDBaMFQxCzAJBgNVBAYT
AlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRMwEQYDVQQKDApBcHBsZSBJbmMuMRsw
GQYDVQQDDBJhcGkucHVzaC5hcHBsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IB
DwAwggEKAoIBAQDdTItGsYBuFOd8MtrkwpLbUB0Oxt4vZFPEbuLzuNj0ZISbGfV7
Hbde6MUsSwe/Z9EqktYlayPvjwlqXdarBd1FuhJDz6S+KvI7Ib2pDqBAJc2yTesM
cd8NkAzgPDUEUPtfXjSQOG/NkkMS9lETbq+xijFVo67J31PpM2w7i7o7LPmDYslO
Ja94h6PSUNj6jvKXfBn7PDLuDPNkeGOmBabnmHO/7CIrMOI6nxdOPuE1tsZ2GrmC
GOFxHZXRVuSgkEeqtucMqEIerODJl2kCzzb/udem6cm2RW9KjvRDnVaMaK8xvLR8
95iCtvTCR9sMDalSTHPVQQztVBhsBXLV1hc9AgMBAAGjggRmMIIEYjAMBgNVHRMB
Af8EAjAAMB8GA1UdIwQYMBaAFB5cF5EFVwL8d1zjcEPsa/3d0thpMHgGCCsGAQUF
BwEBBGwwajAxBggrBgEFBQcwAoYlaHR0cDovL2NlcnRzLmFwcGxlLmNvbS9hcHNy
c2ExMmcxLmRlcjA1BggrBgEFBQcwAYYpaHR0cDovL29jc3AuYXBwbGUuY29tL29j
c3AwMy1hcHNyc2ExMmcxMDEwgcoGA1UdEQSBwjCBv4ISYXBpLnB1c2guYXBwbGUu
Y29tghVtci1hcGkucHVzaC5hcHBsZS5jb22CGGFwaS1jYXJyeS5wdXNoLmFwcGxl
LmNvbYIVbXMtYXBpLnB1c2guYXBwbGUuY29tghVwdi1hcGkucHVzaC5hcHBsZS5j
b22CFWFwaS1jbi5wdXNoLmFwcGxlLmNvbYIVc3QtYXBpLnB1c2guYXBwbGUuY29t
ghxhcGktYnJvYWRjYXN0LnB1c2guYXBwbGUuY29tMGIGA1UdIARbMFkwSQYGZ4EM
AQICMD8wPQYIKwYBBQUHAgEWMWh0dHBzOi8vd3d3LmFwcGxlLmNvbS9jZXJ0aWZp
Y2F0ZWF1dGhvcml0eS9wdWJsaWMwDAYKKoZIhvdjZAULBDATBgNVHSUEDDAKBggr
BgEFBQcDATA0BgNVHR8ELTArMCmgJ6AlhiNodHRwOi8vY3JsLmFwcGxlLmNvbS9h
cHNyc2ExMmcxLmNybDAdBgNVHQ4EFgQU1ChZXxquxdC6SoKXhFmtc8t7llQwDgYD
VR0PAQH/BAQDAgWgMA8GCSqGSIb3Y2QGVgQCBQAwggH5BgorBgEEAdZ5AgQCBIIB
6QSCAeUB4wB3AH1ZHhLheCp7HGFnfF79+NCHXBSgTpWeuQMv2Q6MLnm4AAABkDFf
+coAAAQDAEgwRgIhAObiA+oBZXYO156kx74zGTaxDS4avyk6jYXtk9vHcujWAiEA
8keKJMIyXyIhMB4UFhEtRduzUL6ujSByT5uy7JirqaIAdgDM+w9qhXEJZf6Vm1PO
6bJ8IumFXA2XjbapflTA/kwNsAAAAZAxX/nBAAAEAwBHMEUCIQDkcmAG21vPbAJu
tpcff+8jo/VsVRMEc1Jgf1QOmXwlIwIgShPedMQXRAPnHQ+KhG5eWGnEf7m/PH7o
xhW5gjcnZi8AdwCi4wrkRe+9rZt+OO1HZ3dT14JbhJTXK14bLMS5UKRH5wAAAZAx
X/oiAAAEAwBIMEYCIQDKpKC72rD2spVQtsNTCjpOEsqoJ7EhNiirziuxOblx5AIh
AOjQmwTFcqXyIQ3eOGeLHlsyJnbU7A6ggfku942tgm1qAHcATnWjJ1yaEMM4W2zU
3z9S6x3w4I4bjWnAsfpksWKaOd8AAAGQMV/5rwAABAMASDBGAiEAscBazkEk2Wgt
6stYO3hoyEIS92P3evwIO2ttt4x4eGMCIQCMLK5TZTVQ0+V+lhMiTIR73P546FXe
AFYuxlI2EsStPDANBgkqhkiG9w0BAQsFAAOCAQEAoJhiEnrwyGZSzjn0FH+vnQY/
t7u6p75wY/W/7RJ0ed4fPywLYo7U4BnSVVHuM6Zfb4DRqZe8DQ4Nw2u1uMNUbJlU
6YQkg7j+URWNzkOJVc2cuSgsaCY3ECCXQmWQGbZmHLlGUTMw5rP24PJekCvweuNs
GY086vOrireKtvs62g0i33c3wMo0PsobT0RViH3vJGh0/qkUqsY8tV14y7AlmiHD
aAI4bLWP3VlbPdelu8idp+XnGXd/QEgkxfG9AwwFex5FmhCloky5v0WTvioC4kfy
SMqIuLsBnWgk+wKk2CRXK6Xa65rbPVXo3RR4OSDn7skPF7epAOtqATzFJeO3Mw==
-----END CERTIFICATE-----
1 s:CN=Apple Public Server RSA CA 12 - G1, O=Apple Inc., ST=California, C=US
i:C=GB, ST=Greater Manchester, L=Salford, O=Comodo CA Limited, CN=AAA Certificate Services
a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
v:NotBefore: Jun 19 00:00:00 2019 GMT; NotAfter: Dec 6 23:59:59 2028 GMT
-----BEGIN CERTIFICATE-----
MIIEkDCCA3igAwIBAgIQCuSPIwEwZEGSWeHCmumNGDANBgkqhkiG9w0BAQsFADB7
MQswCQYDVQQGEwJHQjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYD
VQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UE
AwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTE5MDYxOTAwMDAwMFoXDTI4
MTIwNjIzNTk1OVowZDErMCkGA1UEAxMiQXBwbGUgUHVibGljIFNlcnZlciBSU0Eg
Q0EgMTIgLSBHMTETMBEGA1UEChMKQXBwbGUgSW5jLjETMBEGA1UECBMKQ2FsaWZv
cm5pYTELMAkGA1UEBhMCVVMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
AQC9vhI3XrifeRWYC+x6U5sPCaYAPncBLBBsyQdt7ztiyROEG6fEKZG1tToZMES3
jtgqV+7RcBV9xX2jVeU+EwAnHkIpwoDWcte0gLfALL3hkVcwXJoJaojVF8mMHlJt
QYTr3FYkZ6FqALt/LFUxeis3/Zgtug7EoqBsZeF5g79lSZtZqcNLm+3NuvZUdAHB
GIzD++wVlOhy9IxahD/Z7eIkpuJTedYVpLmnX/fHq92gYoNHezlNN8vdILlsPV4k
IdrwTKso7II25Kha0/l3hx2xEBtUIQLMGxKF+fD9AjcYhSMqhTM5/2tyud4QJxIy
409Dj4OhNooHAxurBDHwV8ZlAgMBAAGjggElMIIBITAfBgNVHSMEGDAWgBSgEQoj
PpbxB+zirynvgqV/0DCktDAdBgNVHQ4EFgQUHlwXkQVXAvx3XONwQ+xr/d3S2Gkw
DgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAh
BgNVHSAEGjAYMAwGCiqGSIb3Y2QFCwQwCAYGZ4EMAQICMBIGA1UdEwEB/wQIMAYB
Af8CAQAwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v
QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNAYIKwYBBQUHAQEEKDAmMCQGCCsG
AQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJKoZIhvcNAQELBQAD
ggEBAGa7XPTd+1lgnT/dDf2agLAIIXpbTn6XtEGMq9jovXbK076zHlQSWapd6Zd/
p/uWydwuTbd+cobkUTFZhKGMkY0e8gXgI2s09kQ0EfotFUOdQ7qf1U+UM7JIEZmD
gsTn9vBLNwbtwH9t6cvYxH//VhWyL07pPkfTFBVqvAprGZ9MgraZD2S9qYu9usfS
vuH4lr4b3NuZ7mh3zOs4aD3Omgx30DU8DV82LikGN4/MF+uDOGgHtPv0ozlvPrFc
8bsE+lTnjP199w5X+kPtpzrkjYPNrGxTg4nhugo6y+GPOCl00S+T/794oTq/HFlj
6IoOvOR7UaKo39qnYwA6Fs0F0to=
-----END CERTIFICATE-----
---
Server certificate
subject=C=US, ST=California, O=Apple Inc., CN=api.push.apple.com
issuer=CN=Apple Public Server RSA CA 12 - G1, O=Apple Inc., ST=California, C=US
---
Acceptable client certificate CA names
C=US, O=Apple Inc., OU=Apple Certification Authority, CN=Apple Root CA
CN=Apple Worldwide Developer Relations Certification Authority, OU=G4, O=Apple Inc., C=US
CN=Apple Application Integration 2 Certification Authority, OU=Apple Certification Authority, O=Apple Inc., C=US
CN=Apple Corporate Authentication CA 1, OU=Certification Authority, O=Apple Inc., C=US
C=US, O=Apple Inc., OU=Apple Worldwide Developer Relations, CN=Apple Worldwide Developer Relations Certification Authority
CN=Apple Corporate Root CA, OU=Certification Authority, O=Apple Inc., C=US
C=US, O=Apple Inc., OU=Apple Certification Authority, CN=Apple Application Integration Certification Authority
Requested Signature Algorithms: ECDSA+SHA256:RSA-PSS+SHA256:RSA+SHA256:ECDSA+SHA384:RSA-PSS+SHA384:RSA+SHA384:RSA-PSS+SHA512:RSA+SHA512:RSA+SHA1
Shared Requested Signature Algorithms: ECDSA+SHA256:RSA-PSS+SHA256:RSA+SHA256:ECDSA+SHA384:RSA-PSS+SHA384:RSA+SHA384:RSA-PSS+SHA512:RSA+SHA512
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 4564 bytes and written 439 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Protocol: TLSv1.3
Server public key is 2048 bit
This TLS version forbids renegotiation.
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
Protocol : TLSv1.3
Cipher : TLS_AES_256_GCM_SHA384
Session-ID: C54814B61097CB6335B6AD6CCDEF4B3AAC14754BF85C03C056B33A188BD1D07B
Session-ID-ctx:
Resumption PSK: A9674C3FDFF9E741D6345E090A4D12BACCED115D57AC1BE1797D1406702AE86D1D281E5D0F15AB10735F8F29A073FB4A
PSK identity: None
PSK identity hint: None
SRP username: None
TLS session ticket lifetime hint: 172800 (seconds)
TLS session ticket:
0000 - a5 8e ee fe 44 9d 87 ef-96 ac 2e a9 eb 89 64 d2 ....D.........d.
0010 - bf 89 51 78 47 dd f8 4f-40 e9 42 04 57 65 70 2b ..QxG..O@.B.Wep+
0020 - 19 bb ec 0c 8e 43 ed e8-20 b0 55 c9 1c ab d5 c2 .....C.. .U.....
0030 - f3 00 56 81 b9 10 70 fe-98 84 47 b7 e5 f3 4b 8a ..V...p...G...K.
0040 - f3 e9 09 72 7c 53 c9 df-d7 3e 97 7b 50 eb 80 8d ...r|S...>.{P...
0050 - 94 05 43 15 2a 3f 86 3b-b8 aa 0e 2e fd a6 16 aa ..C.*?.;........
0060 - ba 2a d3 68 cd cc 52 af-07 1c 5a 55 d2 9d 7c 90 .*.h..R...ZU..|.
0070 - 13 a0 8b db 4c 46 a6 77-cd b1 bc 04 80 e9 9d 04 ....LF.w........
0080 - 1e b4 78 eb 13 28 43 af-9a 4d 89 8e 82 3f 97 a1 ..x..(C..M...?..
0090 - 36 e5 29 af f3 52 ef 0e-db 20 5b bf 43 d8 82 8a 6.)..R... [.C...
00a0 - 8f 00 c8 69 4f f4 c0 19-c8 81 4c 4d 10 3d 73 6c ...iO.....LM.=sl

Start Time: 1737430470
Timeout : 7200 (sec)
Verify return code: 0 (ok)
Extended master secret: no
Max Early Data: 0
---
read R BLOCK
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
Protocol : TLSv1.3
Cipher : TLS_AES_256_GCM_SHA384
Session-ID: 3733C569A0566154B52029C29BE0F7BF234BCA0F1BC90E8468CA3C6892FD7E0B
Session-ID-ctx:
Resumption PSK: 0FE6D0700E5F948E1EB061CEB86C8B4F6ACA65EF778D8EDCCFB9D2148F5AEBD9780BDA752099A9503DD7E769D94E5B58
PSK identity: None
PSK identity hint: None
SRP username: None
TLS session ticket lifetime hint: 172800 (seconds)
TLS session ticket:
0000 - a5 8e ee fe 44 9d 87 ef-96 ac 2e a9 eb 89 64 d2 ....D.........d.
0010 - 88 a5 e7 e8 f1 c4 65 1e-62 c5 c0 1d 75 ad a4 ba ......e.b...u...
0020 - 99 95 43 96 da 48 3b cd-48 c0 61 0e 89 e9 f3 5e ..C..H;.H.a....^
0030 - 9e d0 2c 20 18 69 4f a3-e2 88 26 86 be cc b3 35 .., .iO...&....5
0040 - a5 d9 86 f1 d1 8c 48 9e-25 7e 37 09 6c e4 9b 51 ......H.%~7.l..Q
0050 - a2 c3 37 44 0d df fe 8b-5d 9a 1b 46 58 06 6d 92 ..7D....]..FX.m.
0060 - 10 a1 52 bb ed 58 ca d4-ac 8f 62 a8 f9 a5 31 66 ..R..X....b...1f
0070 - a4 d4 df 46 7b f4 84 5b-f4 e3 32 f7 04 66 fd 0c ...F{..[..2..f..
0080 - 79 92 f3 d1 5d 11 3e 4b-f5 27 f8 28 9b 36 5f 30 y...].>K.'.(.6_0
0090 - 19 ff 65 58 43 74 c7 2c-0c 35 47 38 ed fa 46 b4 ..eXCt.,.5G8..F.
00a0 - 6a 52 81 6f 68 90 ae 5d-1e 28 8d 3d 91 94 cd 46 jR.oh..].(.=...F

Start Time: 1737430470
Timeout : 7200 (sec)
Verify return code: 0 (ok)
Extended master secret: no
Max Early Data: 0
---
read R BLOCK
@@
命令结果分析方法

执行 openssl s_client -connect api.push.apple.com:443 -showcerts 命令后,你会得到服务器的 SSL/TLS 连接详细信息以及证书链的输出。以下是如何解读该命令的结果:


  1. 连接信息

输出的开头部分会显示与服务器建立连接的情况,类似于:

1
CONNECTED(00000003)

这表示成功连接到目标主机的 443 端口(HTTPS 默认端口)。


  1. 证书链

接下来,命令会显示服务器证书以及中间证书的详细信息(如果有)。-showcerts 选项会打印出所有证书,包括服务器证书和任何中间证书。例如:

1
2
3
-----BEGIN CERTIFICATE-----
MIIDdzCCAl+gAwIBAgIEbH1ETjANBgkqhkiG9w0BAQsFADCBhDELMAkGA1UEBhMC...
-----END CERTIFICATE-----

每个证书段之间是 -----BEGIN CERTIFICATE----------END CERTIFICATE-----,它们表示证书的开始和结束。


  1. 证书的验证信息

每个证书都包含验证的层级。例如:

1
2
3
4
5
6
depth=2 C=GB, ST=Greater Manchester, L=Salford, O=Comodo CA Limited, CN=AAA Certificate Services
verify return:1
depth=1 CN=Apple Public Server RSA CA 12 - G1, O=Apple Inc., ST=California, C=US
verify return:1
depth=0 C=US, ST=California, O=Apple Inc., CN=api.push.apple.com
verify return:1

这里的 depth 是证书链的层级(depth=0 是服务器证书,depth=1 是中间证书,depth=2 是根证书)。verify return:1 表示验证成功。


  1. SSL/TLS 握手

在连接建立之后,接下来会显示关于 SSL/TLS 握手的详细信息,类似于:

1
SSL handshake has read 4564 bytes and written 439 bytes

这部分显示了 SSL/TLS 握手中读写的字节数。


  1. 证书有效性验证

如果服务器的证书经过了正确的验证并且是可信的,输出会显示:

1
Verify return code: 0 (ok)

这意味着证书被成功验证,没有问题。如果验证失败,返回的错误码会更高,例如:

1
Verify return code: 18 (self signed certificate)

Verify return code: 18 表示证书是自签名证书,因此无法通过公共证书颁发机构的验证。


  1. 加密算法和密钥交换信息

输出中还会包含与加密算法、密钥交换算法相关的信息。例如:

1
Cipher    : TLS_AES_256_GCM_SHA384

这里的 Cipher 是当前会话使用的加密套件,表示加密通信的具体算法。


  1. 握手和证书验证通过
1
2
3
4
---
SSL handshake has read 4564 bytes and written 439 bytes
Verification: OK
---
  • SSL handshake has read 4564 bytes and written 439 bytes: 这表示在 SSL/TLS 握手过程中,客户端与服务器之间交换了数据。read 4564 bytes 表示客户端从服务器读取了 4564 字节的数据(包括证书和其他握手消息),written 439 bytes 表示客户端发送了 439 字节的数据(包括客户端的证书请求、加密参数等)。
  • Verification: OK: 这一行表示证书验证通过,即客户端成功验证了服务器的证书,包括验证证书的签名、有效期、颁发机构(CA)等信息。如果验证失败,这里会显示相关的错误信息或警告。

总结

  • CONNECTED:显示连接状态。
  • 证书链:显示服务器证书和中间证书。
  • 验证信息:证书的验证过程,查看是否通过验证。
  • SSL/TLS 握手:有关握手过程的字节数。
  • 证书验证代码:显示证书的验证结果。
  • 加密套件:显示当前使用的加密套件。

你可以通过这些信息来检查与服务器的 SSL/TLS 连接是否成功,以及证书的有效性。





port

端口号是传输层(TCP/IP 模型)的核心概念。以下是详细解释:

一、端口号的本质

  • 传输层标识
    端口号是传输层协议(如 TCP 或 UDP)的 “地址标签”,用于区分同一台主机上的不同应用进程。
    • 例如:
      • 浏览器通过 TCP 80 与 Web 服务器通信(HTTP 协议)。
      • 邮件客户端通过 TCP 25 发送邮件(SMTP 协议)。
  • 协议独立性
    TCP 和 UDP 的端口号是独立分配的。例如:
    • TCP 80UDP 80 是两个完全独立的端口。
    • Consul 的 TCP 8301(服务器通信)和 UDP 8301(Gossip 广播)就是典型例子。

二、端口号的作用范围

  • 仅在传输层有效
    端口号的作用仅限于传输层,与应用层协议无关。例如:
    • HTTP 协议默认使用 TCP 80,但也可以配置为其他端口(如 TCP 8080)。
    • 即使 HTTP 使用 TCP 8080,它仍然是应用层协议,端口号仅用于传输层寻址。
  • OSI 模型对比
    在 OSI 七层模型中,端口号属于传输层(第 4 层),而 IP 地址属于网络层(第 3 层)。两者结合形成完整的网络地址(如 IP:Port)。

三、常见误解澄清

  1. “端口属于应用层”

    • 错误:应用层协议(如 HTTP、DNS)通常默认使用特定端口,但端口号本身由传输层管理。
    • 示例:DNS 协议既可以通过 UDP 53(查询)也可以通过 TCP 53(区域传输),这说明端口号与协议的绑定是灵活的。
  2. “同一端口不能被不同协议使用”

    • 错误:同一端口号可以被不同协议的服务使用,只要它们属于不同的传输层协议(如 TCP 和 UDP)。

    • 示例:

      1
      2
      # 同时存在TCP和UDP的8301端口
      lsof -i :8301

四、总结:端口号的关键属性

特性 说明
协议绑定 每个端口号属于一个传输层协议(TCP 或 UDP),不同协议可复用同一端口号。
作用范围 仅在传输层有效,用于区分同一主机上的不同进程。
动态分配 1024-65535 为动态端口,可由应用程序随机选择。
知名端口 0-1023 为系统保留端口,用于 HTTP(80)、SSH(22)等标准服务。

五、实践意义

  • 避免端口冲突:部署服务时,需确保同一协议下的端口未被占用(如 TCP 80 已被 Web 服务器使用时,其他服务无法再绑定 TCP 80)。
  • 协议兼容性:若需复用端口号,可通过不同协议实现(如自定义服务使用 UDP 8301,与 Consul 的 TCP 8301 共存)。

理解端口号的传输层本质,有助于正确配置网络服务、排查端口冲突,并设计高可用性的分布式系统(如 Consul 集群)。





ps

1. 命令概述

ps(Process Status)用于查看当前系统中的进程状态。
常用场景:监控进程资源占用、排查异常进程、终止进程等。


2. 基本语法

1
ps [选项]

3. 常用选项

BSD 风格选项

选项 含义
-a 显示所有用户的进程(包括其他用户)。
-u 显示进程的详细信息(如用户、CPU 使用率、内存占用等)。
-x 显示没有控制终端的进程(如守护进程)。
-e 显示所有进程(等价于 -A)。
-f 显示完整格式的进程信息(包括父进程 ID、启动时间等)。
1
2
ps aux       # 显示所有用户的进程及详细信息
ps -ef # 显示所有进程的完整格式信息

System V 风格选项

选项 含义
-C 按命令名称过滤进程(如 ps -C firefox)。
-p 按 PID 过滤进程(如 ps -p 1234)。
1
2
ps -C sshd       # 查看 SSH 服务进程
ps -p 1 # 查看 PID 为 1 的进程(systemd)

4. 输出字段说明

常用字段解释:

  • PID:进程 ID(唯一标识符)。
  • USER:进程所有者。
  • %CPU:CPU 使用率(百分比)。
  • %MEM:内存使用率(百分比)。
  • VSZ:虚拟内存大小(KB)。
  • RSS:常驻内存大小(KB)。
  • TTY:控制终端(? 表示无终端)。
  • STAT:进程状态(如 R 运行中,S 睡眠中,Z 僵尸进程)。
  • START:进程启动时间。
  • TIME:累计 CPU 时间。
  • COMMAND:启动进程的命令。

5. 高级用法

过滤与排序

  • 过滤特定进程:

    1
    2
    ps aux | grep firefox  # 查找 Firefox 相关进程
    ps -ef | grep python # 查找 Python 进程
  • 按 CPU 使用率排序

    1
    ps -eo pid,user,%cpu,%mem,command --sort=-%cpu  # 降序排列

显示进程树

1
ps -ejH  # 以层级结构显示进程树

6. 常见问题

  1. 如何终止进程?
    结合 kill 命令:

    1
    2
    kill <PID>          # 正常终止进程
    kill -9 <PID> # 强制终止进程
  2. 实时监控进程?
    使用 tophtop 命令。


7. 参考文档

1
man ps   # 查看完整手册




sftp

一、连接操作

操作场景 命令示例 关键说明
默认端口连接 sftp username@192.168.1.100 端口默认 22,替换实际用户名 / IP
指定端口连接 sftp -P 2222 username@192.168.1.100 -P(大写)指定非默认端口
指定私钥连接 sftp -i /home/username/id_rsa username@192.168.1.100 -i指定 SSH 私钥文件路径
自定义 SSH 参数连接 sftp -o Port=2222 -o ConnectTimeout=10 username@192.168.1.100 -o设置端口、超时等参数

二、文件传输操作

(1)上传(本地→远程,含指定目录)

操作类型 命令示例 说明
单个文件上传到远程当前目录 put app.log 无指定目录时,默认上传到远程当前工作目录
单个文件上传到指定远程目录 put /home/username/config.yaml /etc/ 本地文件→远程指定目录(目录需存在)
单个文件上传并重命名 put local.txt /remote/new_name.txt 上传时修改远程文件名称
多文件上传到指定远程目录 put *.txt /opt/docs/ 通配符匹配本地文件,上传到远程指定目录
本地目录上传到指定远程目录 put -r /home/username/data /opt/ -r递归上传本地目录到远程指定目录
断点续传上传到指定目录 put -P large_file.tar.gz /data/backup/ 大文件续传至远程指定目录

(2)下载(远程→本地,含指定目录)

操作类型 命令示例 说明
单个文件下载到本地当前目录 get access.log 无指定目录时,默认下载到本地当前工作目录
单个文件下载到指定本地目录 get /var/log/nginx.log /home/username/logs/ 远程文件→本地指定目录(目录需存在)
单个文件下载并重命名 get /remote/file.txt /local/new_file.txt 下载时修改本地文件名称
多文件下载到指定本地目录 get *.log /home/username/backup_logs/ 通配符匹配远程文件,下载到本地指定目录
远程目录下载到指定本地目录 get -r /opt/project /home/username/ -r递归下载远程目录到本地指定目录
断点续传下载到指定目录 get -P large_data.zip /home/username/downloads/ 大文件续传至本地指定目录

三、交互式辅助命令

命令 作用 适用对象
pwd 查看当前工作目录 远程服务器
lpwd 查看当前工作目录 本地机器
cd 路径 切换目录 远程服务器
lcd 路径 切换目录 本地机器
ls 列出文件 / 目录 远程服务器
lls 列出文件 / 目录 本地机器
mkdir 目录名 新建目录 远程服务器
rm 文件路径 删除文件 远程服务器
rmdir 目录名 删除空目录 远程服务器
exit/quit 退出 SFTP 交互界面 -

四、常见问题及解决

问题现象 原因分析 解决方法
中文目录乱码 / 无法访问 编码不统一(非 UTF-8) 服务器:export LC_ALL=en_US.UTF-8;客户端:终端切换为 UTF-8(如 cmd 执行chcp 65001
连接失败(参数错误) -P端口参数放地址后 调整为:sftp -P 2222 username@192.168.1.100(选项在前,地址在后)
权限拒绝(Permission denied) 目标目录无读写权限 确认用户对远程 / 本地目录的w/r权限,或切换有权限的用户
上传目录提示 “not a regular file” 未加-r参数 上传目录需添加-r递归参数(如put -r 本地目录 远程目录
端口无法连通 防火墙 / 安全组未开放端口 远程服务器执行 ss -tulpngrep sshd 检查端口监听,开放对应端口




SS

https://www.koogua.com/article/139





sudo & su

一、核心区别总结

功能 sudo su
切换方式 临时以目标用户权限执行命令 完全切换到目标用户的 shell 会话
生效范围 仅当前终端的单次命令有效 所有后续操作均以目标用户身份执行
环境变量 默认继承当前用户的环境(可通过 -i 加载目标用户环境) 完全加载目标用户的环境(使用 su -
密码要求 需要当前用户的密码(需 sudo 权限) 需要目标用户的密码(root 或普通用户)
安全性 更安全,仅允许执行特定命令 风险较高,直接获得目标用户的完全控制权

二、详细对比

1. 临时执行 vs 完全切换

  • sudo

    • 仅执行 单个命令,执行完毕后恢复原用户身份。

    • 示例:

      1
      sudo -u user1 ls /home/user1  # 以 user1 身份执行 ls 命令,执行后仍为原用户
  • su

    • 切换到目标用户的 完整 shell 会话,所有后续操作均以目标用户身份进行。

    • 示例:

      1
      su - user1  # 切换到 user1 用户,需输入 user1 的密码,环境完全变更

2. 环境变量继承

  • sudo

    • 默认继承当前用户的环境变量(如 PATHHOME)。

    • 若需加载目标用户的环境,需使用-i选项:

      1
      sudo -u root -i  # 等价于 sudo -i,加载 root 的环境
  • su

    • 使用 su 切换用户时,不加载目标用户的配置文件(如 .bashrc)。

    • 使用su -

      可完全加载目标用户的环境:

      1
      su - user1  # 加载 user1 的 ~/.bashrc、~/.profile 等

3. 权限与安全

  • sudo
    • /etc/sudoers 文件控制,可精细配置允许执行的命令。
    • 无需知道目标用户密码,依赖当前用户的 sudo 权限。
  • su
    • 直接使用目标用户的密码验证,若切换到 root,需知道 root 密码。
    • 若配置不当,可能导致权限滥用风险。

三、典型使用场景

场景 1:临时执行特权操作

  • 推荐:

    1
    sudo <命令>
    1
    sudo apt update  # 以 root 身份更新软件包列表

场景 2:完全切换用户环境

  • 推荐:

    1
    su - <用户名>
    1
    su - devuser  # 切换到 devuser 并加载其环境,适合长期操作

场景 3:快速获取 root 权限

  • 推荐:

    1
    sudo su
    1
    sudo su  # 切换到 root,需当前用户有 sudo 权限,退出用 exit

四、注意事项

  1. 避免混淆 sudo susudo -i
    • sudo su:切换到 root,但环境变量继承自当前用户。
    • sudo -i:切换到 root 并加载其完整环境(等价于 su - root)。
  2. 安全建议
    • 避免长期使用 su 切换到 root,推荐用 sudo 执行具体命令。
    • 定期检查 /etc/sudoers 文件,确保权限配置最小化。
  3. 环境变量问题
    • 若需保留当前用户环境,使用 sudo -E(例如:sudo -E echo $PATH)。

五、对比表格

需求 sudo 命令示例 su 命令示例
临时执行 root 命令 sudo apt install nginx su -c "apt install nginx"
完全切换到 root 环境 sudo -i su - root
切换到普通用户并加载其环境 sudo -u user1 -i su - user1
执行单个非特权用户命令 sudo -u user1 ls /home/user1 su - user1 -c "ls /home/user1"

通过合理选择 sudosu,可平衡操作灵活性与系统安全性。





tee

一、命令用途

将输入的数据同时输出到 标准输出(终端)指定文件,常用于保存命令执行结果或实时监控数据流。


二、基本语法

1
tee [选项] 文件名

三、常用选项

选项 说明
-a 追加内容到文件(不覆盖原内容)
-i 忽略中断信号(如 Ctrl+C
-p 显示文件创建或覆盖的提示
--help 查看帮助信息

四、示例

  1. 覆盖写入文件

    1
    echo "Hello World" | tee output.txt

    输出内容会显示在终端,并写入 output.txt(若文件存在则覆盖)。

  2. 追加内容到文件

    1
    echo "Appended line" | tee -a output.txt

    内容追加到 output.txt 末尾。

  3. 处理命令输出

    1
    ls -l | tee file_list.txt

    列出目录内容,同时保存到 file_list.txt

  4. 写入多个文件

    1
    echo "Data" | tee file1.txt file2.txt

    数据同时写入 file1.txtfile2.txt,并显示在终端。


五、注意事项

  1. 权限问题

    • 若目标文件需管理员权限,需使用sudo

      1
      echo "Config" | sudo tee /etc/config.conf
  2. 与重定向的区别

    • > 仅写入文件,不显示终端;
    • tee 同时显示终端和写入文件。
  3. 实时监控数据流

    • 可用于日志实时查看:

      1
      tail -f /var/log/app.log | tee log_backup.txt

六、总结

  • 核心功能:分流数据到终端和文件。
  • 常用场景:保存命令输出、实时日志记录、多文件备份。
  • 关键选项-a(追加)、-i(忽略中断)、配合 sudo 处理系统文件。




telnet

一、最常见用途:端口连通性检测

场景:确认目标主机的端口是否开放,排查服务可用性。
语法

1
telnet [IP/域名] [端口号]

示例

  • 检查 Web 服务器 80 端口:telnet example.com 80
  • 检查 SSH 服务 22 端口:telnet 192.168.1.100 22

结果判断

  • 若连接成功(显示空白或提示输入),说明端口开放;
  • 若提示Connection refused或超时,说明端口关闭或服务未启动。

二、其他实用用法简记

  1. 远程登录(旧设备管理)

    • 适用于不支持 SSH 的路由器、交换机(如 Cisco 设备),命令:telnet 设备IP
    • 注:需提前知道用户名 / 密码,且存在安全风险。
  2. 基础网络调试

    • 测试服务器响应(如输入 HTTP 请求查看返回):

      1
      2
      3
      4
      telnet www.baidu.com 80  
      GET / HTTP/1.1
      Host: www.baidu.com
      (回车两次)

三、跨平台操作简记

系统 操作要点
Windows - 直接在命令行输入命令 - 若提示 “不是内部命令”,需在【控制面板→程序→启用 Windows 功能】中勾选 “Telnet 客户端”
Linux/macOS - 需先安装:sudo apt install telnet(Debian 系)或brew install telnet(macOS) - 连接后按Ctrl+]进入命令模式,输入quit退出

四、安全风险与替代方案

  • 风险:明文传输密码,易被监听,不建议在公网使用。
  • 替代方案
    • 端口检查:用nc(netcat)更灵活,如nc -zv IP 端口
    • 远程管理:优先用SSH(加密传输,支持密钥认证)。

五、快速故障排查步骤

  1. 确认 IP / 端口是否正确(如 Web 服务默认 80/443,SSH 默认 22);
  2. 检查本地防火墙是否阻止连接(Windows 防火墙或 Linux 的 iptables);
  3. 在目标主机上用netstat -an | grep 端口确认服务是否启动。qui

总结:Telnet 当前最核心价值是端口连通性检测,操作简单但需注意安全,复杂场景建议用更专业的工具(如 nc)或加密协议(SSH)。





traceroute

traceroute(Windows 系统对应 tracert)是网络路由追踪工具,核心作用是:显示数据包从本地主机到目标主机的「每一跳路由路径」,通过延迟、超时等信息定位网络故障点(如 IP 屏蔽、路由中断、延迟过高)。

一、速查表(核心语法 + 参数 + 输出解读)

  1. 基本语法(跨系统差异)
系统 命令格式 核心区别(协议)
Mac/Linux traceroute [参数] 目标地址 默认用 UDP 协议(端口 33434-33534)
Windows tracert [参数] 目标地址 默认用 ICMP 协议(部分网络会屏蔽 ICMP)

目标地址支持:域名(如 dochub.gxtree.com)、IP 地址(如 64.29.17.65

  1. 常用参数(实用优先)
参数 作用说明 适用场景
-I(Linux) 改用 ICMP 协议(替代默认 UDP) UDP 被屏蔽时(如部分公司防火墙)
-T(Linux) 改用 TCP 协议(目标端口 80/443) 需穿透多层防火墙(模拟浏览器访问)
-m 跳数 指定最大跳数(默认 64/30 跳) 排查长路由(如海外网站)
-w 超时时间 指定每跳超时时间(单位:秒,默认 5 秒) 加快检测速度(如 -w 1
-n 不解析域名(仅显示 IP) 避免 DNS 解析延迟,快速输出结果
-p 端口 指定 UDP/TCP 端口(如 -p 443 测试特定端口连通性

示例:traceroute -I -w 1 -m 30 dochub.gxtree.com(ICMP 协议 + 1 秒超时 + 最大 30 跳)

  1. 输出结果解读

以你的实际输出为例:

1
❯ traceroute dochub.gxtree.com
1
2
3
4
5
6
7
8
traceroute to 3d15e56887c7d05b.vercel-dns-017.com (64.29.17.65), 64 hops max, 40 byte packets
1 172.16.4.49 (172.16.4.49) 56.340 ms 7.703 ms 15.377 ms # 跳数1:本地网关(内网IP)
2 172.16.66.1 (172.16.66.1) 6.244 ms 8.384 ms 5.531 ms # 跳数2:公司内网路由
3 143.92.71.113 (143.92.71.113) 45.456 ms 47.665 ms 48.580 ms # 跳数3:运营商骨干网
4 143.92.108.203 (143.92.108.203) 46.573 ms
143.92.108.201 (143.92.108.201) 49.582 ms 75.113 ms # 跳数4:运营商路由分支
5 * 143.92.71.19 (143.92.71.19) 47.851 ms * # 跳数5:部分超时(正常波动)
6 * * * # 跳数6+:全超时(路由中断)
输出项 含义 异常判断标准
跳数(1/2/3…) 数据包经过的路由节点序号 跳数越多,路由越长(海外网站通常 10+ 跳)
IP / 域名 每跳路由节点的 IP 或解析后的域名 内网 IP(10.x.x.x/172.16.x.x/192.168.x.x)→ 运营商 IP → 目标 IP
延迟(ms) 数据包往返时间(3 个数值为 3 次测试) 延迟 > 100ms 为高延迟;> 500ms 可能是跨地域 / 网络拥堵
* 超时 该跳路由未返回响应(数据包丢失) 单跳 1-2 个 * 是正常波动;连续 3 跳 + * 说明路由中断

二、实战案例(覆盖常见网络问题)

案例 1:目标 IP 被屏蔽(你的实际场景)

现象:

  • 非公司网络(手机热点)访问正常,公司网络访问报错 ERR_CONNECTION_RESET
  • traceroute 显示前几跳(内网 + 运营商)正常,后续跳全 * 超时(如你的输出跳数 6+ 全超时)。

结论:

目标 IP 段(如 Vercel 的 64.29.17.65)被公司防火墙 / 网关拦截。





Terminal and Shell

终端(Terminal)和 Shell 是用户与操作系统交互的核心工具,它们的关系如下:


一、定义

  1. 终端(Terminal)
    • 是什么:用户与操作系统交互的图形界面(如 macOS 的「终端」、iTerm2)。
    • 作用:显示文本输出,并允许用户输入命令。
    • 本质:是一个「终端仿真器」,模拟传统电传打字机的功能。
  2. Shell
    • 是什么:运行在终端中的命令解释器程序(如 Bash、Zsh)。
    • 作用:接收用户输入的命令,解析并执行,将结果返回给终端。
    • 本质:是用户与操作系统内核之间的桥梁。

二、核心关系

  1. 终端调用 Shell
    • 当你打开终端时,它会自动启动一个默认的 Shell(如 macOS 默认使用 zsh)。
    • 用户在终端输入的命令(如 ls)由 Shell 解析并执行。
  2. Shell 依赖终端
    • Shell 本身不提供界面,需要通过终端(或 SSH 等远程连接工具)与用户交互。
    • Shell 的输出(如文件列表)会通过终端显示。

三、常见终端与 Shell 组合

终端 常见 Shell 特点
macOS 终端 zsh(默认) 预装,适合日常使用。
iTerm2 zsh/bash 功能强大,支持分屏、主题等。
Windows 终端 PowerShell/cmd 微软官方工具,兼容旧版命令。
Git Bash bash 专为 Git 设计,模拟 Linux 环境。

四、如何查看 / 切换 Shell

  1. 查看当前 Shell

    1
    echo $SHELL  # 输出如 /bin/zsh 或 /bin/bash
  2. 切换 Shell

    • 临时切换

      (当前终端有效):

      1
      2
      bash  # 切换到 Bash
      zsh # 切换到 Zsh
    • 永久切换

      (修改默认 Shell):

      1
      2
      chsh -s /bin/zsh  # macOS 推荐 Zsh
      chsh -s /bin/bash # 切换回 Bash

五、为什么需要区分?

  1. 个性化配置
    • Shell 支持自定义配置文件(如 .bashrc.zshrc),可以添加别名、主题、插件等(如 Oh My Zsh)。
    • 终端本身的配置(如配色、快捷键)与 Shell 无关。
  2. 跨平台兼容性
    • 同一 Shell(如 Bash)可以在不同终端(如 iTerm2、Git Bash)中运行。
    • 不同 Shell 的语法和功能可能不同(如 Zsh 支持更复杂的自动补全)。

六、总结

  • 终端:是你看到的界面,负责显示和输入。
  • Shell:是背后的引擎,负责处理命令。
  • 类比:终端像浏览器窗口,Shell 像浏览器内核(如 Chrome 的 V8 引擎)。

通过理解两者的关系,可以更高效地配置开发环境(如通过 Oh My Zsh 增强 Zsh 功能,或使用 iTerm2 的分屏功能提升效率)。

1
2
3
4
5
# 使用 curl 安装(推荐)
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

# 或使用 wget
sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

zsh 安装与配置,使用 oh-my-zsh 美化终端


ps:

终端经常进入预览状态(按Q取消)

查看详情





Terminal 改造

终端工具iTerm2

oh my zsh + 主题powerlevel10k + 命令高亮(zsh-syntax-highlighting)

zsh-syntax-highlighting安装

step1:

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
30
31
32
33
34
35
36
37
38
39
40
~ ···································································································································································································································································· 10:04:37
❯ brew install zsh-syntax-highlighting
==> Auto-updating Homebrew...
Adjust how often this is run with HOMEBREW_AUTO_UPDATE_SECS or disable with
HOMEBREW_NO_AUTO_UPDATE. Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
==> Auto-updated Homebrew!
Updated 4 taps (homebrew/services, coursier/formulas, homebrew/core and homebrew/cask).
==> New Formulae
ab-av1 cf-terraforming fpm gotz iguana keyutils lume ov restish shuttle unciv
adaptivecpp cloudfoundry-cli gcr grafana-alloy immich-go kirimase mox pivy rhai sttr x86_64-elf-grub
algolia decompose gersemi gtree jaguar krep netfetch projectable rpds-py tml yalantinglibs
alloy dvr-scan git-graph gut jenkins-cli largetifftools node-red protobuf@29 sdl3_ttf todoist yoke
anyquery evans globstar hishtory kafkactl lazyjournal nom punktf semver trdsql ytt
async_simple falcosecurity-libs gnome-online-accounts i686-elf-grub kapp libgoa org-formation ra-multiplex sentry-native typioca zlib-ng-compat
bpmnlint fortitude goimports icu4c@77 kbld libgudev otel-cli rattler-index sequoia-sqv umockdev
==> New Casks
candy-crisis desktime font-source-han-code-jp fuse-t nvidia-nsight-compute sokim veracrypt-fuse-t
charles@4 focu font-special-gothic-condensed-one irpf2025 opera-air soundanchor
cloudflare-warp@beta font-playpen-sans-arabic font-special-gothic-expanded-one kate pairpods trae
consul font-playpen-sans-hebrew font-winky-rough macskk pareto-security trae-cn
coterm font-sf-mono-nerd-font-ligaturized font-winky-sans mouseless@preview qt-design-studio ua-midi-control

You have 45 outdated formulae installed.

==> Fetching zsh-syntax-highlighting
==> Downloading https://mirrors.ustc.edu.cn/homebrew-bottles/bottles/zsh-syntax-highlighting-0.8.0.all.bottle.1.tar.gz
######################################################################################################################################################################################################################################################### 100.0%
==> Pouring zsh-syntax-highlighting-0.8.0.all.bottle.1.tar.gz
==> Caveats
To activate the syntax highlighting, add the following at the end of your .zshrc:
source /opt/homebrew/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh

If you receive "highlighters directory not found" error message,
you may need to add the following to your .zshenv:
export ZSH_HIGHLIGHT_HIGHLIGHTERS_DIR=/opt/homebrew/share/zsh-syntax-highlighting/highlighters
==> Summary
🍺 /opt/homebrew/Cellar/zsh-syntax-highlighting/0.8.0: 28 files, 206.4KB
==> Running `brew cleanup zsh-syntax-highlighting`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).

下载后在上面可以看到安装的地址为/opt/homebrew/Cellar/zsh-syntax-highlighting/0.8.0


step2:

安装地址 + /share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh

1
echo "source /opt/homebrew/Cellar/zsh-syntax-highlighting/0.8.0/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" >> ~/.zshrc

zsh提示工具:https://github.com/zsh-users/zsh-autosuggestions


fzf:https://zhuanlan.zhihu.com/p/436752581 强烈推荐一下这个工具

快捷键 功能
Ctrl + R 搜索命令历史
Ctrl + T 搜索文件并插入路径
Alt + C 搜索目录并跳转




Terminal 快捷键

1
sudo systemctl stop seatalk-platform.service
  • Alt + ←向左跳一个单词(按空格 / 符号分隔)从 seatalk-platform.service 后向左跳,直接到 stop
  • Alt + →向右跳一个单词stop 后向右跳,直接到 seatalk-platform.service
  • Ctrl+K:删除光标后的所有内容。




压缩/解压缩

一、基础工具安装

格式 所需工具 安装命令
zip unzip sudo apt update && sudo apt install unzip -y
tar.gz/bz2/xz tar 系统默认预装(无需额外安装)
7z p7zip-full sudo apt install p7zip-full -y

二、核心解压 / 查看命令

  1. ZIP 格式
功能 命令示例 关键参数
解压到当前目录 unzip filename.zip -
解压到指定目录 unzip filename.zip -d /目标路径 -d
查看内容(不解压) unzip -l filename.zip -l
强制覆盖 unzip -o filename.zip -o
  1. TAR 系列格式(tar.gz/tar.bz2/tar.xz)
格式 解压命令 查看内容命令 关键参数
tar.gz tar -zxvf filename.tar.gz tar -ztvf filename.tar.gz -z(gzip)
tar.bz2 tar -jxvf filename.tar.bz2 tar -jtvf filename.tar.bz2 -j(bzip2)
tar.xz tar -Jxvf filename.tar.xz tar -Jtvf filename.tar.xz -J(xz)
解压到指定目录 tar -zxvf filename.tar.gz -C /目标路径 - -C
  1. 7Z 格式
功能 命令示例 关键参数
解压到当前目录 7z x filename.7z x(完整解压)
解压到指定目录 7z x filename.7z -o/目标路径 -o(无空格)
查看内容(不解压) 7z l filename.7z l

三、特殊场景处理

  1. ZIP 中文乱码

    UNZIP="-O CP936" unzip filename.zipunar filename.zip(需先装 unar:sudo apt install unar

  2. 解压系统目录(需权限)

    示例:sudo tar -zxvf filename.tar.gz -C /opt/目标目录

  3. 检查压缩包完整性

    • ZIP:unzip -t filename.zip
    • 7Z:7z t filename.7z
  4. 快速压缩(附)

    • ZIP:zip -r output.zip 目标文件/目录
    • tar.gz:tar -zcvf output.tar.gz 目标文件/目录
    • 7Z:7z a output.7z 目标文件/目录




防火墙

ufw

ufw(Uncomplicated Firewall)是 Ubuntu 等 Debian 系系统中常用的防火墙管理工具,命令简洁易上手。以下是最常用的 ufw 命令总结,按功能分类整理:


一、基础状态管理

命令 功能
sudo ufw status 查看防火墙状态(活跃 /inactive,及已配置规则)
sudo ufw status verbose 查看详细状态(包括默认策略、规则的方向等)
sudo ufw status numbered 查看带编号的规则(方便删除特定规则)
sudo ufw enable 启用防火墙(生效已配置规则,开机自启)
sudo ufw disable 禁用防火墙(所有规则临时失效,开机不自启)
sudo ufw reset 重置防火墙(删除所有规则,恢复默认状态,需重新配置)

二、规则配置(允许 / 拒绝访问)

  1. 按端口 / 协议配置(最常用)
命令 功能
sudo ufw allow 端口号 允许所有协议(TCP+UDP)通过指定端口
sudo ufw allow 端口号/tcp 仅允许 TCP 协议通过指定端口(如 sudo ufw allow 22/tcp
sudo ufw allow 端口号/udp 仅允许 UDP 协议通过指定端口(如 sudo ufw allow 53/udp
sudo ufw deny 端口号/tcp 拒绝 TCP 协议通过指定端口
  1. 按 IP 地址配置(限制特定 IP 访问)
命令 功能
sudo ufw allow from 192.168.1.100 允许 IP 为 192.168.1.100 的主机访问所有端口
sudo ufw allow from 192.168.1.0/24 允许整个子网(192.168.1.x)访问所有端口
sudo ufw allow from 192.168.1.100 to any port 80/tcp 允许 192.168.1.100 通过 TCP 访问 80 端口
sudo ufw deny from 203.0.113.5 拒绝 IP 为 203.0.113.5 的主机访问
  1. 按服务名配置(简化常用服务)

系统预设了常见服务(如 ssh、http)的端口映射,可直接用服务名配置:

命令 功能
sudo ufw allow ssh 允许 SSH 服务(默认对应 22/tcp,等价于 allow 22/tcp
sudo ufw allow http 允许 HTTP 服务(80/tcp)
sudo ufw allow https 允许 HTTPS 服务(443/tcp)

三、删除规则

删除规则有两种方式(推荐用编号删除,更精准):

命令 功能
sudo ufw delete 规则编号 删除指定编号的规则(需先用 status numbered 查编号)例:sudo ufw delete 3(删除第 3 条规则)
sudo ufw delete allow 22/tcp 直接删除 “允许 22/tcp” 的规则(需与添加时的命令一致)

四、默认策略配置

默认策略用于定义 “未匹配任何规则时” 的行为(建议默认严格,按需开放):

命令 功能
sudo ufw default deny incoming 默认拒绝所有入站连接(只允许已配置的允许规则)
sudo ufw default allow incoming 默认允许所有入站连接(不推荐,安全性低)
sudo ufw default allow outgoing 默认允许所有出站连接(一般无需限制,保持默认即可)
sudo ufw default deny outgoing 默认拒绝所有出站连接(需手动配置允许的出站规则,慎用)

常用场景示例

  1. 新服务器初始化防火墙(只开放 SSH 和 80 端口):

    1
    2
    3
    4
    5
    sudo ufw default deny incoming   # 默认拒绝入站
    sudo ufw default allow outgoing # 默认允许出站
    sudo ufw allow ssh # 开放 SSH(22 端口)
    sudo ufw allow 80/tcp # 开放 HTTP(80 端口)
    sudo ufw enable # 启用防火墙
  2. 临时禁止某个 IP 访问:

    1
    sudo ufw deny from 1.2.3.4
  3. 查看并删除一条错误规则:

    1
    2
    sudo ufw status numbered   # 查编号(假设错误规则是第 2 条)
    sudo ufw delete 2 # 删除第 2 条规则

    这些命令覆盖了 ufw 的日常使用场景,记住核心逻辑:默认拒绝、按需允许,可大幅提升系统安全性





实践

查看进程环境变量

在Linux中查看进程的环境变量有几种常用方法:


方法一:使用 /proc/<PID>/environ 文件

  1. 查看指定PID进程的环境变量
1
2
3
4
5
6
7
8
# 基本查看(环境变量以null字符分隔)
cat /proc/<PID>/environ

# 格式化输出(将null字符替换为换行符)
cat /proc/<PID>/environ | tr '\0' '\n'

# 或者使用
strings /proc/<PID>/environ
  1. 实际例子
1
2
3
4
5
# 假设进程PID为1234
cat /proc/1234/environ | tr '\0' '\n'

# 查看特定环境变量
cat /proc/1234/environ | tr '\0' '\n' | grep PATH

方法二:使用系统工具

  1. 使用 ps 命令
1
2
3
4
5
# 显示进程的环境变量
ps eww <PID>

# 显示所有进程的环境变量
ps ewwaux
  1. 使用 xargs 和 printf
1
2
# 更好的格式化输出
cat /proc/<PID>/environ | xargs -0 -n1 echo

方法三:查看当前shell进程的环境变量

  1. 查看当前进程
1
2
3
4
5
# 查看当前shell的PID
echo $$

# 查看当前进程的环境变量
cat /proc/$$/environ | tr '\0' '\n'
  1. 使用 env 命令
1
2
3
4
5
# 显示当前进程的所有环境变量
env

# 或者
printenv

方法四:实用脚本

创建一个便捷的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 添加到 ~/.bashrc 或 ~/.zshrc
show_proc_env() {
if [ -z "$1" ]; then
echo "使用方法: show_proc_env <PID>"
return 1
fi

if [ ! -f "/proc/$1/environ" ]; then
echo "进程 $1 不存在或无权限访问"
return 1
fi

echo "进程 $1 的环境变量:"
echo "========================"
cat "/proc/$1/environ" | tr '\0' '\n' | sort
}

方法五:查找特定进程

  1. 先找到进程PID
1
2
3
4
5
# 根据进程名查找PID
pgrep <进程名>

# 或者使用ps
ps aux | grep <进程名>
  1. 组合使用
1
2
3
4
5
6
# 一条命令查看nginx进程的环境变量
for pid in $(pgrep nginx); do
echo "PID: $pid"
cat /proc/$pid/environ | tr '\0' '\n'
echo "---"
done

注意事项

  1. 权限限制:只能查看有权限访问的进程环境变量
  2. 进程状态:进程必须正在运行
  3. 格式问题:/proc/PID/environ 中的环境变量以null字符(\0)分隔,需要转换为可读格式
  4. 安全考虑:环境变量可能包含敏感信息(如密码、API密钥等)

常用组合命令

1
2
3
4
5
6
7
8
# 查看进程环境变量并高亮显示PATH
cat /proc/<PID>/environ | tr '\0' '\n' | grep --color=always PATH

# 查看进程环境变量并分页显示
cat /proc/<PID>/environ | tr '\0' '\n' | less

# 将进程环境变量保存到文件
cat /proc/<PID>/environ | tr '\0' '\n' > process_env.txt

这些方法可以帮你有效地查看和分析Linux系统中任何进程的环境变量。





python环境

通过系统包管理器安装(推荐新手)

Ubuntu 的官方软件源包含多个 Python 版本,可直接通过 apt 安装。

  1. 安装 Python3 及 pip
1
2
3
4
5
6
7
8
# 更新软件源列表
sudo apt update

# 安装Python3(若未预装)
sudo apt install python3

# 安装Python3的包管理器pip(必备,用于安装第三方库)
sudo apt install python3-pip

验证安装:

1
2
python3 --version  # 确认Python3版本
pip3 --version # 确认pip3版本
  1. 安装虚拟环境工具(推荐)

虚拟环境可隔离不同项目的依赖,避免版本冲突:

1
2
# 安装venv(Python3内置的虚拟环境工具)
sudo apt install python3-venv

使用方法:

1
2
3
4
5
6
7
8
# 创建虚拟环境(myenv为环境名,可自定义)
python3 -m venv myenv

# 激活虚拟环境(终端前缀会显示环境名)
source myenv/bin/activate

# 退出虚拟环境
deactivate




clash-cli

https://docs.lefly.co/contents/linux/clash-cli.html

访问文件有问题,就下载下来

https://github.com/Loyalsoldier/clash-rules/tree/release





脚本

> 查找可用端口区间

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#!/bin/bash

# 检查参数是否为有效的整数
is_valid_integer() {
if [[ $1 =~ ^[0-9]+$ ]]; then
return 0
else
return 1
fi
}

# 一次性获取指定范围内所有被占用的端口
get_used_ports() {
local start_port=$1
local end_port=$2
local temp_file=$(mktemp)
# 将 lsof 命令输出保存到临时文件,同时将错误输出重定向到 /dev/null
sudo lsof -PiTCP -sTCP:LISTEN -n 2>/dev/null > "$temp_file"
awk -v start="$start_port" -v end="$end_port" '{
split($9, parts, ":");
port = parts[2];
if (port >= start && port <= end) {
print port
}
}' "$temp_file" | sort -n | uniq
rm "$temp_file"
}

# 查找可用端口区间
find_available_port_ranges() {
local start_port=$1
local end_port=$2
local used_ports=($(get_used_ports "$start_port" "$end_port"))
local in_range=false
local start
for ((port = start_port; port <= end_port; port++)); do
local is_used=false
for used_port in "${used_ports[@]}"; do
if [[ $used_port -eq $port ]]; then
is_used=true
break
fi
done
if ! $is_used; then
if ! $in_range; then
start=$port
in_range=true
fi
else
if $in_range; then
local length=$((port - start))
if [[ $start -eq $((port - 1)) ]]; then
echo "$start ($length)"
else
echo "$start-$((port - 1)) ($length)"
fi
in_range=false
fi
fi
done
if $in_range; then
local length=$((end_port - start + 1))
if [[ $start -eq $end_port ]]; then
echo "$start ($length)"
else
echo "$start-$end_port ($length)"
fi
fi
}

# 检查是否传入了两个参数
if [ $# -ne 2 ]; then
echo "用法: $0 <起始端口> <结束端口>"
exit 1
fi

start_port=$1
end_port=$2

# 检查参数是否为有效的整数
if ! is_valid_integer "$start_port" || ! is_valid_integer "$end_port"; then
echo "错误: 端口号必须是有效的整数。"
exit 1
fi

# 检查起始端口是否小于等于结束端口
if [ "$start_port" -gt "$end_port" ]; then
echo "错误: 起始端口必须小于等于结束端口。"
exit 1
fi

# 查找并输出可用端口区间
echo "在 $start_port 到 $end_port 范围内的连续可用端口区间:"
find_available_port_ranges "$start_port" "$end_port"