躬行笔记 - 2025年11月
type: channel
link: https://fuzhoupyy.work/index.php/2025/11/
description: 古人学问无遗力，少壮工夫老始成。 纸上得来终觉浅，绝知此事要躬行。
items: 2025年Web应用托管平台选择指南：从小白到大神都能找到合适的家
items: 别再瞎折腾了！这些Web渗透靶场让你从菜鸟变大神
items: 面向云工程师的 Linux 命令行终极指南
items: 云崩溃剖析：对 2025 年 10 月 AWS 服务中断的技术深度分析
items: [AWS]别再让用户等到花儿都谢了！Python + S3 文件上传的终极优化指南
items: 如何在 Azure 中创建 Windows 10 虚拟机
items: 告别curl！这个命令行工具让API调试变得超简单
items: 全面掌控Windows服务器安全：审计策略配置与日志管理完全指南
items: 通过命令行界面（winget）在 Windows 上安装 Node.js
items: 运维老司机必备！5个Python脚本让你的工作效率翻倍

2025年Web应用托管平台选择指南：从小白到大神都能找到合适的家
type: item
date: 2025-11-17T14:30:10+00:00
description: 前言最近有不少朋友问我，做好的Web应用到底该放在哪里？这个问题说简单也简单，说复杂也复杂。不像手机App那样直接丢到应用商店就完事，Web应用需要找个靠谱的托管平台，能够稳定、快速地把你的HTML、CSS、JavaScript这些文件送到用户面前。我在运维这行摸爬滚打这么多年，见过太多因为选错托管平台而踩坑的案例。有的是因为贪便宜选了不靠谱的服务商，结果三天两头宕机；有的是一开始图省事，后来业务量上来了发现平台根本扛不住...今天就来跟大家聊聊这个话题，把市面上主流的托管平台都梳理一遍。云服务巨头们的天下说到托管平台，不得不先提这些云计算的大佬们。它们就像是互联网世界的"水电煤"，什么服务都有，就是学起来有点费脑子。Vercel - 前端开发者的心头好官网地址：https://vercel.com/要说现在最火的前端托管平台，Vercel绝对排得上号。我记得刚开始接触Next.js的时候，部署简直是噩梦，各种配置文件搞得头大。后来用了Vercel，真的是一键部署，连Git都给你集成好了，每次push代码自动就部署了。免费额度也挺良心的，个人项目基本够用。不过有个小问题，国内访问有时候会有点慢，这个就看运气了。Netlify - Vercel的老对手官网地址：https://www.netlify.com/Netlify和Vercel功能差不多，都是专门做静态网站和JAMstack应用的。我个人感觉Netlify的文档写得更详细一些，新手友好度稍微高一点。而且它的表单处理功能挺实用的，做个简单的联系表单不用写后端代码。前段时间帮朋友部署一个Vue项目，在Vercel和Netlify之间纠结了半天，最后选了Netlify，主要是看中它的分支预览功能比较好用。AWS - 云计算的老大哥AWS这个就不用多介绍了吧，亚马逊的云服务，功能多到你用不完。EC2、S3、Lambda、RDS...光是服务名称就能背一天。我之前在一家创业公司的时候，整个基础设施都跑在AWS上。说实话，功能确实强大，但是账单也挺"强大"的。而且AWS的学习曲线比较陡，新手上来可能会被各种概念搞晕。不过如果你的应用比较复杂，需要用到各种服务，AWS确实是个不错的选择。Amplify这个产品专门针对前端开发者，用起来比直接操作EC2简单多了。（打个广告，买aws服务器找我）Google Cloud Platform - AI和数据的强者官网地址：https://cloud.google.com/GCP在机器学习和大数据处理方面确实有优势，毕竟背靠Google这棵大树。App Engine用起来也挺顺手的，部署Python和Node.js应用很方便。不过说实话，在国内用GCP有时候网络会有问题，这个大家都懂的。如果你的用户主要在海外，或者需要用到Google的AI服务，那GCP是个好选择。Microsoft Azure - 企业级应用的首选官网地址：https://azure.microsoft.com/zh-cn/Azure在企业市场做得不错，特别是如果你们公司本来就在用Office 365这套东西，那Azure集成起来会很方便。.NET应用部署到Azure App Service基本没什么坑。我见过不少传统企业选择Azure，主要是因为微软的技术支持比较到位，出了问题有人管。开发者友好的PaaS平台这类平台的好处就是你不用管服务器、操作系统这些底层的东西，专心写代码就行了。Railway - 新兴的黑马官网地址：https://railway.com/Railway这个平台我是最近才开始关注的，用下来感觉确实不错。界面设计得很现代，部署流程也很顺滑。价格比Heroku便宜不少，而且数据库集成做得挺好的。前几天用Railway部署了一个Node.js + PostgreSQL的项目，从代码提交到上线只用了几分钟，体验确实不错。Render - Heroku的有力竞争者官网地址：https://render.com/Render可以说是Heroku的直接竞争对手，功能类似但是价格更实惠。我特别喜欢它的一点是，静态网站和Web服务都有免费套餐，对于个人开发者来说很友好。而且Render的文档写得挺清楚的，各种语言和框架的部署教程都有，跟着做基本不会出错。Fly.io - 边缘计算的先锋官网地址：https://fly.io/Fly.io这个概念挺有意思的，把你的应用部署到全球各地的边缘节点上，用户访问的时候就近连接，延迟会低很多。我之前做过一个实时聊天的项目，对延迟要求比较高，用Fly.io部署后效果确实不错。不过配置稍微复杂一些，需要对Docker有一定了解。DigitalOcean App Platform - 简单直接DigitalOcean一直以简单易用著称，A…

别再瞎折腾了！这些Web渗透靶场让你从菜鸟变大神
type: item
date: 2025-11-16T13:56:28+00:00
description: 最近有朋友问我，想学Web渗透测试但不知道从哪里下手，网上的教程看了一堆，理论倒是懂了不少，可一到实际操作就抓瞎。说实话，这种情况我见得太多了，就像学游泳一样，光看视频是永远学不会的，必须得下水扑腾几下才行。Web渗透测试这个领域，实践比理论重要得多。你可以把SQL注入的原理背得滚瓜烂熟，但如果没有在真实环境中操作过，遇到实际情况还是会懵圈。这时候靶场就显得特别重要了，它们提供了一个安全的练习环境，让你可以放心大胆地去"搞破坏"。我自己这些年也折腾过不少靶场，有些确实不错，有些就比较坑了。今天就跟大家分享一下我用过的那些靶场，包括详细的搭建过程，希望能帮到想入门或者提升技能的朋友们。DVWA - 我的启蒙老师说到Web渗透靶场，DVWA（Damn Vulnerable Web Application）绝对是绕不开的。这个靶场我第一次接触是在大学时期，当时对网络安全一窍不通，就是觉得黑客很酷想学学。DVWA最大的优点就是简单直接，而且搭建起来也不复杂。它把常见的Web漏洞都集中在一个应用里，包括SQL注入、XSS、CSRF、文件上传漏洞等等。更贴心的是，每个漏洞都有四个难度级别：Low、Medium、High和Impossible。DVWA搭建教程搭建DVWA有好几种方式，我推荐用Docker，简单粗暴。方法一：Docker部署（推荐）# 拉取镜像 docker pull vulnerables/web-dvwa # 运行容器 docker run --rm -it -p 80:80 vulnerables/web-dvwa就这么简单，打开浏览器访问http://localhost就能看到DVWA了。默认用户名是admin，密码是password。点击create database，创建靶场方法二：传统部署如果你不想用Docker，也可以手动搭建：先准备LAMP环境（Linux + Apache + MySQL + PHP）从GitHub下载DVWA源码：git clone https://github.com/digininja/DVWA.git把代码放到Apache的web目录下修改配置文件config/config.inc.php.dist，重命名为config.inc.php创建数据库，访问setup页面初始化说实话，第二种方法比较麻烦，特别是在Windows上搭建，各种环境问题能把人搞疯。我当年就是这么过来的，踩了无数坑。我记得当时第一次成功执行SQL注入的时候，那种兴奋感真的无法形容。在Low级别下，你甚至可以直接在输入框里输入1' or '1'='1这种最基础的payload就能成功，虽然现在看来很幼稚，但对新手来说这种成就感是很重要的。WebGoat - 教学式的好帮手WebGoat是OWASP项目下的一个靶场，说实话刚开始我对它印象一般，觉得太"教学化"了。但后来发现，正是这种教学化的设计让它变得很有价值。WebGoat搭建过程WebGoat基于Java开发，搭建相对简单：方法一：直接运行JAR包# 下载最新版本的jar包 wget https://github.com/WebGoat/WebGoat/releases/download/v8.2.2/webgoat-server-8.2.2.jar # 运行 java -jar webgoat-server-8.2.2.jar --server.port=8080访问http://localhost:8080/WebGoat就可以了，需要先注册一个账号。方法二：Docker部署docker run -p 8080:8080 -t webgoat/goatandwolf这个镜像同时包含了WebGoat和WebWolf，WebWolf是一个辅助工具，可以帮你接收邮件、查看请求等。这个靶场最大的特点就是每个漏洞都有详细的说明和提示，就像有个老师在旁边指导你一样。比如在练习SQL注入的时候，它会告诉你应该关注哪些地方，可能的注入点在哪里，甚至会给出一些提示让你思考。我特别喜欢WebGoat的一点是它会跟踪你的学习进度，完成一个挑战后会有明确的反馈。这种游戏化的设计让学习过程不那么枯燥。bWAPP - 漏洞的百科全书bWAPP（buggy Web Application）这个靶场我是在工作后才接触到的，当时公司要做安全培训，同事推荐的。这个靶场最大的特点就是漏洞种类多，号称包含了100多种Web漏洞。bWAPP搭建指南bWAPP基于PHP开发，搭建过程：使用Docker（最简单）docker run -d -p 80:80 raesene/bwapp手动搭建下载源码：git clone https://github.com/ethicalhack3r/bWAPP.git…

面向云工程师的 Linux 命令行终极指南
type: item
date: 2025-11-15T16:05:22+00:00
description: 终端是您通往云基础设施的门户。无论您是通过 SSH 连接到 EC2 实例、排查 Lambda 容器环境故障，还是配置 ECS 任务，都需要熟练地操作类 Unix 系统。本指南涵盖了云工程师日常工作中会用到的基本 Linux 命令行技能。读完本文，您将对终端、shell、文件系统、权限和软件包管理有基本的了解。您将知道如何使用命令行工具访问远程服务器、排查问题以及自动化工作流程。先决条件类 Unix 环境（Linux、macOS 或安装了 WSL 的 Windows）熟悉文本编辑器的基本操作AWS 账户（可选，用于特定于云的示例）了解终端和外壳“终端”、“shell”和“命令行”这几个词经常被混用。让我来解释一下每个术语的含义以及区分它们的重要性。什么是终端？终端是一种接收文本输入并呈现文本输出的程序。历史上，终端是物理设备——键盘和显示器连接到大型计算机。如今，您可以使用终端模拟器，例如 Ghostty、iTerm2 或 macOS 内置的“终端”。打开终端应用程序后，会显示一个提示符，您可以在其中输入命令。终端本身并不解释这些命令，它只负责处理输入和输出。什么是贝壳？shell 是实际处理命令的程序。当你输入 echo "Hello World" 并按下回车键时，shell 会读取这段文本，求值，执行，然后返回输出。这个循环称为 REPL：读取 (Read)、求值 (Evaluate)、打印 (Print)、循环 (Loop)。最常见的两种贝壳是：bash （Bourne Again Shell）——大多数 Linux 发行版的默认脚本zsh （Z Shell）——现代 macOS 的默认 shell两者都是功能强大的脚本语言，可以处理变量、条件语句、循环语句和函数。本指南中的所有示例均可在 bash 和 zsh 中运行。为什么这对 AWS 很重要当您通过 SSH 连接到 EC2 实例时，实际上是连接到该远程机器上的一个 shell 会话。配置 Lambda 容器镜像时，您通常会编写 shell 脚本。排查 ECS 任务故障时，您需要检查 shell 输出日志。了解 shell 意味着了解你的云基础设施如何执行命令。让我来演示一下。打开终端并运行：$ echo "Hello World"shell 读取此命令，将 echo 识别为程序，传递 "Hello World" 作为参数，并打印结果。现在试试：$ expr 123456 + 7890您的输出结果显示：131346shell 可以执行算术运算、字符串操作和复杂的逻辑运算。这就是为什么 shell 脚本是 DevOps 自动化的基础。文件系统导航云服务器本质上就是 Linux 机器。你需要浏览它们的文件系统来配置应用程序、查看日志和排查问题。您当前的位置你的 shell 始终有一个“工作目录”——也就是你当前所在的文件夹。你可以用以下命令查看：$ pwd这将打印出你的工作目录。在 macOS 上，你可能会看到：/Users/cindy在 Linux 系统上：/home/cindy这是您的用户目录，您的个人文件都存放在这里。文件路径文件路径是文件在目录树中位置的文本表示。所有绝对路径都从根目录（ / ）开始。在 Linux 系统中，您的用户主目录可能是 /home/achar ，这意味着：从根目录开始 /进入 home 目录进入 achar 目录每个目录之间用斜杠分隔。文件列表ls 命令列出目录内容：$ ls您可以看到当前位置的文件和目录。添加标志可以自定义输出：$ ls -l这将显示包含权限、所有者、文件大小和修改日期的“完整”格式文件。添加 -a 标志可显示隐藏文件：$ ls -la隐藏文件以点号（ . ）开头。配置文件，例如 .bashrc 或 .zshrc ，默认情况下是隐藏的。更改目录使用 cd 浏览文件系统：$ cd /var/log这会将您移动到 /var/log ，系统日志就存储在这里。请检查您的新位置：$ pwd输出显示 /var/log 。要返回上一级目录，请使用特殊别名 .. :$ cd ..现在你位于 /var 下。要从任何位置返回你的主目录：$ cd ~波浪号（ ~ ）是您主目录的别名。相对路径与绝对路径绝对路径以 / 开头，并且可以从任何位置开始使用：$ cd /var/log/nginx相对路径从您当前的位置开始：$ cd nginx只有当当前位置存在 nginx 目录时，此方法才有效。AWS 背景：EC2 日志文件当您通过 SSH 连接到运行 Web 应用程序的 EC2 实例时，通常需要查看日志。应用程序日志通常位于：/var/log - 系统和服务日志/var/log/nginx 或 /var/log/apache2 - Web 服务器日志…

云崩溃剖析：对 2025 年 10 月 AWS 服务中断的技术深度分析
type: item
date: 2025-11-15T16:03:57+00:00
description: 简而言之：15 小时停电2025 年 10 月 20 日，AWS 美国东部 1 区（北弗吉尼亚） 发生了一次灾难性的服务中断，持续了 15 小时。根本原因是 DynamoDB 的 DNS 自动化系统中出现了一个罕见的竞争条件，导致 DynamoDB 完全无法访问。由于 DynamoDB 是 AWS 控制平面的核心组件，为 EC2、IAM、STS、Lambda 和 Redshift 等关键服务提供底层支持，最终导致超过 140 项 AWS 服务受到不同程度的影响。独立监测机构的数据显示，大约 20% 到 30% 的面向互联网的服务在此期间出现了中断——这几乎影响了全球互联网流量的三分之一。------# AWS 基础设施上下文要理解这次故障的严重性，首先需要了解 AWS 的基础设施组织方式：区域：地理位置分散的计算资源集群（如美国东部-1、亚太东北-1等）可用区（AZ）：每个区域内的物理隔离数据中心，通常有3-6个控制平面：负责身份验证、资源编排和请求路由的管理层数据平面：执行实际计算、存储和处理任务的资源层这次故障属于区域控制平面故障，比单个服务的崩溃要严重得多，因为控制平面是整个 AWS 生态系统的神经中枢，众多系统依赖 DynamoDB 来存储元数据和协调操作。------# 读完本文后，您将会明白：DynamoDB DNS 竞争条件的精确触发机制及其技术细节为什么一个仅持续2.5小时的DNS故障会演变成15小时的大规模宕机亚稳态故障如何导致 EC2 控制平面陷入无法自愈的循环这场失败是如何在全球互联网基础设施中产生连锁反应的如何设计和构建系统以在未来避免类似的灾难性故障------# 第一部分：根本原因分析## DynamoDB DNS 自动化系统内部工作原理DynamoDB 使用一个双组件系统来维护其 DNS 条目的一致性：### DNS 规划器（Planner）这个组件负责生成称为"计划"（Plans）的路由配置集合，每个计划详细描述：可用的后端服务器列表及其状态每个服务器的健康状态和流量权重故障转移优先级和策略DNS TTL（生存时间）值和缓存策略### DNS 执行器（Executor）这些是分布式工作节点，负责读取规划器生成的计划并将其应用到 Route 53（AWS 的 DNS 服务）。为了实现高可用性，执行器被设计为可以在不同的可用区独立运行，确保即使某个可用区出现故障，DNS 更新也能继续进行。------## 故障发生的精确过程2025年10月20日的事件按时间顺序展开：上午9:17，一个执行器在处理计划 100时由于网络分区问题陷入停滞状态。同时，其他执行器成功实施了计划 101和计划 102，系统正常运行。上午11:42，自动清理作业按照设计删除了已经应用的旧计划，包括计划100。下午2:03，那个之前停滞的执行器突然恢复了网络连接，并尝试完成其未完成的任务——应用计划100。由于该计划已经被删除，执行器错误地将其解释为一个空的 DNS 更新，并将这个空配置提交到了 Route 53。最终结果：dynamodb.us-east-1.amazonaws.com这个关键的 DNS 记录现在不再指向任何 IP 地址，导致所有尝试连接到 DynamoDB 的请求都失败。值得注意的是，DynamoDB 服务本身的实例和数据仍然完好无损地运行着，但由于 DNS 解析失败，它们变得完全无法访问——就像一座桥梁突然消失，切断了所有通往城市的道路。这个看似简单的 DNS 问题成为了引发更大规模灾难的导火索。------## DNS 竞争条件技术图解图中展示了：1. 正常执行流程 - 执行器读取计划并应用 2. 延迟执行器因网络问题停滞 3. 清理作业删除旧计划 4. 延迟执行器恢复并应用已不存在的计划 5. 空DNS更新导致DynamoDB记录被擦除 这种罕见的竞争条件展示了分布式系统中时序问题的危险性，即使是经过精心设计的系统也可能存在这类边缘情况。# 第二部分：连锁反应分析## 从2.5小时故障到15小时宕机的演变AWS 工程团队在发现 DNS 问题后，仅用了约 2.5 小时就修复了 DynamoDB 的 DNS 记录。然而，整个区域并未如预期那样恢复正常，而是进入了一种亚稳态故障（metastable failure）状态。亚稳态故障是分布式系统中的一种特殊状态，系统虽然"活着"但无法正常工作，主要由以下因素导致：积压的请求数量远超系统的处理能力客户端和服务之间的重试风暴进一步放大了负载系统的自愈机制被积压的请求所阻塞，无法正常运行## 故障级联过程详解### 1. EC2 的 Droplet 工作流管理器（DWFM）失效DWFM 是 EC2 的核心组件，负责管理虚拟机实例的生命周期，它将主机租约和元数据存储在…

[AWS]别再让用户等到花儿都谢了！Python + S3 文件上传的终极优化指南
type: item
date: 2025-11-13T14:33:10+00:00
description: 前几天又遇到客户反馈说用户上传个视频要等半天，体验太差了。我一看代码，好家伙，文件还在走服务器中转，这不是自己给自己找罪受吗？今天就来聊聊怎么把文件上传这件事做得又快又稳，不管是5MB的图片还是5GB的视频，都能让用户爽到飞起。说实话，文件上传这块水还挺深的，踩过的坑能绕地球一圈。不过别担心，我把这些年踩过的坑都给你们总结出来了。🚀 核心思路：别让服务器当搬运工记住一句话：永远不要让文件经过你的服务器。我之前就犯过这个错误，用户上传文件先到我们服务器，然后再转发到S3。结果呢？服务器内存爆了，用户等得想骂娘，老板天天找我谈话。❌ 错误姿势（慢得要死）客户端 → 你的服务器 → S3这样搞的话，你的服务器就成了瓶颈。内存占用飙升，超时一堆，扩展性基本为零。✅ 正确姿势（快到起飞）客户端 → S3（直接上传）你的服务器只负责生成个预签名URL就行了，简单粗暴，效果拔群。📦 代码实现：基础预签名URL上传先来看看最基本的实现，这个已经能解决80%的场景了。S3服务配置# s3_service.py import boto3 import uuid from datetime import datetime, timedelta from botocore.exceptions import ClientError from typing import Dict, Tuple import logging class S3Service: def __init__(self, aws_access_key: str, aws_secret_key: str, region: str, bucket_name: str): # 这里配置一些性能优化参数 self.s3_client = boto3.client( 's3', aws_access_key_id=aws_access_key, aws_secret_access_key=aws_secret_key, region_name=region, config=boto3.session.Config( retries={'max_attempts': 3}, connect_timeout=5, read_timeout=5, max_pool_connections=50 # 连接池优化 ) ) self.bucket_name = bucket_name self.logger = logging.getLogger(__name__) def generate_presigned_url(self, filename: str, content_type: str, file_size: int) -> Dict[str, str]: """生成预签名URL，让客户端直接上传到S3""" try: # 生成唯一的文件key key = f"uploads/{uuid.uuid4()}/{filename}" # 生成预签名URL，15分钟过期 upload_url = self.s3_client.generate_presigned_url( 'put_object', Params={ 'Bucket': self.bucket_name, 'Key': key, 'ContentType': content_type, 'ContentLength': file_size }, ExpiresIn=900 # 15分钟，够用了 ) return { 'upload_url': upload_url, 'key': key } except ClientError as e: self.logger.error(f"生成预签名URL失败: {e}") raise Exception("生成上传链接失败")FastAPI控制器# upload_controller.py from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel from typing import Dict import logging router = APIRouter(prefix="/api/upload") logger = logging.getLogger(__name__) class UploadRequest(BaseModel): filename: str content_type: str file_size: int @router.post("/initiate") async def initiate_upload( request: UploadReques…

如何在 Azure 中创建 Windows 10 虚拟机
type: item
date: 2025-11-12T15:07:00+00:00
description: 什么是虚拟机？虚拟机（VM）是由软件创建和运行的物理计算机的虚拟化版本。本质上，它就是一台“云端计算机”。创建步骤创建虚拟机：在 Azure 门户中搜索虚拟机。点击创建虚拟机，在下拉菜单中选择虚拟机。在“基本信息”选项卡上，选择现有资源组或为虚拟机创建一个新的资源组。为虚拟机创建一个实例名称。选择一个地区。如有必要，请选择可用区；否则，请选择“不需要基础架构冗余”。选择图像和兼容的安全类型“标准”。创建管理员帐户。选择用户名和密码。创建入站端口：HTTP (80) 和 RDP。确认资格。转到监控选项卡，禁用系统启动诊断。转到标签选项卡，为虚拟机创建一个标签。然后进行审核和创建。点击创建。部署完成后，转到资源，然后转到网络，增加虚拟机的屏幕使用时间。保存更改。进入虚拟机概览并连接虚拟机。请前往下载 RDP 文件。下载完成后，进入电脑的下载文件夹，通过远程桌面协议进行部署，然后输入你在管理员部分创建的密码。连接上创建的win10如果这篇文章对你有帮助，别忘了点赞转发支持一下！想了解更多运维实战经验和技术干货，记得关注微信公众号@运维躬行录，领取学习大礼包！！！我会持续分享更多接地气的运维知识和踩坑经验。让我们一起在运维这条路上互相学习，共同进步！公众号：运维躬行录个人博客：躬行笔记

告别curl！这个命令行工具让API调试变得超简单
type: item
date: 2025-11-11T14:58:32+00:00
description: 最近在调试接口的时候，突然想起来之前一个粉丝朋友推荐过的工具——HTTPie。说实话，当时我还挺不以为然的（再次感谢粉丝大哥的分享），毕竟curl用了这么多年，已经形成肌肉记忆了。但是前几天遇到一个复杂的POST请求，需要传JSON数据还要带各种header，curl命令写得我头都大了，这才想起来试试HTTPie。不试不知道，一试吓一跳！这玩意儿确实比curl好用太多了。今天就来跟大家分享一下我这段时间使用HTTPie的心得体验。什么是HTTPie官方文档地址：https://httpie.io/docs/desktopHTTPie是一个用Python写的命令行HTTP客户端，专门用来测试、调试和与HTTP服务器交互。它的设计理念就是简单易用，语法直观，输出美观。相比curl那一堆参数，HTTPie的语法更接近自然语言。我记得第一次用curl的时候，光是记住那些参数就花了好长时间。-X指定方法，-H添加header，-d传数据...每次都要翻文档。HTTPie就不一样了，基本上看一眼就能明白什么意思。安装HTTPie安装过程很简单，支持多种方式：# 使用pip安装 pip install httpie # macOS用户可以用brew brew install httpie # Ubuntu/Debian sudo apt install httpie # CentOS/RHEL sudo yum install httpie我一般习惯用apt装，因为可以装到最新版本。装完之后就可以用http命令了，注意不是httpie。基本语法和使用HTTPie的基本语法格式是这样的：http [方法] URL [项目]最简单的GET请求：http httpbin.org/get就这么简单！不需要指定GET方法，因为默认就是GET。输出结果还是彩色的，JSON格式也会自动美化，看起来特别舒服。如果要发POST请求：http POST httpbin.org/post name=张三 age:=25注意这里的语法，name=张三表示发送表单数据，age:=25表示发送JSON数据（注意冒号）。这比curl的-d参数直观多了。处理不同类型的数据JSON数据发送JSON数据超级简单：http POST api.example.com/users name=john email=john@example.com age:=30 active:=true这会自动生成JSON格式：{ "name": "john", "email": "john@example.com", "age": 30, "active": true }如果你已经有现成的JSON文件，也可以直接读取：http POST api.example.com/users < user.json表单数据发送表单数据用等号：http --form POST httpbin.org/post name=张三 password=123456或者简写：http -f POST httpbin.org/post name=张三 password=123456文件上传上传文件也很方便：http --form POST httpbin.org/post file@/path/to/file.txt我之前用curl上传文件，总是记不住那个-F参数的格式，HTTPie这种方式就很直观。设置请求头添加请求头用冒号：http GET api.example.com/data Authorization:"Bearer token123" Content-Type:application/json常用的认证方式HTTPie也有简化写法：# Basic认证 http -a username:password GET api.example.com/protected # Bearer token http GET api.example.com/data Authorization:"Bearer $(cat token.txt)"我经常需要调试需要认证的API，这个功能真的很实用。会话管理HTTPie有个很棒的功能叫会话（Session），可以在多个请求之间保持状态。比如登录后的cookie、认证信息等。创建一个会话：http --session=mysession POST api.example.com/login username=admin password=secret然后在后续请求中使用这个会话：http --session=mysession GET api.example.com/profile这样就不用每次都重新输入认证信息了。会话文件默认保存在~/.httpie/sessions/目录下。输出…

全面掌控Windows服务器安全：审计策略配置与日志管理完全指南
type: item
date: 2025-11-10T14:43:35+00:00
description: 最近客户又出了安全事故，一些服务器上一些数据文件莫名丢失。说实话，做了这么多年运维，每次出事故都是这样，平时不重视，出了问题就开始各种要求。今天就跟大家聊聊Windows Server安全加固中的审计配置，这个话题可能有点枯燥，但真的很重要。我记得去年有个朋友的公司被黑了，事后调查发现连基本的登录审计都没开，想查都查不到什么有用信息，最后只能重装系统了事。基础审计策略配置Windows Server的审计策略分为两个层面：本地安全策略和组策略。对于单台服务器，我们可以通过本地安全策略来配置；如果是域环境，建议通过组策略统一管理。打开本地安全策略的方法很简单，运行secpol.msc就行了。在安全设置下面有个本地策略，里面就是审计策略。不过这里有个坑，Windows Server 2008以后的版本，微软把审计策略分成了基本审计和高级审计两套体系。基本审计策略比较粗糙，只有9个大类：审计账户登录事件审计账户管理审计目录服务访问审计登录事件审计对象访问审计策略更改审计特权使用审计进程跟踪审计系统事件这些看起来挺全面，但实际使用中你会发现粒度太粗了。比如说账户管理，它包括了用户创建、删除、密码修改等等操作，你没法单独控制某一种操作的审计。开启审计功能第一步：在运行或者CMD中输入gpedit.msc第二步：在组策略中定位到日志策略第三步：开启全部审计日志开启审计功能结束配置审计空间第一步：在运行/CMD窗口中输入compmgmt.msc打开计算机管理第二步：如图打开属性界面（理论上应用/系统和安全模块都需要配置，这里以安全为例子）第三步：配置空间大小，根据C盘来，可以先配置1GB。如果这篇文章对你有帮助，别忘了点赞转发支持一下！想了解更多运维实战经验和技术干货，记得关注微信公众号@运维躬行录，领取学习大礼包！！！我会持续分享更多接地气的运维知识和踩坑经验。让我们一起在运维这条路上互相学习，共同进步！公众号：运维躬行录个人博客：躬行笔记

通过命令行界面（winget）在 Windows 上安装 Node.js
type: item
date: 2025-11-08T14:19:02+00:00
description: 最近有接触到nodejs，今天就来讲讲在 Windows 上安装 Node.js ，直接通过命令行安装不再需要点击安装程序——这要归功于微软官方的 Windows 程序包管理器 winget 。以下是如何在几秒钟（三秒真男人！！！）内完全通过终端使用 npm 安装 Node.js 的方法。1. 打开 PowerShell按 Win + X → 选择 Windows PowerShell（管理员） 或终端（管理员） 。2. 查找可用的 Node.js 版本首先，列出所有可用的 Node.js 软件包：winget search OpenJS.NodeJS你会看到类似这样的结果：名称 ID 版本 源 ----------------------------------------------- Node.js OpenJS.NodeJS 25.1.0 winget Node.js 14 OpenJS.NodeJS.14 14.21.3 winget Node.js 16 OpenJS.NodeJS.16 16.20.2 winget Node.js 18 OpenJS.NodeJS.18 18.20.8 winget Node.js 20 OpenJS.NodeJS.20 20.19.5 winget Node.js 21 OpenJS.NodeJS.21 21.7.2 winget Node.js 22 OpenJS.NodeJS.22 22.21.0 winget Node.js 23 OpenJS.NodeJS.23 23.11.0 winget Node.js (LTS) OpenJS.NodeJS.LTS 24.11.0 winget选择 LTS 版本（推荐）或最新版本并安装：winget install -e --id OpenJS.NodeJS.LTS或者安装最新版本：winget install -e --id OpenJS.NodeJS⚠️ 建议大多数用户使用 LTS（长期支持）版本——它更稳定，并且会获得更长时间的安全更新。3. 重新打开命令行界面（重要！）安装完成后， 关闭并重新打开 PowerShell 或终端 。这将刷新 PATH 环境变量，以便识别 node 和 npm 。然后验证安装情况：node --version npm --version你应该能看到 Node.js 和 npm 的版本号（npm 与 Node.js 捆绑在一起）。4. 故障排除：PowerShell 中无法识别 npm。如果看到类似 npm : File C:\Program Files\nodejs\npm.ps1 cannot be loaded because running scripts is disabled on this system 的错误，则表示 PowerShell 的执行策略阻止了 npm 脚本。以下三种方法可以解决这个问题：选项 A：更改执行策略（推荐）以管理员身份运行 PowerShell 并设置执行策略：Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser然后关闭并重新打开 PowerShell。这样既可以运行本地脚本（例如 npm），又能防止未经签名的远程脚本运行。选项 B：改用命令提示符如果您不想更改 PowerShell 设置，请改用命令提示符 (cmd) 或带有命令提示符配置文件的 Windows 终端 。npm 在 cmd 中无需任何策略更改即可正常工作。选项 C：绕过当前会话暂时绕过当前 PowerShell 会话的策略：Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process这只会影响当前会话，关闭 PowerShell 时会重置。5.（可选）升级 npm保持 npm 更新：npm install -g npm@latest为什么要使用 winget？✅ 官方（由微软和 OpenJS 基金会维护）✅ 自动将 Node.js 和 npm 添加到 PATH 环境变量中（只需重新打开终端即可生效）✅ 完全可脚本化（非常适合自动化和持续集成）✅ 适用于全新机器的可复现设置就这样——你只需一条命令就在 Windows 上安装了 Node.js 和 npm，重新打开终端后即可使用。如果这篇文章对你有帮助，别忘了点赞转发支持一下！想了解更多运维实战经验和技术干货，记得关注微信公众号@运维躬行录，领取学习大礼包！！！我会持续分享更多接地气的运维知识和踩坑经验。让我们一起在运维这条路上互相学习，共同进步！公众号：运维躬行录个人博客：躬行笔记

运维老司机必备！5个Python脚本让你的工作效率翻倍
type: item
date: 2025-11-02T15:20:27+00:00
description: 最近在整理自己的脚本库，发现这些年积累下来的Python脚本真是不少。想起刚入行那会儿，每天都在重复做一些机械性的工作，后来慢慢学会了用Python来解决这些问题，工作效率确实提升了不少。今天就分享5个我平时用得最多的Python运维脚本，都是在Debian 13环境下测试过的，基本上覆盖了日常运维工作的方方面面。这些脚本不算复杂，但真的很实用，希望能帮到正在做运维的朋友们。1. 系统资源监控脚本这个脚本我几乎每天都在用，可以实时监控CPU、内存、磁盘使用情况。比那些复杂的监控系统轻量多了，而且可以根据自己的需求随时调整。#!/usr/bin/env python3 import psutil import time import datetime def get_system_info(): # CPU使用率 cpu_percent = psutil.cpu_percent(interval=1) # 内存信息 memory = psutil.virtual_memory() memory_percent = memory.percent memory_used = round(memory.used / 1024 / 1024 / 1024, 2) memory_total = round(memory.total / 1024 / 1024 / 1024, 2) # 磁盘信息 disk = psutil.disk_usage('/') disk_percent = round((disk.used / disk.total) * 100, 2) disk_used = round(disk.used / 1024 / 1024 / 1024, 2) disk_total = round(disk.total / 1024 / 1024 / 1024, 2) # 网络IO net_io = psutil.net_io_counters() return { 'timestamp': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'cpu_percent': cpu_percent, 'memory_percent': memory_percent, 'memory_used': memory_used, 'memory_total': memory_total, 'disk_percent': disk_percent, 'disk_used': disk_used, 'disk_total': disk_total, 'bytes_sent': round(net_io.bytes_sent / 1024 / 1024, 2), 'bytes_recv': round(net_io.bytes_recv / 1024 / 1024, 2) } def monitor_system(): while True: info = get_system_info() print(f"[{info['timestamp']}]") print(f"CPU使用率: {info['cpu_percent']}%") print(f"内存使用: {info['memory_used']}GB/{info['memory_total']}GB ({info['memory_percent']}%)") print(f"磁盘使用: {info['disk_used']}GB/{info['disk_total']}GB ({info['disk_percent']}%)") print(f"网络IO: 发送 {info['bytes_sent']}MB, 接收 {info['bytes_recv']}MB") print("-" * 50) # 如果资源使用率过高，可以在这里添加告警逻辑 if info['cpu_percent'] > 80 or info['memory_percent'] > 85: print("⚠️ 警告：系统资源使用率过高！") time.sleep(10) if __name__ == "__main__": monitor_system()这个脚本的好处是可以持续监控，而且输出格式比较清晰。我一般会在服务器上后台运行，然后把输出重定向到日志文件里。2. 批量服务器SSH连接检测管理多台服务器的时候，经常需要检查哪些机器能正常SSH连接。手动一台台去ping太麻烦了，这个脚本可以批量检测。#!/usr/bin/env python3 import paramiko import threading import queue import time …