躬行笔记 - 2025年4月
type: channel
link: https://www.fuzhoupyy.work/index.php/2025/04/
description: 古人学问无遗力，少壮工夫老始成。 纸上得来终觉浅，绝知此事要躬行。
items: python实现币安监控
items: 微信多开脚本
items: Python还能这么用？U盘加密工具保护你的秘密
items: 个人博客搭建有什么选择
items: python调用大漠插件，实现毫秒级ocr
items: 用python实现一个脚本精灵
items: 用python写个文件大小扫描工具
items: Linux入门书籍推荐：从新手到进阶的必读清单
items: Ubuntu 24.04 添加 IP 地址的完整指南
items: 深入解析Linux系统日志管理：从基础到高级实践

python实现币安监控
type: item
date: 2025-04-28T02:48:00+00:00
description: 前言最近一个盆友提了一个需求，想要通过币安公开接口实时关注指定币种类价格，然后达到指定阈值后通过飞书发送消息。既然是盆友那忙肯定得帮。具体步骤币安接口分析https://developers.binance.com/docs/zh-CN/binance-spot-api-docs/web-socket-streams，这是api文档。有其他需求的朋友可以根据文档来对接指定api。因为高频要求，本次直接使用WebSocket调用，不使用rest api。关于python WebSocket库的使用可以参考这篇文章，https://blog.csdn.net/liaoqingjian/article/details/146908212核心功能分析高频数据采集：通过币安REST API获取所有现货交易对信息，这样避免手动更新币种通过WebSocket实时订阅交易对的ticker数据按批次订阅，每批100个交易对，避免单个连接订阅过多价格监控：记录每个交易对最近1分钟的价格历史计算1分钟内的价格涨跌幅当涨跌幅超过设定阈值(3%)时触发警报警报机制：通过飞书Webhook发送警报消息实现冷却期机制，避免同一交易对短时间内重复发送警报警报包含交易对、涨跌幅、价格变化、成交量等信息程序源码import json import asyncio import websockets import requests from datetime import datetime import time class BinanceSpotMonitor: def __init__(self, feishu_webhook_url): self.ws_url = "wss://stream.binance.com:9443/ws" self.rest_api_url = "https://api.binance.com/api" self.feishu_webhook_url = feishu_webhook_url self.market_data = {} self.batch_size = 100 # 每批订阅的交易对数量 self.price_history = {} # 存储价格历史 self.alert_threshold = 3.0 # 涨跌幅阈值，超过此值将触发推送 self.alert_cooldown = {} # 用于控制推送频率，避免同一币种短时间内多次推送 self.cooldown_period = 60 # 冷却时间(秒)，同一币种在此时间内只推送一次 async def get_spot_symbols(self): """获取所有现货交易对，仅保留USDT交易对""" try: response = requests.get(f"{self.rest_api_url}/v3/exchangeInfo") response.raise_for_status() symbols = [] for symbol in response.json()["symbols"]: # 只保留以USDT结尾的交易对 if (symbol["status"] == "TRADING" and symbol["isSpotTradingAllowed"] and symbol["quoteAsset"] == "USDT"): symbols.append({ "symbol": symbol["symbol"], "baseAsset": symbol["baseAsset"], "quoteAsset": symbol["quoteAsset"] }) return symbols except Exception as e: print(f"获取交易对列表失败: {e}") return [] async def connect_and_subscribe_batch(self, symbols_batch): """连接到币安WebSocket并订阅一批市场的ticker数据""" try: async with websockets.connect(self.ws_url) as websocket: # 创建订阅请求 subscribe_request = { "method": "SUBSCRIBE", "params": [f"{symbol['symbol'].lower()}@ticker" for symbol in symbols_batch], "id": 1 } # 发送订阅请求 await websocket.send(json.dumps(subscribe_request)) # 接收订阅确认 respons…

微信多开脚本
type: item
date: 2025-04-21T14:07:00+00:00
description: 前言有几个微信需要多开登录，每次都要按回车点击微信多开。把握不住，老是会开很多个。用python实现多开，精准控制需要打开的数量，但是打开前先要关闭所有微信。运行图片：源码import tkinter as tk import subprocess import os import time from tkinter import messagebox, ttk class WeChatMultiOpener: def __init__(self, root): self.root = root self.root.title("微信多开器") self.root.geometry("300x200") self.root.resizable(False, False) # 设置界面 self.setup_ui() def setup_ui(self): # 主框架 main_frame = tk.Frame(self.root, padx=20, pady=20) main_frame.pack(fill=tk.BOTH, expand=True) # 标题标签 title_label = tk.Label(main_frame, text="微信多开工具", font=("Arial", 14, "bold")) title_label.pack(pady=10) # 数量选择框架 count_frame = tk.Frame(main_frame) count_frame.pack(pady=10, fill=tk.X) # 数量标签 count_label = tk.Label(count_frame, text="打开数量:") count_label.pack(side=tk.LEFT, padx=(0, 5)) # 数量输入框 self.count_var = tk.StringVar(value="2") count_spinbox = ttk.Spinbox( count_frame, from_=1, to=10, width=5, textvariable=self.count_var ) count_spinbox.pack(side=tk.LEFT) # 按钮框架 button_frame = tk.Frame(main_frame) button_frame.pack(pady=10) # 打开微信按钮 open_button = tk.Button(button_frame, text="打开微信", width=12, command=self.open_multiple_wechat, bg="#1aad19", fg="white") open_button.pack(side=tk.LEFT, padx=5) # 关闭所有微信按钮 close_button = tk.Button(button_frame, text="关闭所有微信", width=12, command=self.close_all_wechat) close_button.pack(side=tk.LEFT, padx=5) # 状态标签 self.status_var = tk.StringVar(value="就绪") status_label = tk.Label(main_frame, textvariable=self.status_var, fg="gray") status_label.pack(pady=(10, 0)) def open_multiple_wechat(self): try: # 获取用户输入的数量 count_text = self.count_var.get().strip() try: count = int(count_text) if count < 1 or count > 10: messagebox.showwarning("警告", "请输入1-10之间的数字") return except ValueError: messagebox.showwarning("警告", "请输入有效的数字") return wechat_path = r"C:\Program Files\Tencent\WeChat\WeChat.exe" # 检查路径是否存在 if not os.path.exists(wechat_path): print("未找到微信程序，请检查安装路径") return # 更新状态 self.status_var.set(f"正在打开 {count} 个微信实例...") self.root.update() # 打开指定数量的微信 for i in r…

Python还能这么用？U盘加密工具保护你的秘密
type: item
date: 2025-04-18T14:35:00+00:00
description: 前言存u盘里内容（老师）不想让别人知道，那就写个u盘加密工具来守护它把！何为u盘加密？加密U盘是指对U盘内容有加解密保护功能的U盘。市面上的加密U盘主要有三类：A．假加密，仅仅是隐藏文件，设个密码，仅仅验证身份，实际存储内容没有任何变化。B．软加密，内置或附带软件，对数据进行加密，一般用AES，也可分加密区及非加密区。C．硬件加密，内置硬件加密，透明加密，无形之中，完成加密，读取时验证，有的具有一些特殊功能，例如将加密应用于硬盘，插上U盘显示明码，拔下显示就是加密信息。柿子要挑软的捏，那我们就从软加密入手吧。核心功能概述1、使用Fernet对称加密（基于AES-128-CBC），常用的对称加密方式。2、使用SHA-256哈希存储密码，PBKDF2派生加密密钥3、加密后将原文件删除，解密后恢复原始文件结构，这样可以隐藏源文件。4、基于Tkinter的简单GUI界面，简单，但是界面不是很美观，后期可以用ttkbootstrap美化下界面。运行截图加密前：加密后：解密：关键组件分析1. 密钥管理机制def hash_password(self, password): """对密码进行哈希""" return hashlib.sha256(password.encode()).hexdigest() def derive_key(self, password): """从密码派生加密密钥""" kdf = PBKDF2HMAC( algorithm=hashes.SHA256(), length=32, salt=self.salt, iterations=self.config["encryption_settings"]["key_iterations"], ) key = base64.urlsafe_b64encode(kdf.derive(password.encode())) return key使用PBKDF2密钥派生函数，通过多次迭代（默认100,000次）增强安全性使用固定盐值（self.salt = b'USBEncryptionSalt123'），简化密钥管理但降低了安全性密码验证使用SHA-256哈希，存储在配置文件中2. 文件加密流程def encrypt_usb(self, password): # ... # 创建Fernet加密器 key = self.derive_key(password) fernet = Fernet(key) # 打开加密数据文件 with open(self.data_file, 'wb') as data_file: # 写入文件数量 data_file.write(struct.pack("<I", total_files)) # 加密并写入每个文件 for i, file_path in enumerate(files_to_encrypt): # 读取文件内容 with open(file_path, 'rb') as f: file_data = f.read() # 获取相对路径 rel_path = os.path.relpath(file_path, self.usb_root) rel_path_bytes = rel_path.encode('utf-8') # 加密文件内容 encrypted_data = fernet.encrypt(file_data) # 写入路径长度、路径和加密数据 data_file.write(struct.pack("<I", len(rel_path_bytes))) data_file.write(rel_path_bytes) data_file.write(struct.pack("<Q", len(encrypted_data))) data_file.write(encrypted_data) # 删除原文件 os.remove(file_path) # ...所有文件内容被加密并集中存储在一个单一的加密数据文件（.usbenc_data.bin）中文件结构信息（相对路径）也被保存，以便解密时恢复原始目录结构使用二进制格式存储，包含文件数量、路径长度、路径、加密数据长度和加密数据3. 文件解密流程def decrypt_usb(self, password): # ... # 创建Fernet解密器 key = self.derive_key(password) fernet = Fernet(key) # 打开加密数据文件 with open(self.data_file, 'rb') as data_file: # 读取文件数量 total_files = struct.unpack("<I", data_…

个人博客搭建有什么选择
type: item
date: 2025-04-17T06:49:00+00:00
description: 前言之前个人博客一种使用的是wordpress，这可是美国白宫官网都在用的cms系统，有图为证。哈哈哈哈，但是由于是海外的博客，会调用比较多的海外资源，还有就是各种插件功能太多。前端看文章响应还好，但是后台编辑文章还是有点卡顿。又不想自己从头开始搭建，就想找个合适的替代。以下是我做的几个博客方案选型，供大家参考！静态博客框架Hexo 简介Hexo 是一个快速、简洁且高效的静态博客框架，由台湾开发者 Tommy Chen 于2012年创建。它基于 Node.js 运行，使用 Markdown 语法编写文章，通过简单的命令即可生成静态网页。官方网站：https://hexo.io官方文档：https://hexo.io/docs/GitHub 仓库：https://github.com/hexojs/hexo工作原理Hexo 将 Markdown 文件转换成静态网页。用户编写 Markdown 格式的博客文章，运行生成命令后，Hexo 会根据主题模板将内容渲染为 HTML 文件。这些静态文件可以部署到任何支持静态网页的服务器上。主要特点速度快：生成静态文件迅速，部署简单支持 Markdown：可使用 Markdown 语法编写文章丰富的插件系统：有超过100个插件可扩展功能多样化主题：社区提供了大量可选主题一键部署：支持一键部署到 GitHub Pages、Heroku 等平台优点简单易用：安装和配置过程直观，学习曲线平缓生成速度快：相比其他静态博客生成器，处理速度更快主题丰富：大量现成主题可供选择，且容易自定义插件系统完善：功能可通过插件扩展，满足不同需求免费部署选项多：可轻松部署到 GitHub Pages、Netlify 等免费平台社区活跃：问题容易找到解决方案国际化支持好：多语言支持完善缺点需要本地环境：必须在本地安装 Node.js 环境才能使用动态功能受限：作为静态博客，无法直接实现复杂的动态功能版本更新可能引起兼容问题：主题和插件可能与新版本不兼容学习 Node.js：对不熟悉 JavaScript 的用户可能有一定门槛文章数量增多后生成速度变慢：大型站点生成时间会明显增加主题自定义需要前端知识：深度定制需要 HTML、CSS 和 JavaScript 知识Hexo 作为静态博客框架的代表之一，以其高效和灵活性在技术社区获得了广泛应用，特别适合那些注重内容创作和网站性能的博客作者。Jekyll 简介Jekyll 是一个简单、易用的静态网站生成器，由 GitHub 联合创始人 Tom Preston-Werner 于2008年开发。它采用 Ruby 语言编写，将纯文本内容（主要是 Markdown 格式）转换成静态网站或博客。Jekyll 是 GitHub Pages 的默认引擎，这使其成为许多开发者和项目文档的首选工具。官方网站：https://jekyllrb.com官方文档：https://jekyllrb.com/docs/GitHub 仓库：https://github.com/jekyll/jekyll工作原理Jekyll 将 Markdown（或其他标记语言）文件和模板转换成完整的静态 HTML 网站。它不需要数据库，所有内容都存储在文本文件中。Jekyll 使用 Liquid 模板语言处理模板，支持 YAML 格式的头信息来设置变量和配置。主要特点无需数据库：所有内容都是静态文件Markdown 支持：可使用 Markdown 语法编写内容Liquid 模板系统：灵活的模板处理能力YAML 头信息：简单的元数据管理方式内置 GitHub Pages 支持：无缝集成 GitHub 托管插件系统：可通过插件扩展功能增量构建：只重新生成更改的页面优点与 GitHub Pages 完美集成：免费托管且部署流程简单简洁高效：专注于内容而非复杂配置安全性高：作为静态网站，不易受到常见网络攻击版本控制友好：所有内容都是文本文件，适合 Git 管理社区成熟：历史悠久，社区资源丰富丰富的主题：大量现成主题可供选择良好的文档：官方文档详细且易于理解缺点Ruby 环境依赖：需要安装 Ruby 和相关依赖，Windows 平台安装较复杂构建速度：大型站点构建速度可能较慢，特别是与 Hugo 等工具相比动态功能受限：作为静态网站，不支持复杂的动态功能插件在 GitHub Pages 受限：GitHub Pages 出于安全考虑禁用了自定义插件学习曲线：对不熟悉命令行的用户可能有一定门槛Ruby 生态系统：对主要使用其他语言的开发者可能不太熟悉Jekyll 作为最早的静态网站生成器之一，凭借其与 GitHub 的紧密集成和简洁的设计理念，在技术博客和项目文档领域占据重要地位。它特别适合那些重视简单性、安全性和版本控制的网站创建者。…

python调用大漠插件，实现毫秒级ocr
type: item
date: 2025-04-16T09:29:56+00:00
description: 前言遇到一个朋友需求：对股票交易数据进行ocr识别（更好的方法是调用api接口，但是那个数据接口是闭源的，需要逆向），使用Tesseract OCR识别速度在200ms左右，速度不理想。这时候发现了大漠！大漠介绍大漠综合插件(dm.dll)采用vc6.0编写，是一款集前后台，文字识别，图色，键鼠，窗口，内存，DX，Call等功能于一身的综合插件。主要用于按键精灵、简单游、易语言等辅助制作工具，具有识别速度超级快的特点！ 采用COM接口编写，适用于所有语言调用。为什么它识别快？主要采用模板匹配和字库对比方法预先加载字库到内存，减少识别时的计算量字库针对常见字体和大小进行了优化所以要用大漠，需要建立字库，字库建立教程：https://www.cnblogs.com/100-rzsyztd/p/13045724.html免注册调用#! /usr/bin/env python # -*- coding: utf-8 -*- import ctypes import win32com.client import configparser class pydm: # 免注册调用 def __init__(self): reg =[注册码] reg2 = [附加码]#注册码附加码可以去某宝买，5块钱一个月 self.obj = ctypes.windll.LoadLibrary(r".\pydamo\DmReg.dll") self.obj.SetDllPathW(r".\pydamo\dm.dll"), 0) # 创建大漠对象 self.dm = win32com.client.DispatchEx("dm.dmsoft") self.dm.setDict(0, ".\dm_soft.txt") # 注册大漠 res = self.dm.Reg(reg, reg2) print("大漠注册返回值: {}".format(res)) self.dm.useDict(0) # 获取大漠版本号 print(self.dm.ver()) def ocr(self,x1, y1, x2, y2,ysms,mh=0.9): #x1, y1, x2, y2，屏幕区域坐标 #ysms 颜色范围 #mh 模糊度 s = self.dm.Ocr(x1, y1, x2, y2,ysms,mh) return s除此之外，大漠的其他功能都可以使用。具体功能可以阅读大漠使用说明。大漠官方文档：http://www.dmwebsite.net/

用python实现一个脚本精灵
type: item
date: 2025-04-16T09:28:00+00:00
description: 前言最近重复工作比较多，想着写个自动化脚本来替我打工！废话不多说，上源码：需要先安装第三方库：#使用国内源提速 pip install pyautogui keyboard -i https://pypi.tuna.tsinghua.edu.cn/simple/import tkinter as tk from tkinter import ttk, messagebox, simpledialog import pyautogui import time import threading import keyboard from functools import partial class Action: def __init__(self, action_type, x=0, y=0, key=None, description=None): self.action_type = action_type # "click", "key", "paste", "enter" self.x = x self.y = y self.key = key self.description = description or self.get_default_description() def get_default_description(self): if self.action_type == "click": return f"点击位置 ({self.x}, {self.y})" elif self.action_type == "key": return f"按键 {self.key}" elif self.action_type == "paste": return "粘贴 (Ctrl+V)" elif self.action_type == "enter": return "按回车键" return "未知操作" def execute(self, delay): if self.action_type == "click": pyautogui.click(self.x, self.y) elif self.action_type == "key": pyautogui.press(self.key) elif self.action_type == "paste": pyautogui.hotkey('ctrl', 'v') elif self.action_type == "enter": pyautogui.press('enter') time.sleep(delay) class EnhancedAutoClickerApp: def __init__(self, root): self.root = root self.root.title("自动化点击工具") self.root.geometry("600x600") # 存储动作列表 self.actions = [] # 设置循环次数和延迟时间 self.loop_count = tk.StringVar(value="10") self.delay_time = tk.StringVar(value="0.5") # 运行状态标志 self.is_running = False self.is_listening = False # 创建界面 self.create_widgets() # 设置F2热键监听 keyboard.add_hotkey('f2', self.on_f2_pressed) def create_widgets(self): # 主框架 main_frame = ttk.Frame(self.root, padding="10") main_frame.pack(fill=tk.BOTH, expand=True) # 标题 title_label = ttk.Label(main_frame, text="增强版自动化点击工具", font=("Arial", 16, "bold")) title_label.pack(pady=10) # 设置框架 settings_frame = ttk.LabelFrame(main_frame, text="设置") settings_frame.pack(fill=tk.X, padx=5, pady=5) # 循环设置 loop_frame = ttk.Frame(settings_frame) loop_frame.pack(fill=tk.X, padx=5, pady=5) ttk.Label(loop_frame, text="循环次数:").pack(side=tk.L…

用python写个文件大小扫描工具
type: item
date: 2025-04-16T04:42:50+00:00
description: 背景近期电脑一个盘亮红了，需要找出那个文件或文件夹吃了空间。手动找太麻烦了，就用python写个文件夹大小扫描工具。程序界面展示双击可打开文件夹！！程序功能说明文件/文件夹标识：在树状视图中添加了"类型"列，清晰地标识每个项目是"文件"还是"文件夹"使用 item.is_dir() 方法判断项目类型在 item_types 字典中存储每个树项目的类型信息基本扫描功能：扫描指定文件夹下所有文件和文件夹的大小显示每个项目的路径、大小和占总大小的百分比按大小降序排列结果用户界面：路径输入框和浏览按钮扫描进度条状态栏显示当前操作状态树状视图显示扫描结果交互功能：右键菜单提供"打开"、"打开所在文件夹"和"复制路径"功能双击项目可直接打开跨平台支持（Windows、macOS、Linux）错误处理：处理权限错误和IO错误文件操作失败时显示错误消息使用这个工具，用户可以轻松地：分析文件夹中哪些文件/子文件夹占用空间最大快速访问这些文件/文件夹复制路径用于其他操作这个工具在管理磁盘空间、清理大文件时特别有用。打包程序为了方便其他用户使用，使用pyinstaller将程序打包成可执行文件。pyinstaller -F -w 扫描磁盘工具.py程序源码import os import tkinter as tk from tkinter import filedialog, ttk, messagebox import threading from pathlib import Path import humanize # 用于格式化文件大小 import subprocess import platform import pyperclip # 用于复制到剪贴板 class FolderScannerApp: def __init__(self, root): self.root = root self.root.title("文件夹大小扫描工具") self.root.geometry("1000x600") self.root.minsize(1000, 600) # 创建主框架 self.main_frame = ttk.Frame(self.root, padding=10) self.main_frame.pack(fill=tk.BOTH, expand=True) # 创建顶部控制区域 self.control_frame = ttk.Frame(self.main_frame) self.control_frame.pack(fill=tk.X, pady=5) # 路径输入框 self.path_var = tk.StringVar() ttk.Label(self.control_frame, text="文件夹路径:").pack(side=tk.LEFT, padx=5) self.path_entry = ttk.Entry(self.control_frame, textvariable=self.path_var, width=50) self.path_entry.pack(side=tk.LEFT, padx=5, fill=tk.X, expand=True) # 浏览按钮 self.browse_btn = ttk.Button(self.control_frame, text="浏览", command=self.browse_folder) self.browse_btn.pack(side=tk.LEFT, padx=5) # 扫描按钮 self.scan_btn = ttk.Button(self.control_frame, text="扫描", command=self.start_scan) self.scan_btn.pack(side=tk.LEFT, padx=5) # 创建进度条 self.progress_var = tk.DoubleVar() self.progress_bar = ttk.Progressbar(self.main_frame, variable=self.progress_var, maximum=100) self.progress_bar.pack(fill=tk.X, pady=5) # 创建状态标签 self.status_var = tk.StringVar(value="就绪") self.status_label = ttk.Label(self.main_frame, textvariable=self.status_var) self.status_label.pack(anchor=tk.W, pady=5) # 创建结果显示区域 sel…

Linux入门书籍推荐：从新手到进阶的必读清单
type: item
date: 2025-04-14T03:17:06+00:00
description: 我经常被问到关于Linux学习的书籍推荐。无论是刚接触Linux的新手，还是想要提升技能的进阶用户，选择合适的学习资料都至关重要。接下来，我将分享我认为最值得阅读的Linux入门书籍，这些是我在多年Linux学习中有学习过的书籍，各位网友要是还有补充请给我留言！初学者入门书籍1. 《鸟哥的Linux私房菜：基础学习篇》（第四版）这本由台湾作者蔡德明（鸟哥）编写的经典著作，可以说是中文世界里Linux入门的标杆。书中以CentOS为例，从最基本的Linux概念讲起，语言通俗易懂，例子丰富实用。亮点： 循序渐进的内容编排，非常适合零基础读者 详细解释了Linux文件系统、用户权限等基础概念 大量实际操作案例，便于动手实践 作者持续更新网站内容，与时俱进 我个人认为，这本书最大的优势在于它的叙述风格，就像一位经验丰富的老师在耐心讲解，不会让新手感到畏惧。但是有些用语是台湾那边的风格，有点别扭哈哈哈哈哈。2. 《Linux Command Line and Shell Scripting Bible》（Linux命令行与shell脚本编程大全）Richard Blum和Christine Bresnahan合著的这本书是学习Linux命令行的绝佳选择。它从最基本的命令开始，逐步深入到shell脚本编程。亮点： 全面覆盖了常用Linux命令 大量实例讲解shell脚本编写技巧 包含实用的故障排除方法 适合作为日常参考手册 这本书我反复翻阅过多次，每次都能发现新的收获。特别是它对bash脚本的讲解，对新手非常友好。但是纸上得来终觉浅，绝知此事要躬行。没事可以多敲敲多写写，光看是记不住的！3. 《Linux就该这么学》刘遄老师的这本书以实战为导向，通过大量实验帮助读者快速掌握Linux技能。亮点： 以RHEL/CentOS为基础，紧贴企业实际应用 包含大量实验和操作步骤 配套网站提供在线学习资源 涵盖了系统管理的基本技能 这本书书友反馈这本书的实验设计非常贴合工作实际，学完后能够迅速上手。多实践！多实践！多实践！重要的事情说三遍。进阶学习书籍4. 《Linux系统管理技术手册》（第五版）Evi Nemeth等人编写的这本书被誉为Linux系统管理员的"圣经"，内容全面且深入。亮点： 详细介绍了系统管理的各个方面 涵盖网络配置、安全管理、性能调优等高级主题 包含实用的故障排除方法和最佳实践 适合有一定基础的读者深入学习 我在处理复杂的系统问题时，经常会翻阅这本书寻找解决方案。它的深度和广度都令人印象深刻。5. 《UNIX环境高级编程》（第三版）虽然书名中是UNIX，但这本由Richard Stevens和Stephen Rago编写的经典著作对Linux同样适用，是理解Linux系统编程的必读之作。亮点： 深入讲解系统调用和库函数 详细介绍进程控制、信号处理等核心概念 包含大量实用代码示例 帮助理解Linux内部工作机制 这本书需要一定的C语言基础，但对于想要深入理解Linux如何工作的读者来说，绝对值得投入时间学习。6. 《Linux内核设计与实现》Robert Love的这本书是了解Linux内核的入门级经典，它以清晰的语言解释了复杂的内核概念。亮点： 解释内核设计理念和实现细节 涵盖进程调度、内存管理、文件系统等核心子系统 适合想要了解Linux内部工作原理的读者 相比其他内核书籍更容易入门 我第一次阅读这本书时，对Linux内核的优雅设计感到惊叹。它帮助我建立了对操作系统工作原理的深刻理解（太深入，我看了掉头发，助眠很不错！！！）实用工具书7. 《Linux Pocket Guide》（Linux口袋指南）Daniel Barrett编写的这本小册子非常适合随身携带，作为命令速查手册使用。亮点： 简洁明了地介绍了常用Linux命令 小巧便携，适合随时查阅 包含实用技巧和示例 新版本持续更新，跟进最新变化 8. 《Shell脚本学习指南》Arnold Robbins的这本书专注于shell脚本编程，是提升自动化能力的好帮手。亮点： 从基础到高级的shell脚本技术 大量实用示例和最佳实践 讲解了正则表达式、awk和sed等文本处理工具 适合系统管理员提高工作效率 特定领域书籍9. 《Linux服务器安全》Michael D. Bauer的这本书专注于Linux系统安全，是运维人员必备的安全参考。亮点： 全面介绍Linux安全基础和高级主题 包含防火墙配置、入侵检测等实用技术 提供安全加固的最佳实践 涵盖常见安全威胁的应对方法 在当今网络安全日益重要的环境下，这本书提供的知识对每个Linux管理员都至关重要。10. 《Docker技术入门与实战》（第三版）杨保华、戴王剑和曹亚仑编写的这本书是学习容器技术的优秀入门读物。亮点： 从基础概念到…

Ubuntu 24.04 添加 IP 地址的完整指南
type: item
date: 2025-04-07T09:40:30+00:00
description: Ubuntu 24.04 使用 Netplan 作为默认的网络配置工具，这是目前最推荐的添加永久 IP 地址的方法。以下是详细步骤：使用 Netplan（推荐）步骤 1：确定网卡名称和当前配置# 查看网卡名称和当前IP配置 ip a # 查找现有的 Netplan 配置文件 ls /etc/netplan/网卡名称通常是 enp0s3、ens5 或类似格式，请记下您的实际网卡名称。步骤 2：编辑 Netplan 配置文件# 编辑配置文件（文件名可能不同） sudo nano /etc/netplan/00-installer-config.yaml步骤 3：添加新 IP 地址修改配置文件，添加新 IP 地址。以下是一个示例配置：network: version: 2 ethernets: ens5: # 替换为您的网卡名称 dhcp4: true # 如果您想保留DHCP，设为true；否则设为false addresses: - 192.168.1.100/24 # 现有IP地址（如果有） - 172.31.2.249/20 # 新增的IP地址 # 如果您设置dhcp4: false，可能需要添加以下配置 # routes: # - to: default # via: 192.168.1.1 # nameservers: # addresses: [8.8.8.8, 8.8.4.4]步骤 4：应用配置# 检查配置语法 sudo netplan try # 应用配置 sudo netplan apply步骤 5：验证配置ip addr show ens5 # 替换为您的网卡名称

深入解析Linux系统日志管理：从基础到高级实践
type: item
date: 2025-04-07T09:39:55+00:00
description: linux提供了强大的日志功能，系统日志就像是服务器的"黑匣子"，记录着系统的一举一动。作为一个“菜鸟运维”，掌握Linux日志管理不仅能帮助我们快速定位问题，还能预防潜在的系统故障。今天，我们就来深入探讨Linux系统日志管理的方方面面（鄙人才疏学浅，若有不足还请海涵，^-^）。一、Linux日志系统概述Linux系统的日志文件主要存放在/var/log目录下，包含了从系统启动到运行过程中的各种信息。这些日志按照功能大致可分为： 系统日志：记录系统级别的事件 应用日志：记录各应用程序的运行情况 安全日志：记录与系统安全相关的信息 传统的Linux使用syslog作为日志系统，现代发行版则多采用rsyslog或systemd-journald。二、常见日志文件详解1. /var/log/messages这是最重要的系统日志文件，记录了除了认证相关之外的所有系统活动：$ sudo tail -f /var/log/messages Nov 15 10:23:45 server kernel: CPU0: Core temperature above threshold, cpu clock throttled Nov 15 10:24:12 server systemd: Started Session 1452 of user admin.2. /var/log/secure包含与认证和授权相关的日志信息：$ sudo cat /var/log/secure | grep "Failed password" Nov 15 09:15:32 server sshd[12345]: Failed password for invalid user admin from 192.168.1.100 port 49812 ssh23. /var/log/dmesg内核环缓冲区信息，记录系统启动时的硬件检测等信息：$ dmesg | grep -i usb [ 2.332145] usb 1-1: new high-speed USB device number 2 using ehci-pci [ 2.464312] usb 1-1: New USB device found, idVendor=8087, idProduct=00244. /var/log/audit/audit.log审计子系统的日志，记录安全相关事件：$ sudo ausearch -m USER_LOGIN -ts today time->Tue Nov 15 08:45:23 2023 type=USER_LOGIN msg=audit(1668496523.156:425): pid=3548 uid=0 auid=4294967295 ses=4294967295 msg='op=login acct="root" exe="/usr/sbin/sshd" hostname=? addr=192.168.1.105 terminal=ssh res=success'三、日志管理工具rsyslog 简介rsyslog 是 Linux 系统中最流行的日志管理服务，它是对传统 syslogd 的增强版本。作为一个高性能、模块化的系统日志处理工具，rsyslog 能够接收来自各种来源的日志消息，处理它们，并将其输出到多种目标。核心特性 高性能：能够每秒处理超过一百万条日志消息 可靠性：支持 TCP 传输和消息队列，确保日志不丢失 模块化架构：通过插件扩展功能，支持多种输入输出模式 强大的过滤能力：基于属性的过滤器和表达式 灵活的配置：使用传统语法或更强大的 RainerScript 配置格式 1. rsyslog配置详解rsyslog 是 Linux 系统中最流行的日志管理服务，它是对传统 syslogd 的增强版本。作为一个高性能、模块化的系统日志处理工具，rsyslog 能够接收来自各种来源的日志消息，处理它们，并将其输出到多种目标。rsyslog是目前最常用的日志系统，其配置文件位于/etc/rsyslog.conf：# 配置日志格式 $template CustomFormat,"%timegenerated% %HOSTNAME% %syslogtag%%msg%\n" # 将所有消息记录到messages文件 *.info;mail.none;authpriv.none;cron.none /var/log/messages;CustomFormat # 将认证相关消息记录到secure文件 authpriv.* /var/log/secure;CustomFormat # 将邮件相关消息记录到maillog文件 mail.* /var/log/ma…