0%

Shell 中变量与引号的用法:单引号与双引号的核心区别

在 Shell 脚本中,单引号(')和双引号(")是处理字符串和变量时的重要符号,二者的核心区别在于是否对内容进行解析。理解它们的差异是编写正确 Shell 脚本的基础。

双引号("):支持解析与替换

双引号会保留字符串的原始格式,同时对其中的变量命令转义字符进行解析(替换为实际值),是日常使用中最频繁的引号类型。

解析变量(变量替换)

双引号中的变量(以 $ 开头)会被替换为变量的值:

1
2
3
name="Shell"
echo "Hello, $name" # 输出:Hello, Shell
echo "Version: v$1" # 若脚本接收参数1为"1.0",输出:Version: v1.0

解析命令执行结果(命令替换)

双引号中通过 command$(command) 嵌入的命令,会被替换为命令的执行结果:

1
2
echo "当前目录: $(pwd)"  # 输出:当前目录: /home/user
echo "今天是: `date +%F`" # 输出:今天是: 2025-08-06

解析转义字符

双引号中支持部分转义字符(如 \n 换行、\t 制表符、\$ 保留 $ 符号等):

阅读全文 »

Feign 拦截器:请求增强与上下文传递的利器

Feign 拦截器(RequestInterceptor)是 Feign 提供的请求增强机制,可在 HTTP 请求发送前对其进行统一处理(如添加请求头、修改参数、日志记录等),常用于传递上下文信息(如用户认证令牌、客户端 IP)、统一配置请求头等场景。

Feign 拦截器的核心作用

Feign 拦截器通过实现RequestInterceptor接口的apply方法,在请求构建完成后、发送前对RequestTemplate进行修改,实现以下核心功能:

  • 传递上下文信息:如将当前用户的 Token、用户 ID 从上游服务传递到下游服务。
  • 统一添加请求头:如添加Content-TypeAcceptX-Request-Id等通用头信息。
  • 请求日志记录:记录请求 URL、参数等信息,便于调试和审计。
  • 参数加密 / 签名:对敏感参数进行加密,或为请求添加签名验证。

Feign 拦截器的实现与配置

1. 自定义拦截器实现

通过实现RequestInterceptor接口,重写apply方法编写拦截逻辑:

阅读全文 »

Feign 执行流程:从接口定义到请求响应的全链路解析

Feign 作为声明式 HTTP 客户端,其执行流程围绕 “接口代理→请求构建→发送→响应处理” 展开,核心依赖动态代理和组件协作(如编码器、解码器、负载均衡等)。以下是 Feign 执行的完整流程解析:

启动初始化阶段:Feign 客户端的注册

Feign 的执行从应用启动开始,核心是通过@EnableFeignClients注解触发 Feign 客户端的扫描与注册。

1. 开启 Feign 功能

@EnableFeignClients注解通过@Import(FeignClientsRegistrar.class)导入注册器,触发 Feign 客户端的扫描:

1
2
3
4
5
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(FeignClientsRegistrar.class) // 关键:导入注册器
public @interface EnableFeignClients { ... }

2. 扫描并注册 Feign 客户端

FeignClientsRegistrar的核心逻辑:

  • 扫描标注@FeignClient的接口(如DeptClient);
  • 为每个接口创建动态代理工厂Feign.Builder),并将代理对象注册到 Spring 容器中;
  • 代理对象的核心处理器为SynchronousMethodHandler(负责后续方法调用的拦截与处理)。
阅读全文 »

Linux 系统日志全解析:从故障排查到安全审计

系统日志是 Linux 系统的 “黑匣子”,记录了从启动到运行的各类事件,是排查故障、追踪操作、审计安全的核心依据。本文将详细介绍 Linux 中最关键的日志文件,包括其功能、内容及实用查看技巧。

核心系统日志:/var/log/messages

/var/log/messages 是 Linux 系统的通用日志中心,几乎所有非特定服务的系统级事件都会在此记录,地位相当于系统的 “主日记”。

记录内容

  • 系统启动过程中的引导信息(如内核初始化、服务启动状态);
  • 运行时的错误事件(IO 失败、网络连接中断、硬件驱动异常);
  • 进程状态变化(如服务启动 / 停止、进程被强制终止);
  • 内核消息(如内存不足、文件系统错误)。

实用场景:排查进程异常终止

当应用程序突然崩溃时,可通过该日志确认是否被内核的 OOM Killer(内存不足杀手)终止:

1
2
# 查找被 OOM Killer 杀死的 Java 进程
grep "Kill process" /var/log/messages | grep java

输出示例:

1
Out of memory: Kill process 31201 (java) score 783 or sacrifice child
  • 保护关键进程:若需避免进程被 OOM Killer 终止,可调整其优先级:

    1
    echo -17 > /proc/$PID/oom_adj  # $PID 为进程 ID,-17 表示最高保护级别

启动日志:/var/log/dmesgdmesg 命令

该日志记录系统启动阶段的内核消息,聚焦硬件初始化和驱动加载,是排查硬件问题的首选。

阅读全文 »

SSH 密钥认证:安全便捷的远程登录方式

SSH(Secure Shell)是 Linux 系统中远程登录的标准协议,除了传统的密码认证外,密钥认证机制提供了更安全、更便捷的登录方式,无需每次输入密码即可建立连接。本文将详细介绍 SSH 密钥认证的原理和配置方法。

密钥认证的工作原理

SSH 密钥认证基于非对称加密算法(如 RSA 或 ECDSA),通过一对密钥(公钥和私钥)实现身份验证:

  1. 密钥对生成:用户在本地生成一对密钥 —— 公钥(public key)和私钥(private key)。
  2. 公钥部署:将公钥上传到目标服务器的指定位置(~/.ssh/authorized_keys)。
  3. 认证过程:
    • 客户端发起 SSH 连接请求。
    • 服务器生成随机数,用客户端的公钥加密后发送给客户端。
    • 客户端用私钥解密随机数,返回给服务器。
    • 服务器验证结果,一致则允许登录。

优势

  • 安全性更高:私钥仅存于本地,无需在网络中传输密码。
  • 便捷性:配置后无需重复输入密码,适合脚本自动化操作。

密钥认证的配置步骤

1. 在本地客户端生成密钥对

使用 ssh-keygen 命令生成密钥对(默认采用 RSA 算法):

阅读全文 »