Terminal & Coffee

☕️ 一个后端工程师的数字化生存指南
🐹 日常战报: 写 Go 代码 → 用 pprof 灭火 → 泡咖啡 → 循环
🐍 日常战报: 写 Python 时:▇▇▇▇▇ 自动化脚本加载中…  🐞 捕获 BUG:TypeError ×3
💻 日常战报: 写 Shell 时:[[ $? -eq 0 ]] || 重启玄学调试模式
🌿 非技术时刻:骑行川藏线记录 | 胶片摄影暗房教程
💡 终极真理:echo “rm -rf /” > deploy.sh

Shell Conditional Test

在 shell 脚本判断逻辑中的一些操作符 一、字符串测试 选项 含义 示例 说明 -z 字符串为空 [ -z "$str" ] 变量未定义或值为空时为真 -n 字符串非空 [ -n "$str" ] 变量已定义且值不为空时为真 重要提示:变量必须用双引号包裹,避免未定义变量导致语法错误: # 错误写法(未定义变量会报错) [ -n $var ] # 正确写法 [ -n "$var" ] 二、文件测试 文件存在性测试 选项 含义 示例 -e 文件/目录存在 [ -e "/path" ] -a 同 -e(已废弃) 不推荐使用 文件类型测试 选项 含义 示例 -f 常规文件 [ -f file.txt ] -d 目录 [ -d "/dir" ] -L 符号链接 [ -L link ] -h 同 -L [ -h link ] -b 块设备 [ -b /dev/sda ] -c 字符设备 [ -c /dev/tty ] -p 命名管道 [ -p pipe ] -S 套接字 [ -S socket ] 权限测试 选项 含义 示例 -r 可读 [ -r file ] -w 可写 [ -w file ] -x 可执行 [ -x script.sh ] -g 设置了 setgid [ -g file ] -u 设置了 setuid [ -u file ] -k 设置了 sticky bit [ -k /tmp ] 文件属性测试 选项 含义 示例 -s 文件非空 [ -s data.log ] -N 修改后未读取 [ -N file ] -O 当前用户拥有 [ -O file ] -G 当前用户组拥有 [ -G file ] 文件比较测试 选项 含义 示例 -nt 文件1比文件2新 [ file1 -nt file2 ] -ot 文件1比文件2旧 [ file1 -ot file2 ] -ef 相同设备/Inode [ file1 -ef file2 ] 三、数值比较 选项 含义 示例 等价算术符 -eq 等于 [ $a -eq 5 ] == -ne 不等于 [ $a -ne 5 ] != -gt 大于 [ $a -gt 5 ] > -ge 大于等于 [ $a -ge 5 ] >= -lt 小于 [ $a -lt 5 ] < -le 小于等于 [ $a -le 5 ] <= 四、组合逻辑 选项 含义 示例 ! 逻辑非 [ ! -f file ] -a 逻辑与 [ -f file -a -r file ] -o 逻辑或 [ -d dir -o -L dir ] 现代写法(推荐): ...

July 1, 2025 · 2 min · Theme PaperMod

iptables

图片引用 https://mp.weixin.qq.com/s/GTAGMy2t0FIIUhq6CpFgWw 🧩 一、iptables 五表详解 优先级顺序 raw > mangle > nat > filter > security 表名 用途 作用时机 优先级 常用规则 raw 关闭连接跟踪(conntrack) 最早阶段 ⭐最高 NOTRACK mangle 修改数据包(TTL、TOS、MARK等) 早期、中期、晚期都可插入 高 MARK, TTL, TOS nat 实现源地址或目标地址转换(NAT) PREROUTING / POSTROUTING / OUTPUT 中 SNAT, DNAT, MASQUERADE filter 数据包过滤(放行/丢弃) 处理末期 ⭐最常用 ACCEPT, DROP security 与 SELinux、AppArmor 结合的强制访问控制 最后阶段 低 配合 SELinux 使用 🔗 二、五链详解(对应五个 hook 点) 链名 描述 属于哪些表 PREROUTING 入站包一进内核就处理(在路由前) raw, mangle, nat INPUT 进入本机的包 mangle, filter, security FORWARD 转发到别处的包 mangle, filter, security OUTPUT 本机发出的包 raw, mangle, nat, filter, security POSTROUTING 所有出站包(包括转发)在离开前 mangle, nat, security 🚚 三、收发包流程图说明(图下方) 你贴的图,和 Netfilter 的真实流程图是基本一致的。下面我对照图帮你拆解下: ...

June 26, 2025 · 2 min · Theme PaperMod

Shell 脚本中为何使用 `{ ... }` 包裹整个脚本

📌 问题 在一些 Shell 脚本中,常常看到以下结构: #!/usr/bin/env bash { # this ensures the entire script is downloaded # # 脚本内容 some_function() { echo "Hello" } some_function } # this ensures the entire script is downloaded # 为什么要用 { ... } 把整个脚本包裹起来?这样做有什么好处? ✅ 答案 这是一个 Shell 脚本技巧,主要用于: 确保整个脚本在下载完成并被完全解析之后再执行 🧠 原因解释 在执行远程脚本时,例如: curl -s https://example.com/script.sh | bash 脚本是以流式方式传给 bash 的,会出现: 边下载边执行 如果下载中断,脚本会只执行了一部分 函数定义、变量赋值可能不完整,甚至执行危险命令 🛡 加上 { ... } 的作用 使用大括号包裹: { # 所有脚本内容 } 等于告诉 bash: ...

June 11, 2025 · 1 min · Theme PaperMod

MCP Introduction

📡 MCP 协议简明说明文档 什么是 MCP 协议? MCP(Message Calling Protocol)是一种用于“大模型调用工具”的通信协议标准。 它的目标是解决这个问题: 🧠 “模型说要调用工具 A 干点事,那我们怎么告诉它工具叫啥、怎么传参、怎么返回结果呢?” MCP 协议规定了什么?(共 4 点) 1. 工具定义格式 使用 JSON Schema 定义工具的名称、描述和参数: { "name": "get_weather", "description": "获取城市天气", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "城市名" } }, "required": ["city"] } } 2. 调用请求格式 遵循 JSON-RPC 格式: { "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "get_weather", "arguments": { "city": "北京" } } } 3. 返回结果格式 { "jsonrpc": "2.0", "id": 1, "result": { "content": [ { "type": "text", "text": "北京今天晴,最高25度。" } ] } } 支持返回多种类型的数据(如文本、图片、文件等)。 4. 多轮交互 & 中间件机制 支持多轮对话中的函数调用 MCP Server 可实现日志、权限、缓存、调度等中间件机制 MCP 协议需要客户端和服务端做什么? 🖥️ 服务端(MCP Server)职责 功能 说明 接收 JSON-RPC 请求 支持 HTTP / WebSocket / stdio 等方式 查找并执行工具逻辑 按名称 name 执行对应函数或脚本 返回标准格式结果 输出 result.content,统一格式 返回示例: ...

May 14, 2025 · 1 min · Theme PaperMod

Install Gitlab

展示下启动完成后的效果 依赖 docker 环境 .env 文件 GITLAB_HOST_IP=192.168.1.8 GITLAB_PORT=8929 GITLAB_ROOT=/Users/mako/gitlab GITLAB_WEB_URL=192.168.1.8:8929 GITLAB_SHELL_SSH_PORT=2224 使用 docker compose 进行安装 # yaml-language-server: $schema=https://cdn.jsdelivr.net/gh/compose-spec/compose-spec@master/schema/compose-spec.json services: web: image: gitlab/gitlab-ce:latest restart: always container_name: gitlab hostname: gitlab environment: GITLAB_OMNIBUS_CONFIG: | external_url 'http://${GITLAB_HOST_IP}:${GITLAB_PORT}' gitlab_rails['gitlab_shell_ssh_port'] = ${GITLAB_SHELL_SSH_PORT} ports: - ${GITLAB_PORT}:${GITLAB_PORT} - ${GITLAB_SHELL_SSH_PORT}:22 volumes: - ${GITLAB_ROOT}/config:/etc/gitlab - ${GITLAB_ROOT}/logs:/var/log/gitlab - ${GITLAB_ROOT}/data:/var/opt/gitlab shm_size: 256m runner: image: gitlab/gitlab-runner:latest container_name: gitlab-runner restart: always volumes: - ${GITLAB_ROOT}/runner/config:/etc/gitlab-runner - ${GITLAB_ROOT}/runner/docker.sock:/var/run/docker.sock 控制脚本 control.sh 进行自动更新 .env及启停 在不同网络下本机的 IP 地址变更,只需要 ./control.sh restart 即可,脚本中会自动重新配置 .env 内容 ...

May 9, 2025 · 2 min · Theme PaperMod