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]=...




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   # 查看完整手册




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 处理系统文件。




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




Terminal 快捷键

  • Ctrl+U:删除光标前的所有内容(清空当前命令行)。
  • Ctrl+K:删除光标后的所有内容。




脚本

> 查找可用端口区间

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"