linux日常工作笔记
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 证书
- 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:通常会显示证书本身的标识信息。
- Issuer:应为
-
安装证书:
-
将
.pem格式的证书文件拷贝到/usr/local/share/ca-certificates/目录,然后运行以下命令:1
sudo update-ca-certificates
-
- 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 | |
- 选项:控制查询行为(如指定 DNS 服务器、显示详细信息等)。
- 域名:需要查询的目标域名(如
example.com)。 - 查询类型:可选值包括
A(IP 地址)、MX(邮件交换记录)、NS(名称服务器)、TXT(文本记录)等。
常用选项及示例
-
查询默认记录(A 记录)
1
dig example.com输出结果中包含
ANSWER SECTION,显示域名对应的 IP 地址。 -
指定查询类型
-
查询 MX 记录
1
dig mx example.com -
查询 NS 记录
1
dig ns example.com
-
-
反向查询(IP 转域名)
1
dig -x 192.168.1.1输出结果显示该 IP 对应的 PTR 记录(如果存在)。
-
指定 DNS 服务器
1
dig @8.8.8.8 example.com使用 Google DNS(8.8.8.8)查询
example.com的信息。 -
显示所有记录
1
dig any example.com获取域名的所有 DNS 记录(A、MX、NS、TXT 等)。
-
简化输出
1
dig +short example.com仅显示查询结果的关键信息(如 IP 地址)。
输出结果说明
dig 的输出通常包含以下部分:
- HEADER:查询的基本信息(如查询状态、查询时间)。
- QUESTION SECTION:查询的域名和类型。
- ANSWER SECTION:查询结果(如 IP 地址、MX 优先级)。
- AUTHORITY SECTION:提供权威解析的 DNS 服务器。
- ADDITIONAL SECTION:附加信息(如 DNS 服务器的 IP 地址)。
注意事项
- 权限问题:某些查询可能需要管理员权限(使用
sudo)。 - 参数中的特殊字符:如果域名包含特殊字符(如
_),需用引号包裹。 - 与
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 | |
输出示例:
1 | |
grep & less 查看日志
1 | |
grep过滤条件:
and
1 | |
or
-E 启用正则
1 | |
not
使用 -v 选项排除包含指定模式的行
1 | |
排序
结合sort命令
1 | |
count
使用 -c 选项统计匹配的行数:
1 | |
less查看
一、基本导航(移动)
| 按键 | 功能说明 |
|---|---|
↑ 或 k |
向上移动一行 |
↓ 或 j |
向下移动一行 |
空格 |
向下翻一页(相当于 PageDown) |
b |
向上翻一页(相当于 PageUp) |
Ctrl+f |
向下翻一页(同空格) |
Ctrl+b |
向上翻一页(同 b) |
G |
跳转到文件末尾 |
g |
跳转到文件开头 |
数字+G |
跳转到指定行(如 50G 到第 50 行) |
二、搜索功能
| 按键 | 功能说明 |
|---|---|
/关键词 |
从当前位置向下搜索关键词(按回车执行) |
?关键词 |
从当前位置向上搜索关键词(按回车执行) |
n |
跳转到下一个匹配结果 |
N |
跳转到上一个匹配结果 |
Ctrl+l |
高亮显示当前搜索的关键词(重新绘制屏幕) |
三、行号与显示设置
| 按键 / 命令 | 功能说明 |
|---|---|
:set nu |
显示行号(nu 是 number 缩写) |
:set nonu |
隐藏行号 |
五、其他实用操作
| 按键 | 功能说明 |
|---|---|
Ctrl+c |
中断正在执行的操作(如搜索卡住时) |
= |
显示当前文件信息(总行数、当前行位置等) |
m+字母 |
标记当前位置(如 ma 标记为 a)标记只能用 小写字母( a-z),共 26 个可用标记位,每个字母对应唯一位置。 若用同一个字母再次标记(如再次 m+a),会覆盖之前的 a 标记位置。 |
'+字母 |
跳转到之前标记的位置(如 'a 跳回 a 标记处) |
lsof
lsof 即 “list open files”,用于查看系统中被打开的文件,由于在 Unix 中一切皆文件,所以它也能查看网络连接、进程打开的文件等多种信息。
命令语法
1 | |
常用选项及示例
| 选项 | 含义 | 示例 |
|---|---|---|
-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 |
文件或网络连接的名称 |
常见应用场景
- 查找占用端口的进程:当启动服务时提示端口被占用,使用
lsof -i :端口号可快速找到占用该端口的进程及对应的 PID,然后可使用kill -9 PID终止该进程。 - 排查文件被哪些进程占用:如要删除某个文件但提示被占用,使用
lsof 文件名能找出占用该文件的进程。 - 监控特定用户或进程的文件操作:通过
-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 | |
-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 | |
此命令将连接到 api.push.apple.com 服务器的 443 端口(HTTPS),并显示其证书链。
1 | |
命令结果分析方法
执行 openssl s_client -connect api.push.apple.com:443 -showcerts 命令后,你会得到服务器的 SSL/TLS 连接详细信息以及证书链的输出。以下是如何解读该命令的结果:
- 连接信息
输出的开头部分会显示与服务器建立连接的情况,类似于:
1 | |
这表示成功连接到目标主机的 443 端口(HTTPS 默认端口)。
- 证书链
接下来,命令会显示服务器证书以及中间证书的详细信息(如果有)。-showcerts 选项会打印出所有证书,包括服务器证书和任何中间证书。例如:
1 | |
每个证书段之间是 -----BEGIN CERTIFICATE----- 和 -----END CERTIFICATE-----,它们表示证书的开始和结束。
- 证书的验证信息
每个证书都包含验证的层级。例如:
1 | |
这里的 depth 是证书链的层级(depth=0 是服务器证书,depth=1 是中间证书,depth=2 是根证书)。verify return:1 表示验证成功。
- SSL/TLS 握手
在连接建立之后,接下来会显示关于 SSL/TLS 握手的详细信息,类似于:
1 | |
这部分显示了 SSL/TLS 握手中读写的字节数。
- 证书有效性验证
如果服务器的证书经过了正确的验证并且是可信的,输出会显示:
1 | |
这意味着证书被成功验证,没有问题。如果验证失败,返回的错误码会更高,例如:
1 | |
Verify return code: 18 表示证书是自签名证书,因此无法通过公共证书颁发机构的验证。
- 加密算法和密钥交换信息
输出中还会包含与加密算法、密钥交换算法相关的信息。例如:
1 | |
这里的 Cipher 是当前会话使用的加密套件,表示加密通信的具体算法。
- 握手和证书验证通过
1 | |
- 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 80和UDP 80是两个完全独立的端口。- Consul 的
TCP 8301(服务器通信)和UDP 8301(Gossip 广播)就是典型例子。
二、端口号的作用范围
- 仅在传输层有效:
端口号的作用仅限于传输层,与应用层协议无关。例如:- HTTP 协议默认使用
TCP 80,但也可以配置为其他端口(如TCP 8080)。 - 即使 HTTP 使用
TCP 8080,它仍然是应用层协议,端口号仅用于传输层寻址。
- HTTP 协议默认使用
- OSI 模型对比:
在 OSI 七层模型中,端口号属于传输层(第 4 层),而 IP 地址属于网络层(第 3 层)。两者结合形成完整的网络地址(如IP:Port)。
三、常见误解澄清
-
“端口属于应用层”
- 错误:应用层协议(如 HTTP、DNS)通常默认使用特定端口,但端口号本身由传输层管理。
- 示例:DNS 协议既可以通过
UDP 53(查询)也可以通过TCP 53(区域传输),这说明端口号与协议的绑定是灵活的。
-
“同一端口不能被不同协议使用”
-
错误:同一端口号可以被不同协议的服务使用,只要它们属于不同的传输层协议(如 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 | |
3. 常用选项
BSD 风格选项
| 选项 | 含义 |
|---|---|
-a |
显示所有用户的进程(包括其他用户)。 |
-u |
显示进程的详细信息(如用户、CPU 使用率、内存占用等)。 |
-x |
显示没有控制终端的进程(如守护进程)。 |
-e |
显示所有进程(等价于 -A)。 |
-f |
显示完整格式的进程信息(包括父进程 ID、启动时间等)。 |
1 | |
System V 风格选项
| 选项 | 含义 |
|---|---|
-C |
按命令名称过滤进程(如 ps -C firefox)。 |
-p |
按 PID 过滤进程(如 ps -p 1234)。 |
1 | |
4. 输出字段说明
常用字段解释:
- PID:进程 ID(唯一标识符)。
- USER:进程所有者。
- %CPU:CPU 使用率(百分比)。
- %MEM:内存使用率(百分比)。
- VSZ:虚拟内存大小(KB)。
- RSS:常驻内存大小(KB)。
- TTY:控制终端(
?表示无终端)。 - STAT:进程状态(如
R运行中,S睡眠中,Z僵尸进程)。 - START:进程启动时间。
- TIME:累计 CPU 时间。
- COMMAND:启动进程的命令。
5. 高级用法
过滤与排序
-
过滤特定进程:
1
2ps aux | grep firefox # 查找 Firefox 相关进程
ps -ef | grep python # 查找 Python 进程 -
按 CPU 使用率排序
1
ps -eo pid,user,%cpu,%mem,command --sort=-%cpu # 降序排列
显示进程树
1 | |
6. 常见问题
-
如何终止进程?
结合kill命令:1
2kill <PID> # 正常终止进程
kill -9 <PID> # 强制终止进程 -
实时监控进程?
使用top或htop命令。
7. 参考文档
1 | |
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
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
-
默认继承当前用户的环境变量(如
PATH、HOME)。 -
若需加载目标用户的环境,需使用
-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 su1
sudo su # 切换到 root,需当前用户有 sudo 权限,退出用 exit
四、注意事项
- 避免混淆
sudo su和sudo -isudo su:切换到 root,但环境变量继承自当前用户。sudo -i:切换到 root 并加载其完整环境(等价于su - root)。
- 安全建议
- 避免长期使用
su切换到 root,推荐用sudo执行具体命令。 - 定期检查
/etc/sudoers文件,确保权限配置最小化。
- 避免长期使用
- 环境变量问题
- 若需保留当前用户环境,使用
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" |
通过合理选择 sudo 或 su,可平衡操作灵活性与系统安全性。
tee
一、命令用途
将输入的数据同时输出到 标准输出(终端) 和 指定文件,常用于保存命令执行结果或实时监控数据流。
二、基本语法
1 | |
三、常用选项
| 选项 | 说明 |
|---|---|
-a |
追加内容到文件(不覆盖原内容) |
-i |
忽略中断信号(如 Ctrl+C) |
-p |
显示文件创建或覆盖的提示 |
--help |
查看帮助信息 |
四、示例
-
覆盖写入文件
1
echo "Hello World" | tee output.txt输出内容会显示在终端,并写入
output.txt(若文件存在则覆盖)。 -
追加内容到文件
1
echo "Appended line" | tee -a output.txt内容追加到
output.txt末尾。 -
处理命令输出
1
ls -l | tee file_list.txt列出目录内容,同时保存到
file_list.txt。 -
写入多个文件
1
echo "Data" | tee file1.txt file2.txt数据同时写入
file1.txt和file2.txt,并显示在终端。
五、注意事项
-
权限问题
-
若目标文件需管理员权限,需使用
sudo1
echo "Config" | sudo tee /etc/config.conf
-
-
与重定向的区别
>仅写入文件,不显示终端;tee同时显示终端和写入文件。
-
实时监控数据流
-
可用于日志实时查看:
1
tail -f /var/log/app.log | tee log_backup.txt
-
六、总结
- 核心功能:分流数据到终端和文件。
- 常用场景:保存命令输出、实时日志记录、多文件备份。
- 关键选项:
-a(追加)、-i(忽略中断)、配合sudo处理系统文件。
telnet
一、最常见用途:端口连通性检测
场景:确认目标主机的端口是否开放,排查服务可用性。
语法:
1 | |
示例:
- 检查 Web 服务器 80 端口:
telnet example.com 80 - 检查 SSH 服务 22 端口:
telnet 192.168.1.100 22
结果判断:
- 若连接成功(显示空白或提示输入),说明端口开放;
- 若提示
Connection refused或超时,说明端口关闭或服务未启动。
二、其他实用用法简记
-
远程登录(旧设备管理):
- 适用于不支持 SSH 的路由器、交换机(如 Cisco 设备),命令:
telnet 设备IP - 注:需提前知道用户名 / 密码,且存在安全风险。
- 适用于不支持 SSH 的路由器、交换机(如 Cisco 设备),命令:
-
基础网络调试:
-
测试服务器响应(如输入 HTTP 请求查看返回):
1
2
3
4telnet 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(加密传输,支持密钥认证)。
- 端口检查:用
五、快速故障排查步骤
- 确认 IP / 端口是否正确(如 Web 服务默认 80/443,SSH 默认 22);
- 检查本地防火墙是否阻止连接(Windows 防火墙或 Linux 的 iptables);
- 在目标主机上用
netstat -an | grep 端口确认服务是否启动。qui
总结:Telnet 当前最核心价值是端口连通性检测,操作简单但需注意安全,复杂场景建议用更专业的工具(如 nc)或加密协议(SSH)。
traceroute
traceroute(Windows 系统对应 tracert)是网络路由追踪工具,核心作用是:显示数据包从本地主机到目标主机的「每一跳路由路径」,通过延迟、超时等信息定位网络故障点(如 IP 屏蔽、路由中断、延迟过高)。
一、速查表(核心语法 + 参数 + 输出解读)
- 基本语法(跨系统差异)
| 系统 | 命令格式 | 核心区别(协议) |
|---|---|---|
| Mac/Linux | traceroute [参数] 目标地址 |
默认用 UDP 协议(端口 33434-33534) |
| Windows | tracert [参数] 目标地址 |
默认用 ICMP 协议(部分网络会屏蔽 ICMP) |
目标地址支持:域名(如
dochub.gxtree.com)、IP 地址(如64.29.17.65)
- 常用参数(实用优先)
| 参数 | 作用说明 | 适用场景 |
|---|---|---|
-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 | |
| 输出项 | 含义 | 异常判断标准 |
|---|---|---|
| 跳数(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 是用户与操作系统交互的核心工具,它们的关系如下:
一、定义
- 终端(Terminal)
- 是什么:用户与操作系统交互的图形界面(如 macOS 的「终端」、iTerm2)。
- 作用:显示文本输出,并允许用户输入命令。
- 本质:是一个「终端仿真器」,模拟传统电传打字机的功能。
- Shell
- 是什么:运行在终端中的命令解释器程序(如 Bash、Zsh)。
- 作用:接收用户输入的命令,解析并执行,将结果返回给终端。
- 本质:是用户与操作系统内核之间的桥梁。
二、核心关系
- 终端调用 Shell
- 当你打开终端时,它会自动启动一个默认的 Shell(如 macOS 默认使用
zsh)。 - 用户在终端输入的命令(如
ls)由 Shell 解析并执行。
- 当你打开终端时,它会自动启动一个默认的 Shell(如 macOS 默认使用
- Shell 依赖终端
- Shell 本身不提供界面,需要通过终端(或 SSH 等远程连接工具)与用户交互。
- Shell 的输出(如文件列表)会通过终端显示。
三、常见终端与 Shell 组合
| 终端 | 常见 Shell | 特点 |
|---|---|---|
| macOS 终端 | zsh(默认) |
预装,适合日常使用。 |
| iTerm2 | zsh/bash |
功能强大,支持分屏、主题等。 |
| Windows 终端 | PowerShell/cmd |
微软官方工具,兼容旧版命令。 |
| Git Bash | bash |
专为 Git 设计,模拟 Linux 环境。 |
四、如何查看 / 切换 Shell
-
查看当前 Shell
1
echo $SHELL # 输出如 /bin/zsh 或 /bin/bash -
切换 Shell
-
临时切换
(当前终端有效):
1
2bash # 切换到 Bash
zsh # 切换到 Zsh -
永久切换
(修改默认 Shell):
1
2chsh -s /bin/zsh # macOS 推荐 Zsh
chsh -s /bin/bash # 切换回 Bash
-
五、为什么需要区分?
- 个性化配置
- Shell 支持自定义配置文件(如
.bashrc、.zshrc),可以添加别名、主题、插件等(如 Oh My Zsh)。 - 终端本身的配置(如配色、快捷键)与 Shell 无关。
- Shell 支持自定义配置文件(如
- 跨平台兼容性
- 同一 Shell(如 Bash)可以在不同终端(如 iTerm2、Git Bash)中运行。
- 不同 Shell 的语法和功能可能不同(如 Zsh 支持更复杂的自动补全)。
六、总结
- 终端:是你看到的界面,负责显示和输入。
- Shell:是背后的引擎,负责处理命令。
- 类比:终端像浏览器窗口,Shell 像浏览器内核(如 Chrome 的 V8 引擎)。
通过理解两者的关系,可以更高效地配置开发环境(如通过 Oh My Zsh 增强 Zsh 功能,或使用 iTerm2 的分屏功能提升效率)。
1 | |
ps:
终端经常进入预览状态(按Q取消)
查看详情

Terminal 改造
终端工具iTerm2
oh my zsh + 主题powerlevel10k + 命令高亮(zsh-syntax-highlighting)
zsh-syntax-highlighting安装
step1:
1 | |
下载后在上面可以看到安装的地址为/opt/homebrew/Cellar/zsh-syntax-highlighting/0.8.0
step2:
安装地址 + /share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
1 | |
zsh提示工具:https://github.com/zsh-users/zsh-autosuggestions
fzf:https://zhuanlan.zhihu.com/p/436752581 强烈推荐一下这个工具
| 快捷键 | 功能 |
|---|---|
Ctrl + R |
搜索命令历史 |
Ctrl + T |
搜索文件并插入路径 |
Alt + C |
搜索目录并跳转 |
Terminal 快捷键
1 | |
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 |
二、核心解压 / 查看命令
- ZIP 格式
| 功能 | 命令示例 | 关键参数 |
|---|---|---|
| 解压到当前目录 | unzip filename.zip |
- |
| 解压到指定目录 | unzip filename.zip -d /目标路径 |
-d |
| 查看内容(不解压) | unzip -l filename.zip |
-l |
| 强制覆盖 | unzip -o filename.zip |
-o |
- 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 |
- 7Z 格式
| 功能 | 命令示例 | 关键参数 |
|---|---|---|
| 解压到当前目录 | 7z x filename.7z |
x(完整解压) |
| 解压到指定目录 | 7z x filename.7z -o/目标路径 |
-o(无空格) |
| 查看内容(不解压) | 7z l filename.7z |
l |
三、特殊场景处理
-
ZIP 中文乱码
UNZIP="-O CP936" unzip filename.zip或unar filename.zip(需先装 unar:sudo apt install unar) -
解压系统目录(需权限)
示例:
sudo tar -zxvf filename.tar.gz -C /opt/目标目录 -
检查压缩包完整性
- ZIP:
unzip -t filename.zip - 7Z:
7z t filename.7z
- ZIP:
-
快速压缩(附)
- ZIP:
zip -r output.zip 目标文件/目录 - tar.gz:
tar -zcvf output.tar.gz 目标文件/目录 - 7Z:
7z a output.7z 目标文件/目录
- ZIP:
防火墙
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 |
重置防火墙(删除所有规则,恢复默认状态,需重新配置) |
二、规则配置(允许 / 拒绝访问)
- 按端口 / 协议配置(最常用)
| 命令 | 功能 |
|---|---|
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 协议通过指定端口 |
- 按 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 的主机访问 |
- 按服务名配置(简化常用服务)
系统预设了常见服务(如 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 |
默认拒绝所有出站连接(需手动配置允许的出站规则,慎用) |
常用场景示例
-
新服务器初始化防火墙(只开放 SSH 和 80 端口):
1
2
3
4
5sudo 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 # 启用防火墙 -
临时禁止某个 IP 访问:
1
sudo ufw deny from 1.2.3.4 -
查看并删除一条错误规则:
1
2sudo ufw status numbered # 查编号(假设错误规则是第 2 条)
sudo ufw delete 2 # 删除第 2 条规则这些命令覆盖了
ufw的日常使用场景,记住核心逻辑:默认拒绝、按需允许,可大幅提升系统安全性
实践
查看进程环境变量
在Linux中查看进程的环境变量有几种常用方法:
方法一:使用 /proc/<PID>/environ 文件
- 查看指定PID进程的环境变量
1 | |
- 实际例子
1 | |
方法二:使用系统工具
- 使用 ps 命令
1 | |
- 使用 xargs 和 printf
1 | |
方法三:查看当前shell进程的环境变量
- 查看当前进程
1 | |
- 使用 env 命令
1 | |
方法四:实用脚本
创建一个便捷的函数
1 | |
方法五:查找特定进程
- 先找到进程PID
1 | |
- 组合使用
1 | |
注意事项
- 权限限制:只能查看有权限访问的进程环境变量
- 进程状态:进程必须正在运行
- 格式问题:/proc/PID/environ 中的环境变量以null字符(\0)分隔,需要转换为可读格式
- 安全考虑:环境变量可能包含敏感信息(如密码、API密钥等)
常用组合命令
1 | |
这些方法可以帮你有效地查看和分析Linux系统中任何进程的环境变量。
python环境
通过系统包管理器安装(推荐新手)
Ubuntu 的官方软件源包含多个 Python 版本,可直接通过 apt 安装。
- 安装 Python3 及 pip
1 | |
验证安装:
1 | |
- 安装虚拟环境工具(推荐)
虚拟环境可隔离不同项目的依赖,避免版本冲突:
1 | |
使用方法:
1 | |
clash-cli
https://docs.lefly.co/contents/linux/clash-cli.html
访问文件有问题,就下载下来
https://github.com/Loyalsoldier/clash-rules/tree/release
脚本
> 查找可用端口区间
1 | |