Compare commits
13
Commits
3a1e386929
..
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
39254f1497 | ||
|
|
6ec51762dd | ||
|
|
e886c76c14 | ||
|
|
012e8ed87a | ||
|
|
04faca660a | ||
|
|
4224b80991 | ||
|
|
4432c47524 | ||
|
|
c605823567 | ||
|
|
80f229f9e2 | ||
|
|
a59f444f86 | ||
|
|
ae1152be1e | ||
|
|
88a4910def | ||
|
|
edf950b423 |
@@ -5,5 +5,195 @@ author: 文永达
|
|||||||
top_img: https://gcore.jsdelivr.net/gh/volantis-x/cdn-wallpaper/abstract/67239FBB-E15D-4F4F-8EE8-0F1C9F3C4E7C.jpeg
|
top_img: https://gcore.jsdelivr.net/gh/volantis-x/cdn-wallpaper/abstract/67239FBB-E15D-4F4F-8EE8-0F1C9F3C4E7C.jpeg
|
||||||
---
|
---
|
||||||
|
|
||||||
|
# 选择器与属性
|
||||||
|
|
||||||
|
## 基本语法结构
|
||||||
|
|
||||||
|
CSS的规则通常长这样:
|
||||||
|
```css
|
||||||
|
选择器 {
|
||||||
|
属性: 值;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 元素选择器
|
||||||
|
|
||||||
|
举个例子,如果我们想把网页上所有的`<h1>`标题变成红色:
|
||||||
|
|
||||||
|
```css
|
||||||
|
h1 {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- `h1` 是 **选择器**(选中所有 h1 标签)。
|
||||||
|
- `color` 是 **属性**(我们要改颜色)。
|
||||||
|
- `red` 是 **值**(改成红色)。
|
||||||
|
|
||||||
|
这叫 **元素选择器**,因为它选中了所有叫 `h1` 的元素。没问题,我们继续!🚀
|
||||||
|
|
||||||
|
为了确保你完全掌握了刚才的逻辑,我先揭晓一下刚才小练习的答案。要把 `<p>` 标签的文字变成蓝色,代码是这样的:
|
||||||
|
|
||||||
|
CSS
|
||||||
|
|
||||||
|
假设你的 HTML 里有这样一个段落标签:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<p>我是一个普通的段落。</p>
|
||||||
|
```
|
||||||
|
|
||||||
|
如果想把这个段落的文字颜色改成 **蓝色 (blue)**
|
||||||
|
|
||||||
|
```css
|
||||||
|
p {
|
||||||
|
color: blue;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
很简单对吧?这叫 **元素选择器**,因为它选中了所有叫 `p` 的元素。
|
||||||
|
|
||||||
|
------
|
||||||
|
|
||||||
|
🔥 进阶:如何只选中“某一个”?
|
||||||
|
|
||||||
|
在实际做网页时,我们通常不希望**所有**的段落都长得一样。比如,你可能希望有一个段落是特别的“警告信息”。
|
||||||
|
|
||||||
|
这时候,我们需要给 HTML 标签起个“名字”或者贴个“标签”。
|
||||||
|
|
||||||
|
1. **类 (Class)**:
|
||||||
|
- **作用**:就像给一群人穿上同样的制服。多个元素可以共用同一个 class。
|
||||||
|
- **CSS 写法**:用 `.` (小圆点) 开头。
|
||||||
|
2. **ID**:
|
||||||
|
- **作用**:就像身份证号。整个页面里,一个 ID 只能给一个元素用,是唯一的。
|
||||||
|
- **CSS 写法**:用 `#` (井号) 开头。
|
||||||
|
|
||||||
|
## 类选择器
|
||||||
|
|
||||||
|
假设我们的 HTML 代码是这样的:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<p class="alert">注意:这是一个警告!</p>
|
||||||
|
|
||||||
|
<p>我只是一个路人甲。</p>
|
||||||
|
```
|
||||||
|
|
||||||
|
如果我们只想选中那个带有 `alert` 类的段落,把它的颜色变成 **红色 (red)**,CSS 选择器应该怎么写?
|
||||||
|
|
||||||
|
**提示**:记得 Class 选择器要用 `.` 开头哦。
|
||||||
|
|
||||||
|
```css
|
||||||
|
.alert {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## ID 选择器
|
||||||
|
|
||||||
|
比 Class 更“独一无二”的:**ID**。
|
||||||
|
|
||||||
|
在 CSS 里,我们要用 **井号 (#)** 来代表 ID。
|
||||||
|
|
||||||
|
```html
|
||||||
|
<h1 id="main-title">欢迎来到我的主页</h1>
|
||||||
|
```
|
||||||
|
|
||||||
|
如果我们想把这个标题的 **字体大小 (font-size)** 设置为 **40px**,你应该怎么写这段 CSS?
|
||||||
|
|
||||||
|
**提示**:记得 ID 要用 `#` 开头哦。
|
||||||
|
|
||||||
|
```css
|
||||||
|
#main-title {
|
||||||
|
font-size: 40px;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 后代选择器 (Descendant Selector)
|
||||||
|
|
||||||
|
**根据“位置”来选元素**。
|
||||||
|
|
||||||
|
有时候,你不想选中“所有的 `a` 标签”,你只想选中“侧边栏 (Sidebar) 里的 `a` 标签”。这就需要用到**后代选择器**。
|
||||||
|
|
||||||
|
**语法规则**: 我们在两个选择器之间加一个 **空格 (Space)**,表示“里面的”意思。
|
||||||
|
|
||||||
|
```css
|
||||||
|
/* 选中所有在 div 里面的 p 标签 */
|
||||||
|
div p {
|
||||||
|
color: green;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- `div` 是父元素(外面的)。
|
||||||
|
|
||||||
|
- `p` 是子元素(里面的)。
|
||||||
|
|
||||||
|
- 中间的**空格**很关键!
|
||||||
|
|
||||||
|
假设我们有下面这段 HTML,里面有两个链接,但我们只想修改在 `.nav` 里面的那个链接:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<div class="nav">
|
||||||
|
<a href="#">我是导航菜单</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<a href="#">我是普通链接</a>
|
||||||
|
```
|
||||||
|
|
||||||
|
选中 **`.nav` 里面的 `a` 标签**,并把它的颜色改成 **橙色 (orange)**。
|
||||||
|
|
||||||
|
**提示**:记得利用空格来表示层级关系哦!
|
||||||
|
|
||||||
|
```css
|
||||||
|
.nav a {
|
||||||
|
color: orange;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 伪类 (Pseudo-classes)
|
||||||
|
|
||||||
|
现在你已经能控制元素“静止”时的样子了,接下来我们要让网页变得更有**互动感**。我们要学习的是 **伪类 (Pseudo-classes)**。
|
||||||
|
|
||||||
|
最常用的一个伪类是 `:hover`。
|
||||||
|
|
||||||
|
- **作用**:它是指“当鼠标**悬停**在元素上时”的那个瞬间。
|
||||||
|
- **语法**:在选择器后面紧跟着写 `:hover` (注意:冒号前面**不能**有空格)。
|
||||||
|
|
||||||
|
```css
|
||||||
|
/* 例子:所有按钮在鼠标放上去时,背景变黑 */
|
||||||
|
button:hover {
|
||||||
|
background-color: black;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```html
|
||||||
|
<div class="nav">
|
||||||
|
<a href="#">我是导航菜单</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<a href="#">我是普通链接</a>
|
||||||
|
```
|
||||||
|
|
||||||
|
要求: 当鼠标**悬停**在 `.nav` 里面的 `a` 标签上时,把它的**文字颜色**变成 **绿色 (green)**。
|
||||||
|
|
||||||
|
**提示**:你需要把刚才学的“后代选择器”和现在的“伪类”结合起来写哦!
|
||||||
|
|
||||||
|
```css
|
||||||
|
.nav a:hover {
|
||||||
|
color: green;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
# 盒模型
|
||||||
|
|
||||||
|
既然你已经学会了怎么给元素“上色”,接下来我们要学怎么控制它们的“身材”和“距离”。
|
||||||
|
|
||||||
|
在 CSS 的世界里,**所有的元素(无论是图片、段落还是标题)本质上都是一个矩形的盒子**。
|
||||||
|
|
||||||
|
我们要控制这个盒子,主要靠这四个属性(由内向外):
|
||||||
|
|
||||||
|
1. **内容 (Content)**:盒子的核心,就是文字或图片本身。
|
||||||
|
2. **内边距 (Padding)**:内容和边框之间的空间。就像快递盒子里的气泡膜,保护内容不紧贴着纸箱壁。
|
||||||
|
3. **边框 (Border)**:盒子的边缘。
|
||||||
|
4. **外边距 (Margin)**:盒子和其他盒子之间的距离。就像人与人之间的社交距离。
|
||||||
|
|
||||||
## CSS Text(文本)
|
## CSS Text(文本)
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,226 @@
|
|||||||
|
---
|
||||||
|
title: Claude Code
|
||||||
|
date: 2026-02-27 14:05:22
|
||||||
|
tags: [AI, 效率工具]
|
||||||
|
categories: 开发工具
|
||||||
|
---
|
||||||
|
|
||||||
|
## 简介
|
||||||
|
|
||||||
|
Claude Code 是 Anthropic 官方推出的 CLI 工具,让你在终端中直接使用 Claude AI 助手完成软件工程任务。
|
||||||
|
|
||||||
|
## 安装
|
||||||
|
|
||||||
|
### 通过 npm 安装
|
||||||
|
|
||||||
|
确保已安装 Node.js(推荐 v18+ 版本),然后使用 npm 全局安装:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install -g @anthropic-ai/claude-code
|
||||||
|
```
|
||||||
|
|
||||||
|
或者使用 yarn:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn global add @anthropic-ai/claude-code
|
||||||
|
```
|
||||||
|
|
||||||
|
使用 pnpm:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm add -g @anthropic-ai/claude-code
|
||||||
|
```
|
||||||
|
|
||||||
|
### 验证安装
|
||||||
|
|
||||||
|
```bash
|
||||||
|
claude -v
|
||||||
|
```
|
||||||
|
|
||||||
|
## 配置
|
||||||
|
|
||||||
|
### 1. 获取 API Key
|
||||||
|
|
||||||
|
访问 [Anthropic Console](https://console.anthropic.com/) 注册账号并获取 API Key。
|
||||||
|
|
||||||
|
### 2. 配置 API Key
|
||||||
|
|
||||||
|
有两种方式配置 API Key:
|
||||||
|
|
||||||
|
**方式一:环境变量(推荐)**
|
||||||
|
|
||||||
|
在命令行中设置环境变量:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Windows PowerShell
|
||||||
|
$env:ANTHROPIC_API_KEY="your-api-key-here"
|
||||||
|
|
||||||
|
# Windows CMD
|
||||||
|
set ANTHROPIC_API_KEY=your-api-key-here
|
||||||
|
|
||||||
|
# macOS/Linux
|
||||||
|
export ANTHROPIC_API_KEY="your-api-key-here"
|
||||||
|
```
|
||||||
|
|
||||||
|
**方式二:配置文件**
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"env": {
|
||||||
|
"ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY",
|
||||||
|
"ANTHROPIC_BASE_URL": "https://coding.dashscope.aliyuncs.com/apps/anthropic",
|
||||||
|
"ANTHROPIC_MODEL": "qwen3.5-plus"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
配置文件位置:
|
||||||
|
- Windows: `%USERPROFILE%\.claude\settings.json`
|
||||||
|
- macOS/Linux: `~/.claude\settings.json`
|
||||||
|
|
||||||
|
### 3. 配置模型
|
||||||
|
|
||||||
|
可以指定使用的 Claude 模型:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 使用最新模型
|
||||||
|
claude --model claude-opus-4-6
|
||||||
|
|
||||||
|
# 使用 Sonnet 模型
|
||||||
|
claude --model claude-sonnet-4-6
|
||||||
|
|
||||||
|
# 使用 Haiku 模型
|
||||||
|
claude --model claude-haiku-4-5-20251001
|
||||||
|
```
|
||||||
|
|
||||||
|
## 常用命令
|
||||||
|
|
||||||
|
| 命令 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| `claude` | 启动交互式对话 |
|
||||||
|
| `claude -p "问题"` | 直接提问并获取答案 |
|
||||||
|
| `claude --model <模型名>` | 指定模型 |
|
||||||
|
| `claude --version` | 查看版本 |
|
||||||
|
| `claude --help` | 查看帮助 |
|
||||||
|
|
||||||
|
## MCP 配置
|
||||||
|
|
||||||
|
MCP (Model Context Protocol) 允许 Claude 连接外部服务和工具。
|
||||||
|
|
||||||
|
### 添加 MCP Server
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 添加 fetch MCP 服务(用于网页内容抓取)
|
||||||
|
claude mcp add fetch -- uvx mcp-server-fetch
|
||||||
|
```
|
||||||
|
|
||||||
|
### 常用 MCP 服务
|
||||||
|
|
||||||
|
| 服务 | 命令 | 说明 |
|
||||||
|
|------|------|------|
|
||||||
|
| fetch | `claude mcp add fetch -- uvx mcp-server-fetch` | 网页内容抓取 |
|
||||||
|
| filesystem | `claude mcp add filesystem -- npx -y @anthropic-ai/mcp-server-filesystem` | 文件系统访问 |
|
||||||
|
| git | `claude mcp add git -- npx -y @anthropic-ai/mcp-server-git` | Git 操作 |
|
||||||
|
|
||||||
|
配置好的 MCP 配置文件实例 `~/.claude.json`
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"mcpServers": {
|
||||||
|
"context7": {
|
||||||
|
"command": "cmd",
|
||||||
|
"args": [
|
||||||
|
"/c",
|
||||||
|
"npx",
|
||||||
|
"-y",
|
||||||
|
"@upstash/context7-mcp@latest"
|
||||||
|
],
|
||||||
|
"env": {
|
||||||
|
"DEFAULT_MINIMUM_TOKENS": "10000"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Sequential Thinking": {
|
||||||
|
"command": "cmd",
|
||||||
|
"args": [
|
||||||
|
"/c",
|
||||||
|
"npx",
|
||||||
|
"-y",
|
||||||
|
"@modelcontextprotocol/server-sequential-thinking"
|
||||||
|
],
|
||||||
|
"env": {}
|
||||||
|
},
|
||||||
|
"Playwright": {
|
||||||
|
"command": "cmd",
|
||||||
|
"args": [
|
||||||
|
"/c",
|
||||||
|
"npx",
|
||||||
|
"-y",
|
||||||
|
"@executeautomation/playwright-mcp-server"
|
||||||
|
],
|
||||||
|
"env": {}
|
||||||
|
},
|
||||||
|
"Fetch": {
|
||||||
|
"command": "cmd",
|
||||||
|
"args": [
|
||||||
|
"/c",
|
||||||
|
"uvx",
|
||||||
|
"mcp-server-fetch"
|
||||||
|
],
|
||||||
|
"env": {}
|
||||||
|
},
|
||||||
|
"MySQL": {
|
||||||
|
"command": "cmd",
|
||||||
|
"args": [
|
||||||
|
"/c",
|
||||||
|
"uvx",
|
||||||
|
"--from",
|
||||||
|
"mysql-mcp-server",
|
||||||
|
"mysql_mcp_server"
|
||||||
|
],
|
||||||
|
"env": {
|
||||||
|
"MYSQL_HOST": "127.0.0.1",
|
||||||
|
"MYSQL_PORT": "3306",
|
||||||
|
"MYSQL_USER": "root",
|
||||||
|
"MYSQL_PASSWORD": "123456",
|
||||||
|
"MYSQL_DATABASE": "db"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### 查看已配置的 MCP
|
||||||
|
|
||||||
|
```bash
|
||||||
|
claude mcp list
|
||||||
|
```
|
||||||
|
|
||||||
|
### 移除 MCP
|
||||||
|
|
||||||
|
```bash
|
||||||
|
claude mcp remove <服务名>
|
||||||
|
```
|
||||||
|
|
||||||
|
## 使用示例
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 启动交互模式
|
||||||
|
claude
|
||||||
|
|
||||||
|
# 直接提问
|
||||||
|
claude -p "解释一下什么是闭包"
|
||||||
|
|
||||||
|
# 分析代码文件
|
||||||
|
claude -p "这个函数有什么问题" ./src/index.js
|
||||||
|
|
||||||
|
# 使用特定模型
|
||||||
|
claude --model claude-opus-4-6 -p "帮我重构这段代码"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
- API 调用会产生费用,请合理使用
|
||||||
|
- 建议将 API Key 设置为环境变量避免每次输入
|
||||||
|
- 不同模型的价格和能力有所不同,根据需要选择
|
||||||
+99
-1
@@ -747,6 +747,15 @@ Build Cache 12 0 0B 0B
|
|||||||
|
|
||||||
执行 **docker system prune -a** 命令之后,Docker 占用的磁盘空间减少了很多
|
执行 **docker system prune -a** 命令之后,Docker 占用的磁盘空间减少了很多
|
||||||
|
|
||||||
|
```shell
|
||||||
|
du -sh /var/lib/docker/containers/* | sort -rh | head -5
|
||||||
|
cd /var/lib/docker/containers/eb52fa7d62ce52ab7a6153636a0ec89c7c8dce6f1a94dc86b2fbf0702368e82
|
||||||
|
|
||||||
|
truncate -s 0 *-json.log
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 手动清理 Docker 镜像/容器/数据卷
|
## 手动清理 Docker 镜像/容器/数据卷
|
||||||
|
|
||||||
对于旧版的 Docker(版本 1.13 之前),是没有 docker system 命令的,因此需要进行手动清理。这里给出几个常用的命令
|
对于旧版的 Docker(版本 1.13 之前),是没有 docker system 命令的,因此需要进行手动清理。这里给出几个常用的命令
|
||||||
@@ -771,10 +780,41 @@ docker volume rm $(docker volume ls -qf dangling=true)
|
|||||||
|
|
||||||
## 限制容器的日志大小
|
## 限制容器的日志大小
|
||||||
|
|
||||||
|
防止它再次爆满
|
||||||
|
|
||||||
|
配置 Docker 全局日志轮转策略
|
||||||
|
|
||||||
|
**编辑/新建 Docker 配置文件**:`/etc/docker/daemon.json`
|
||||||
|
|
||||||
|
**添加 log-opts 配置**: (限制每个容器日志最大 100MB,最多保留 3 个文件)
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"log-driver": "json-file",
|
||||||
|
"log-opts": {
|
||||||
|
"max-size": "100m",
|
||||||
|
"max-file": "3"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
(注意:如果文件里已有其他配置,请确保 JSON 格式正确,不要漏掉逗号)
|
||||||
|
|
||||||
|
**重启 Docker 服务**:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
systemctl daemon-reload
|
||||||
|
systemctl restart docker
|
||||||
|
```
|
||||||
|
|
||||||
|
注意:此配置只对**新建**的容器生效。对于现有的 `1a28bcc...` 容器,你需要将其删除并重新运行 (`docker rm` -> `docker run`) 才能应用新策略。
|
||||||
|
|
||||||
|
## 清理容器日志
|
||||||
|
|
||||||
Docker 的所有相关文件,包括镜像、容器等都保存在 **/var/lib/docker** 目录中:
|
Docker 的所有相关文件,包括镜像、容器等都保存在 **/var/lib/docker** 目录中:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
du -hs /var/lib/docker/
|
du -sh /var/lib/docker/
|
||||||
29G /var/lib/docker/
|
29G /var/lib/docker/
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -786,6 +826,18 @@ du -hs /var/lib/docker/
|
|||||||
truncate -s 0 /var/lib/docker/containers/a376aa694b22ee497f6fc9f7d15d943de91c853284f8f105ff5ad6c7ddae7a53/*-json.log
|
truncate -s 0 /var/lib/docker/containers/a376aa694b22ee497f6fc9f7d15d943de91c853284f8f105ff5ad6c7ddae7a53/*-json.log
|
||||||
```
|
```
|
||||||
|
|
||||||
|
也可以清空文件内容,需要root权限
|
||||||
|
|
||||||
|
```shell
|
||||||
|
# 方法 1:使用 echo 重定向(推荐)
|
||||||
|
sh -c "echo '' > /var/lib/docker/containers/1a28bcc2e01033a9d83df7ac183cb128cdd81e40852befbb218459d04a054189/1a28bcc2e01033a9d83df7ac183cb128cdd81e40852befbb218459d04a054189-json.log"
|
||||||
|
|
||||||
|
# 或者 方法 2:使用 cat /dev/null
|
||||||
|
sh -c "cat /dev/null > /var/lib/docker/containers/1a28bcc2e01033a9d83df7ac183cb128cdd81e40852befbb218459d04a054189/1a28bcc2e01033a9d83df7ac183cb128cdd81e40852befbb218459d04a054189-json.log"
|
||||||
|
```
|
||||||
|
|
||||||
|
**原理:** 这会将文件的大小截断为 0,但保持文件的 inode(文件句柄)不变。Docker 进程可以继续向这个文件写入新日志,而你立即获得释放的空间。
|
||||||
|
|
||||||
## 重启 Docker
|
## 重启 Docker
|
||||||
|
|
||||||
当我清理了镜像、容器以及数据卷之后,发现磁盘空间并没有减少。根据[Docker disk usage](https://github.com/moby/moby/issues/12265)提到过的建议,我重启了 Docker,发现**磁盘使用率从 83%降到了 19%**。根据高手[指点](https://github.com/moby/moby/issues/12265#issuecomment-316303769),这应该是与内核 3.13 相关的 BUG,导致 Docker 无法清理一些无用目录:
|
当我清理了镜像、容器以及数据卷之后,发现磁盘空间并没有减少。根据[Docker disk usage](https://github.com/moby/moby/issues/12265)提到过的建议,我重启了 Docker,发现**磁盘使用率从 83%降到了 19%**。根据高手[指点](https://github.com/moby/moby/issues/12265#issuecomment-316303769),这应该是与内核 3.13 相关的 BUG,导致 Docker 无法清理一些无用目录:
|
||||||
@@ -803,6 +855,52 @@ uname -r
|
|||||||
|
|
||||||
如果你的内核版本也是 3.13,而且清理磁盘没能成功,不妨重启一下 Docker。当然,这个晚上操作比较靠谱。
|
如果你的内核版本也是 3.13,而且清理磁盘没能成功,不妨重启一下 Docker。当然,这个晚上操作比较靠谱。
|
||||||
|
|
||||||
|
# Docker 迁移
|
||||||
|
|
||||||
|
## 从Docker迁移到Podman
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 迁移步骤概要
|
||||||
|
# 1. 安装Podman
|
||||||
|
sudo apt-get install podman
|
||||||
|
|
||||||
|
# 2. 迁移Docker配置
|
||||||
|
podman system migrate
|
||||||
|
|
||||||
|
# 3. 迁移镜像(如需要)
|
||||||
|
docker save myimage | podman load
|
||||||
|
|
||||||
|
# 4. 创建别名(可选)
|
||||||
|
echo "alias docker=podman" >> ~/.zshrc
|
||||||
|
source ~/.zshrc
|
||||||
|
|
||||||
|
# 5. 验证功能等效性
|
||||||
|
podman run --rm hello-world
|
||||||
|
```
|
||||||
|
|
||||||
|
## 从Docker迁移到nerdctl
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 迁移步骤概要
|
||||||
|
# 1. 安装containerd和nerdctl
|
||||||
|
sudo apt-get install containerd.io
|
||||||
|
sudo nerdctl install
|
||||||
|
|
||||||
|
# 2. 配置nerdctl
|
||||||
|
sudo cp /etc/docker/daemon.json /etc/nerdctl/nerdctl.toml
|
||||||
|
|
||||||
|
# 3. 迁移镜像(如需要)
|
||||||
|
docker save myimage | sudo nerdctl load
|
||||||
|
|
||||||
|
# 4. 更新脚本和CI/CD流程
|
||||||
|
# 将所有'docker'命令替换为'nerdctl'
|
||||||
|
|
||||||
|
# 5. 验证功能等效性
|
||||||
|
nerdctl run --rm hello-world
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Docker 实例
|
# Docker 实例
|
||||||
|
|
||||||
## Docker 启动 MariaDB
|
## Docker 启动 MariaDB
|
||||||
|
|||||||
@@ -0,0 +1,186 @@
|
|||||||
|
---
|
||||||
|
title: Git Cherry-Pick
|
||||||
|
date: 2025-12-11 23:02:39
|
||||||
|
tags:
|
||||||
|
---
|
||||||
|
|
||||||
|
# Git Cherry-Pick 详解文档
|
||||||
|
|
||||||
|
## 1. 概述
|
||||||
|
|
||||||
|
`git cherry-pick` 是 Git 中一个强大的命令,用于**将一个或多个指定的提交(commits)从一个分支“摘取”并应用到当前分支上**。它不会合并整个分支,而是只复制你指定的提交变更。
|
||||||
|
|
||||||
|
> 简单理解:**“只拿我想要的改动,不拿整个分支”**。
|
||||||
|
|
||||||
|
## 2. 基本语法
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git cherry-pick <commit-hash>
|
||||||
|
git cherry-pick <commit1> <commit2> ...
|
||||||
|
git cherry-pick <start-commit>^..<end-commit> # 摘取一个范围(含 start 和 end)
|
||||||
|
```
|
||||||
|
|
||||||
|
- `<commit-hash>`:要摘取的提交的完整或简短哈希值
|
||||||
|
- 可以一次指定多个提交,Git 会按顺序逐个应用
|
||||||
|
- 提交顺序很重要:默认按你提供的顺序执行(不是按时间顺序)
|
||||||
|
|
||||||
|
## 3. 典型使用场景
|
||||||
|
|
||||||
|
### ✅ 场景 1:修复补丁快速移植
|
||||||
|
|
||||||
|
> 在 `dev` 分支上修复了一个严重 bug,需要紧急同步到 `release` 分支,但 `dev` 上还有其他未测试功能不能合并。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git checkout release
|
||||||
|
git cherry-pick a1b2c3d # 仅应用修复提交s
|
||||||
|
```
|
||||||
|
|
||||||
|
### ✅ 场景 2:从 feature 分支提取部分功能
|
||||||
|
|
||||||
|
> 某个功能分支开发了多个特性,但当前只希望上线其中一部分。
|
||||||
|
|
||||||
|
### ✅ 场景 3:从其他远程仓库(如上游)选取特定提交
|
||||||
|
|
||||||
|
> 例如你 fork 了一个开源项目,原项目修复了某个问题,你想只拿这个修复。
|
||||||
|
|
||||||
|
## 4. 工作流程示例
|
||||||
|
|
||||||
|
假设你有两个分支:`main` 和 `feature`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 当前在 main 分支
|
||||||
|
git checkout main
|
||||||
|
|
||||||
|
# 查看 feature 分支的提交历史
|
||||||
|
git log feature --oneline
|
||||||
|
# 输出:
|
||||||
|
# abc1234 Add login feature
|
||||||
|
# def5678 Fix typo
|
||||||
|
# ghi8901 Update README
|
||||||
|
|
||||||
|
# 只想把 "Fix typo" 提交应用到 main
|
||||||
|
git cherry-pick def5678
|
||||||
|
```
|
||||||
|
|
||||||
|
执行后,`main` 分支会产生一个**新的提交**(哈希不同),但内容与 `def5678` 相同。
|
||||||
|
|
||||||
|
> ⚠️ 注意:cherry-pick 会创建**新提交**(new commit with new hash),不是“移动”原提交。
|
||||||
|
|
||||||
|
## 5. 常用选项
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
| 选项 | 说明 |
|
||||||
|
| --------------------- | ------------------------------------------------------------ |
|
||||||
|
| `-n` 或 `--no-commit` | 应用变更但**不自动提交**,只暂存改动(便于手动调整后提交) |
|
||||||
|
| `-e` 或 `--edit` | 在提交前打开编辑器,允许修改提交信息 |
|
||||||
|
| `-x` | 在提交信息末尾自动添加 `(cherry picked from commit ...)`,用于追踪来源(推荐用于公共仓库) |
|
||||||
|
| `--ff` | 如果当前分支是目标提交的直接后代,则 fast-forward(极少用) |
|
||||||
|
| `--abort` | 放弃整个 cherry-pick 操作,回到操作前状态 |
|
||||||
|
| `--continue` | 解决冲突后继续执行剩余的 cherry-pick |
|
||||||
|
|
||||||
|
## 6. 冲突处理
|
||||||
|
|
||||||
|
如果 cherry-pick 的变更与当前分支有冲突:
|
||||||
|
|
||||||
|
1. Git 会暂停操作,并提示冲突文件
|
||||||
|
|
||||||
|
2. 手动解决冲突(像 merge 一样)
|
||||||
|
|
||||||
|
3. 使用 `git add <file>` 标记冲突已解决
|
||||||
|
|
||||||
|
4. 执行:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git cherry-pick --continue
|
||||||
|
```
|
||||||
|
|
||||||
|
5. 如果想放弃:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git cherry-pick --abort
|
||||||
|
```
|
||||||
|
|
||||||
|
## 7. 注意事项与最佳实践
|
||||||
|
|
||||||
|
### ⚠️ 不要滥用 cherry-pick
|
||||||
|
|
||||||
|
- 频繁 cherry-pick 会导致提交历史混乱、重复提交
|
||||||
|
- 优先考虑 `git merge` 或 `git rebase` 来保持清晰历史
|
||||||
|
|
||||||
|
### ✅ 使用 `-x` 标记来源
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git cherry-pick -x abc1234
|
||||||
|
```
|
||||||
|
|
||||||
|
生成的提交信息会包含来源,便于追溯。
|
||||||
|
|
||||||
|
### ✅ 范围摘取时注意顺序
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 正确:从旧到新
|
||||||
|
git cherry-pick A^..C # 包含 A, B, C(按时间顺序)
|
||||||
|
|
||||||
|
# 错误:顺序颠倒可能导致冲突
|
||||||
|
git cherry-pick C B A
|
||||||
|
```
|
||||||
|
|
||||||
|
### ✅ 摘取前先 fetch
|
||||||
|
|
||||||
|
如果从远程分支摘取,务必先:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git fetch origin
|
||||||
|
# 或
|
||||||
|
git fetch your-remote-name
|
||||||
|
```
|
||||||
|
|
||||||
|
### ✅ 避免在公共分支上 cherry-pick 后 force push
|
||||||
|
|
||||||
|
这会导致协作混乱。
|
||||||
|
|
||||||
|
## 8. 与类似命令对比
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
| 命令 | 作用 | 是否创建新提交 | 是否保留历史 |
|
||||||
|
| ----------------- | -------------- | ---------------------------- | -------------------- |
|
||||||
|
| `git cherry-pick` | 摘取指定提交 | ✅ 是 | ❌ 不保留原分支上下文 |
|
||||||
|
| `git merge` | 合并整个分支 | ✅(通常是一个 merge commit) | ✅ 保留完整历史 |
|
||||||
|
| `git rebase` | 变基,重放提交 | ✅(新提交) | ✅ 但线性化历史 |
|
||||||
|
|
||||||
|
## 9. 实用技巧
|
||||||
|
|
||||||
|
### 摘取多个连续提交
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 摘取从 A 到 C 的所有提交(包含 A 和 C)
|
||||||
|
git cherry-pick A^..C
|
||||||
|
```
|
||||||
|
|
||||||
|
### 仅应用改动,稍后提交
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git cherry-pick -n abc1234
|
||||||
|
# 修改文件或拆分提交
|
||||||
|
git add .
|
||||||
|
git commit -m "Custom message"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 查看哪些提交尚未被 cherry-pick(用于同步)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git log origin/main..feature --oneline
|
||||||
|
# 列出 feature 有但 main 没有的提交
|
||||||
|
```
|
||||||
|
|
||||||
|
## 10. 总结
|
||||||
|
|
||||||
|
`git cherry-pick` 是一个**精准、灵活但需谨慎使用**的工具,适用于:
|
||||||
|
|
||||||
|
- 紧急修复移植
|
||||||
|
- 选择性功能集成
|
||||||
|
- 跨仓库补丁同步
|
||||||
|
|
||||||
|
> 📌 **原则:用完即走,不作为日常集成手段。**
|
||||||
+144
-1
@@ -243,6 +243,12 @@ du -Sh / | sort -rh | head -n10
|
|||||||
|
|
||||||
# 只看大小在 GB 范围内的所有文件
|
# 只看大小在 GB 范围内的所有文件
|
||||||
du -ah / | grep "[0-9]G\b"
|
du -ah / | grep "[0-9]G\b"
|
||||||
|
|
||||||
|
# 查看各目录占用(从根目录开始,排序显示)
|
||||||
|
du -sh /* 2>/dev/null | sort -rh | head -20
|
||||||
|
|
||||||
|
# 重点查看 /var 目录
|
||||||
|
du -sh /var/* 2>/dev/null | sort -rh | head -20
|
||||||
```
|
```
|
||||||
|
|
||||||
## 进程管理
|
## 进程管理
|
||||||
@@ -1416,6 +1422,36 @@ UUID=0EAB-5879 /boot/efi vfat umask=0077,shortname=win
|
|||||||
systemctl daemon-reload
|
systemctl daemon-reload
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### NTFS -> ext4
|
||||||
|
|
||||||
|
确认目标分区
|
||||||
|
|
||||||
|
扎到要格式化的分区名称(例如 `/dev/sda1`)。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
lsblk -f
|
||||||
|
```
|
||||||
|
|
||||||
|
卸载分区
|
||||||
|
|
||||||
|
如果该分区已经挂载(MOUNTPOINT 列有路径),必须先将其卸载才能格式化。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo umount /dev/sda1
|
||||||
|
```
|
||||||
|
|
||||||
|
执行格式化命令
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo mkfs.ext4 /dev/sda1
|
||||||
|
```
|
||||||
|
|
||||||
|
验证结果
|
||||||
|
|
||||||
|
```bash
|
||||||
|
lsblk -f
|
||||||
|
```
|
||||||
|
|
||||||
## 挂载卷
|
## 挂载卷
|
||||||
|
|
||||||
### Windows 网络共享位置
|
### Windows 网络共享位置
|
||||||
@@ -1448,6 +1484,18 @@ mount -t cifs -o username=user,password=backup //192.168.0.1/备份 /mnt/wdshare
|
|||||||
//192.168.0.1/备份 /mnt/wdshare/ cifs username=user,password=backup 0 0
|
//192.168.0.1/备份 /mnt/wdshare/ cifs username=user,password=backup 0 0
|
||||||
```
|
```
|
||||||
|
|
||||||
|
`:wq`保存好,使用以下命令使修改生效
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
```
|
||||||
|
|
||||||
|
一键挂载上
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sudo mount -a
|
||||||
|
```
|
||||||
|
|
||||||
### NTFS 分区
|
### NTFS 分区
|
||||||
|
|
||||||
#### 可读可写
|
#### 可读可写
|
||||||
@@ -3388,4 +3436,99 @@ snap install --classic certbot
|
|||||||
ln -s /snap/bin/certbot /usr/bin/certbot
|
ln -s /snap/bin/certbot /usr/bin/certbot
|
||||||
```
|
```
|
||||||
|
|
||||||
### 范
|
## 安装 frp
|
||||||
|
|
||||||
|
### 配置服务端 (frps) 为服务
|
||||||
|
|
||||||
|
在公网服务器上部署服务端
|
||||||
|
|
||||||
|
创建 Systemd 服务文件
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo vim /etc/systemd/system/frps.service
|
||||||
|
```
|
||||||
|
|
||||||
|
写入配置内容
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[Unit]
|
||||||
|
# 服务描述
|
||||||
|
Description=FRP Server Daemon
|
||||||
|
# 在网络服务启动后才启动
|
||||||
|
After=network.target syslog.target
|
||||||
|
Wants=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
# 启动命令:请修改为你的 frps 和配置文件实际路径
|
||||||
|
ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.toml
|
||||||
|
# 退出后自动重启
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5s
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
```
|
||||||
|
|
||||||
|
启动并设置开机自启
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 重载 systemd 配置
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
|
||||||
|
# 启动 frps 服务
|
||||||
|
sudo systemctl start frps
|
||||||
|
|
||||||
|
# 设置开机自启
|
||||||
|
sudo systemctl enable frps
|
||||||
|
|
||||||
|
# 查看运行状态
|
||||||
|
sudo systemctl status frps
|
||||||
|
```
|
||||||
|
|
||||||
|
### 配置客户端 (frpc) 为服务
|
||||||
|
|
||||||
|
在内网机器上部署客户端
|
||||||
|
|
||||||
|
创建 Systemd 服务文件
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo vim /etc/systemd/system/frpc.service
|
||||||
|
```
|
||||||
|
|
||||||
|
写入配置内容
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[Unit]
|
||||||
|
Description=FRP Client Daemon
|
||||||
|
After=network.target syslog.target
|
||||||
|
Wants=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
# 启动命令:请修改为你的 frpc 和配置文件实际路径
|
||||||
|
ExecStart=/usr/local/frp/frpc -c /usr/local/frp/frpc.toml
|
||||||
|
# 这里的 restart 非常重要,防止因为断网导致客户端停止运行
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5s
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
```
|
||||||
|
|
||||||
|
启动并设置开机自启
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 重载 systemd 配置
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
|
||||||
|
# 启动 frpc 服务
|
||||||
|
sudo systemctl start frpc
|
||||||
|
|
||||||
|
# 设置开机自启
|
||||||
|
sudo systemctl enable frpc
|
||||||
|
|
||||||
|
# 查看运行状态
|
||||||
|
sudo systemctl status frpc
|
||||||
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,269 @@
|
|||||||
|
---
|
||||||
|
title: Podman
|
||||||
|
date: 2025-11-26 13:38:42
|
||||||
|
tags:
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Podman命令
|
||||||
|
|
||||||
|
Podman 是一个无守护进程(Daemonless)的容器引擎,它在大致功能上与 Docker 兼容。这意味着**大多数 Docker 命令你可以直接把 `docker` 换成 `podman` 来使用**。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 基础与别名 (Tips)
|
||||||
|
|
||||||
|
如果你习惯了 Docker,可以直接在 Shell 中设置别名,这样你就不用改变肌肉记忆了:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
alias docker=podman
|
||||||
|
```
|
||||||
|
|
||||||
|
## 容器生命周期管理 (Container Lifecycle)
|
||||||
|
|
||||||
|
这些命令用于创建、启动、停止和删除容器。
|
||||||
|
|
||||||
|
- 运行容器 (最常用)
|
||||||
|
```bash
|
||||||
|
# -d: 后台运行, -p: 端口映射, --name: 指定名称
|
||||||
|
podman run -d --name my-nginx -p 8080:80 nginx:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
- 查看容器列表
|
||||||
|
```bash
|
||||||
|
podman ps # 仅查看正在运行的容器
|
||||||
|
podman ps -a # 查看所有容器(包括已停止的)
|
||||||
|
```
|
||||||
|
|
||||||
|
- 启动/停止/重启
|
||||||
|
```bash
|
||||||
|
podman start <容器ID或名称>
|
||||||
|
podman stop <容器ID或名称>
|
||||||
|
podman restart <容器ID或名称>
|
||||||
|
```
|
||||||
|
|
||||||
|
- 进入容器内部
|
||||||
|
```bash
|
||||||
|
#以交互模式进入容器的 bash/sh
|
||||||
|
podman exec -it <容器ID或名称> /bin/bash
|
||||||
|
```
|
||||||
|
|
||||||
|
- 删除容器
|
||||||
|
```bash
|
||||||
|
podman rm <容器ID或名称>
|
||||||
|
podman rm -f <容器ID或名称> # 强制删除正在运行的容器
|
||||||
|
```
|
||||||
|
|
||||||
|
- 查看日志
|
||||||
|
```bash
|
||||||
|
podman logs -f <容器ID或名称> # -f 实时跟踪日志输出
|
||||||
|
```
|
||||||
|
|
||||||
|
## 镜像管理 (Image Management)
|
||||||
|
|
||||||
|
- 拉取镜像
|
||||||
|
```bash
|
||||||
|
podman pull <镜像名>
|
||||||
|
# 例如: podman pull docker.io/library/alpine:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
- 查看本地镜像
|
||||||
|
```bash
|
||||||
|
podman images
|
||||||
|
```
|
||||||
|
|
||||||
|
- 删除镜像
|
||||||
|
```bash
|
||||||
|
podman rmi <镜像ID或名称>
|
||||||
|
```
|
||||||
|
|
||||||
|
- 构建镜像
|
||||||
|
```bash
|
||||||
|
# 在当前目录根据 Dockerfile 构建
|
||||||
|
podman build -t my-app:v1 .
|
||||||
|
```
|
||||||
|
|
||||||
|
- 给镜像打标签 (Tag)
|
||||||
|
```bash
|
||||||
|
podman tag <源镜像ID> <新名称>:<标签>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Pod 管理 (Podman 特色)
|
||||||
|
|
||||||
|
Podman 的一大特色是支持 **Pod**(类似于 Kubernetes 的 Pod 概念),即一个 Pod 里可以包含多个共享网络和存储的容器。
|
||||||
|
|
||||||
|
- 创建一个空 Pod
|
||||||
|
```bash
|
||||||
|
# 创建一个带有端口映射的 Pod
|
||||||
|
podman pod create --name my-pod -p 8080:80
|
||||||
|
```
|
||||||
|
|
||||||
|
- 在 Pod 中运行容器
|
||||||
|
```bash
|
||||||
|
# 将容器加入到上面创建的 pod 中
|
||||||
|
podman run -d --pod my-pod --name container-in-pod nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
- 查看 Pod 列表
|
||||||
|
```bash
|
||||||
|
podman pod ps
|
||||||
|
```
|
||||||
|
|
||||||
|
- 停止/删除 Pod
|
||||||
|
```bash
|
||||||
|
podman pod stop <Pod名称>
|
||||||
|
podman pod rm <Pod名称>
|
||||||
|
```
|
||||||
|
|
||||||
|
## 高级功能与系统集成 (Advanced)
|
||||||
|
|
||||||
|
这是 Podman 最强大的地方,特别适合运维管理。
|
||||||
|
|
||||||
|
- **生成 Systemd 配置文件** (非常实用) Podman 可以直接生成 systemd unit 文件,让普通用户也能通过 `systemctl` 管理容器自启。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 为正在运行的容器生成 service 文件
|
||||||
|
podman generate systemd --name <容器名称> --files --new
|
||||||
|
```
|
||||||
|
|
||||||
|
- **Kubernetes 互操作性**
|
||||||
|
|
||||||
|
- **导出 YAML:** 将现有容器导出为 K8s 的 YAML 定义。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
podman generate kube <容器或Pod名称> > my-pod.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
- **运行 YAML:** 直接在 Podman 中运行 K8s 的 YAML 文件。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
podman play kube my-pod.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
- 清理系统
|
||||||
|
```bash
|
||||||
|
# 删除所有停止的容器、未使用的网络和悬空的镜像
|
||||||
|
podman system prune
|
||||||
|
```
|
||||||
|
|
||||||
|
- 查看系统信息
|
||||||
|
```bash
|
||||||
|
podman info # 查看详细的存储、运行环境信息
|
||||||
|
podman version # 查看版本
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
# Podman换源
|
||||||
|
|
||||||
|
> Podman 是一个无守护进程的容器引擎,用于在 Linux 系统上开发、管理和运行 OCI 容器。与 Docker 类似,Podman 也支持配置镜像源来加速容器镜像的拉取。
|
||||||
|
|
||||||
|
## Linux 系统配置
|
||||||
|
|
||||||
|
### 方法一:全局配置(推荐)
|
||||||
|
|
||||||
|
创建或编辑 Podman 的全局配置文件:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sudo mkdir -p /etc/containers
|
||||||
|
sudo tee /etc/containers/registries.conf <<-'EOF'
|
||||||
|
unqualified-search-registries = ["docker.io"]
|
||||||
|
[[registry]]
|
||||||
|
prefix = "docker.io"
|
||||||
|
location = "docker.io"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "docker.1ms.run"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "docker.1panel.live"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "docker.m.ixdev.cn"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "hub.rat.dev"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "docker.xuanyuan.me"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "dockerproxy.net"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "docker-registry.nmqu.com"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "hub.amingg.com"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "docker.amingg.com"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "docker.hlmirror.com"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "hub1.nat.tf"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "hub2.nat.tf"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "hub3.nat.tf"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "hub4.nat.tf"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "docker.m.daocloud.io"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "docker.kejilion.pro"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "hub.1panel.dev"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "docker.apiba.cn"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "proxy.vvvv.ee"
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
### 方法二:用户级配置
|
||||||
|
|
||||||
|
为当前用户创建配置文件:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
mkdir -p ~/.config/containers
|
||||||
|
tee ~/.config/containers/registries.conf <<-'EOF'
|
||||||
|
unqualified-search-registries = ["docker.io"]
|
||||||
|
[[registry]]
|
||||||
|
prefix = "docker.io"
|
||||||
|
location = "docker.io"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "docker.1ms.run"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "docker.1panel.live"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "docker.m.ixdev.cn"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "hub.rat.dev"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "docker.xuanyuan.me"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "dockerproxy.net"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "docker-registry.nmqu.com"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "hub.amingg.com"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "docker.amingg.com"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "docker.hlmirror.com"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "hub1.nat.tf"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "hub2.nat.tf"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "hub3.nat.tf"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "hub4.nat.tf"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "docker.m.daocloud.io"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "docker.kejilion.pro"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "hub.1panel.dev"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "docker.apiba.cn"
|
||||||
|
[[registry.mirror]]
|
||||||
|
location = "proxy.vvvv.ee"
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
# Docker 迁移
|
||||||
|
|
||||||
|
## Docker Desktop
|
||||||
|
|
||||||
@@ -4,6 +4,135 @@ date: 2023-10-07 11:25:08
|
|||||||
tags:
|
tags:
|
||||||
---
|
---
|
||||||
|
|
||||||
|
# PowerShell 7 使用 Oh My Posh 来美化命令行
|
||||||
|
|
||||||
|
## 安装 PowerShell 7
|
||||||
|
|
||||||
|
`PowerShell 7` 指的不是系统自带的 `powershell` ,而是新下载的(微软官方出品),当然这个教程也适用于系统自带的 `powershell`
|
||||||
|
|
||||||
|
微软官方文档地址:https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.2
|
||||||
|
下载地址:https://github.com/PowerShell/PowerShell/releases
|
||||||
|
或者可通过 Winget 方式下载安装
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
winget search --id Microsoft.PowerShell
|
||||||
|
```
|
||||||
|
|
||||||
|
Output
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
Name Id Version Source
|
||||||
|
---------------------------------------------------------------
|
||||||
|
PowerShell Microsoft.PowerShell 7.5.4.0 winget
|
||||||
|
PowerShell Preview Microsoft.PowerShell.Preview 7.6.0.5 winget
|
||||||
|
```
|
||||||
|
|
||||||
|
使用 `--id` 参数安装 PowerShell 或 PowerShell 预览版
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
winget install --id Microsoft.PowerShell --source winget
|
||||||
|
```
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
winget install --id Microsoft.PowerShell.Preview --source winget
|
||||||
|
```
|
||||||
|
|
||||||
|
## 安装 Oh My Posh
|
||||||
|
|
||||||
|
官方文档地址:https://ohmyposh.dev/
|
||||||
|
|
||||||
|
最好在管理员模式下运行 `powershell`
|
||||||
|
|
||||||
|
下载安装,在 `powershell` 命令行中输入
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
winget install oh-my-posh
|
||||||
|
```
|
||||||
|
|
||||||
|
在 `powershell` 命令行中输入下面命令,打开 `$Profile` 进行设置,如果系统提示不存文件,是否创建,请点击创建
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
notepad $Profile
|
||||||
|
```
|
||||||
|
|
||||||
|
将以下命令添加到 `$Profile` 文件中
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
oh-my-posh init pwsh | Invoke-Expression
|
||||||
|
```
|
||||||
|
|
||||||
|
应用修改,则直接在命令行中执行 `. $Profile` ,如果出现错误等问题,请尝试关闭所有 `powershell` 命令窗口,重新打开,一般都会正常显示
|
||||||
|
|
||||||
|
### 配置环境变量
|
||||||
|
|
||||||
|
配置 `POSH_THEMES_PATH` 环境变量,最好配置成系统级别的,路径在 `C:\Users\<当前登录用户>\AppData\Local\Programs\oh-my-posh\themes` 下面。
|
||||||
|
|
||||||
|
### 更改主题
|
||||||
|
|
||||||
|
在 `powerShell` 命令行中输入 `Get-ChildItem $env:POSH_THEMES_PATH` 来获取所有的已安装主题
|
||||||
|
|
||||||
|
**预览主题(官方推荐方式):** 由于在终端里一次性渲染所有主题会很卡,官方建议直接去网页上看截图,然后记住名字即可。
|
||||||
|
|
||||||
|
- **[Oh My Posh 官方主题预览页 (Themes)](https://ohmyposh.dev/docs/themes)**
|
||||||
|
|
||||||
|
编辑 `$Profile` 文件
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
notepad $Profile
|
||||||
|
```
|
||||||
|
|
||||||
|
把 `oh-my-posh init pwsh ...` 的部分後面加上 `--config "$env:POSH_THEMES_PATH/{主題名稱}.omp.json"`。
|
||||||
|
将其内部文字改为:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH/montys.omp.json" | Invoke-Expression
|
||||||
|
```
|
||||||
|
|
||||||
|
## 扩展模块
|
||||||
|
|
||||||
|
### PowerShellGet
|
||||||
|
|
||||||
|
> [PowerShellGet](https://github.com/PowerShell/PowerShellGet) 是 Windows 平台上的包管理器,主要用于管理 PowerShell 模块,但也支持其他类型的包。
|
||||||
|
|
||||||
|
以系统管理员权限打开**PowerShell**终端,执行以下命令:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
Install-Module -Name PowerShellGet -Force
|
||||||
|
```
|
||||||
|
|
||||||
|
### [posh-git](https://github.com/dahlbyk/posh-git)
|
||||||
|
|
||||||
|
> [posh-git](https://github.com/dahlbyk/posh-git)是一款用于 Windows 系统的 PowerShell 扩展模块,它主要为 Git 提供了更加丰富且人性化的命令行界面体验。
|
||||||
|
|
||||||
|
以系统管理员权限打开**PowerShell**终端,执行以下命令:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
PowerShellGet\Install-Module posh-git -Scope CurrentUser -Force
|
||||||
|
```
|
||||||
|
|
||||||
|
### [PSReadLine](https://github.com/PowerShell/PSReadLine)
|
||||||
|
|
||||||
|
> [PSReadLine](https://github.com/PowerShell/PSReadLine)用于增强命令行编辑体验的模块,提供语法高亮/命令预测/历史记录管理以及提供了丰富的快捷键和编辑命令。
|
||||||
|
|
||||||
|
以系统管理员权限打开**PowerShell**终端,执行以下命令:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
Install-Module PSReadLine -Force
|
||||||
|
```
|
||||||
|
|
||||||
|
## 编辑oh-my-posh配置文件
|
||||||
|
|
||||||
|
打开**PowerShell**终端,执行以下命令编辑配置文件 `code $PROFILE`:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
Set-PSReadLineKeyHandler -Key Tab -Function MenuComplete #Tab键会出现自动补全菜单
|
||||||
|
Set-PSReadlineKeyHandler -Key UpArrow -Function HistorySearchBackward
|
||||||
|
Set-PSReadlineKeyHandler -Key DownArrow -Function HistorySearchForward #上下方向键箭头,搜索历史中进行自动补全
|
||||||
|
|
||||||
|
oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH/jandedobbeleer.omp.json" | Invoke-Expression
|
||||||
|
Import-Module posh-git # git的自动补全
|
||||||
|
```
|
||||||
|
|
||||||
# 文件
|
# 文件
|
||||||
|
|
||||||
## 新建文件
|
## 新建文件
|
||||||
@@ -33,6 +162,52 @@ Set-Content my.ini -value ""
|
|||||||
New-Item data -ItemType Directory
|
New-Item data -ItemType Directory
|
||||||
```
|
```
|
||||||
|
|
||||||
|
# 目录
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# 查询版本
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$PSVersionTable
|
||||||
|
```
|
||||||
|
|
||||||
|
在输出的信息中,查看 **`PSVersion`** 这一行。
|
||||||
|
|
||||||
|
**示例输出解读:**
|
||||||
|
|
||||||
|
- **Major**: 主版本号(如 5 或 7)。
|
||||||
|
- **Minor**: 次版本号。
|
||||||
|
- 如果显示 `5.1.xxxxx`,这是 Windows 自带的 **Windows PowerShell**。
|
||||||
|
- 如果显示 `7.x.x`,这是跨平台的 **PowerShell (Core)**。
|
||||||
|
|
||||||
|
仅查看版本号(简洁)
|
||||||
|
|
||||||
|
如果你不需要其他详细信息,只想看版本号,可以使用这个命令:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$PSVersionTable.PSVersion
|
||||||
|
```
|
||||||
|
|
||||||
|
或者使用宿主查询命令(虽然通常一致,但在某些特殊宿主环境下可能不同):
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
(Get-Host).Version
|
||||||
|
```
|
||||||
|
|
||||||
|
从 CMD (命令提示符) 查看
|
||||||
|
|
||||||
|
如果你当前在 CMD 窗口,不想进入 PowerShell 也能查看:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
powershell -command "$PSVersionTable.PSVersion"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 补充说明:常见的两个主要版本
|
||||||
|
|
||||||
|
- **Windows PowerShell 5.1**:这是 Windows 10 和 Windows 11 默认自带的版本(蓝色背景图标)。微软已不再为其开发新功能,仅进行维护。
|
||||||
|
- **PowerShell 7.x**:这是微软目前主推的跨平台版本(黑色背景图标),性能更强,功能更多。
|
||||||
|
|
||||||
# 做 sudo 命令
|
# 做 sudo 命令
|
||||||
|
|
||||||
在Windows系统上sudo对应的就是管理员权限了。
|
在Windows系统上sudo对应的就是管理员权限了。
|
||||||
|
|||||||
@@ -77,3 +77,32 @@ import pcRequestspcRequestsc=pcRequestsc.__name__
|
|||||||
```shell
|
```shell
|
||||||
'pcRequests'
|
'pcRequests'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
# UV
|
||||||
|
|
||||||
|
## Python版本管理(安装和管理Python解释器)
|
||||||
|
|
||||||
|
| 命令 | 说明 |
|
||||||
|
| ----------------------------- | -------------------------------------- |
|
||||||
|
| uv python list | 查看可用和已安装的Python 版本 |
|
||||||
|
| uv python install | 安装 Python 版本 |
|
||||||
|
| uv python find | 查找已安装的 Python信息 |
|
||||||
|
| uv python pin | 将当前项目固定使用特定 Python 版本 |
|
||||||
|
| uv python uninstall | 卸载 Python 版本 |
|
||||||
|
| uv python install --reinstall | 重新安装Python,适用于Python版本的更新 |
|
||||||
|
|
||||||
|
## 项目管理(创建和开发带有 `pyproject.toml`的Python 项目)
|
||||||
|
|
||||||
|
| **命令** | **说明** |
|
||||||
|
| ---------- | ------------------------------------------------------------ |
|
||||||
|
| uv init | 创建新 Python 项目并初始化该项目 |
|
||||||
|
| uv add | 为项目添加依赖,安装软件包并将依赖声明写入`pyproject.toml`文件 |
|
||||||
|
| uv remove | 从项目移除依赖,移除软件包并将依赖从文件`pyproject.toml`中移除 |
|
||||||
|
| uv sync | 同步项目依赖到环境 |
|
||||||
|
| uv lock | 为项目依赖创建锁文件 |
|
||||||
|
| uv run | 在项目环境中运行命令 |
|
||||||
|
| uv export | 将项目的锁文件导出为其他格式 |
|
||||||
|
| uv tree | 查看项目依赖树 |
|
||||||
|
| uv build | 构建项目为分发包 |
|
||||||
|
| uv publish | 发布项目到包索引 |
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,41 @@
|
|||||||
|
---
|
||||||
|
title: Subversion
|
||||||
|
date: 2025-11-27 09:46:04
|
||||||
|
tags:
|
||||||
|
---
|
||||||
|
|
||||||
|
# TortoiseSVN
|
||||||
|
|
||||||
|
## 日志缓存问题
|
||||||
|
|
||||||
|
> 修改日志后,在日志信息里还是显示原来的日志,但是点击编辑日志弹窗内显示的就是修改后的日志。
|
||||||
|
|
||||||
|
修改已经成功提交到了服务器(这就是为什么点“编辑”能看到新内容),但 TortoiseSVN 的“显示日志”列表为了提高速度,读取的是本地电脑上的**旧缓存数据**,没有去服务器重新拉取。
|
||||||
|
|
||||||
|
可以按照以下步骤解决这个问题:
|
||||||
|
|
||||||
|
这是一个非常典型的 **TortoiseSVN 日志缓存(Log Cache)** 问题。
|
||||||
|
|
||||||
|
简单来说,您的修改已经成功提交到了服务器(这就是为什么点“编辑”能看到新内容),但 TortoiseSVN 的“显示日志”列表为了提高速度,读取的是本地电脑上的**旧缓存数据**,没有去服务器重新拉取。
|
||||||
|
|
||||||
|
您可以按照以下步骤解决这个问题:
|
||||||
|
|
||||||
|
### 方法一:强制刷新(最快解决)
|
||||||
|
|
||||||
|
在“显示日志(Show Log)”的窗口界面中:
|
||||||
|
|
||||||
|
1. 直接按下键盘上的 **`F5`** 键。
|
||||||
|
2. 或者点击窗口底部的 **“刷新(Refresh)”** 按钮。
|
||||||
|
3. 如果还是不行,尝试按 **`Shift + F5`** 或 **`Ctrl + F5`**(强制从服务器重新拉取所有日志)。
|
||||||
|
|
||||||
|
通常这样操作后,列表中的文字就会更新为修改后的内容。
|
||||||
|
|
||||||
|
### 方法二:清除日志缓存(如果方法一无效)
|
||||||
|
|
||||||
|
如果刷新后依然显示旧日志,说明本地缓存文件可能卡住了,需要手动清理:
|
||||||
|
|
||||||
|
1. 在任意文件夹右键,选择 **TortoiseSVN** -> **设置 (Settings)**。
|
||||||
|
2. 在左侧菜单中找到 **已保存数据 (Saved Data)**。
|
||||||
|
3. 在右侧面板中找到 **日志信息(显示日志对话框) (Log messages)** 这一栏。
|
||||||
|
4. 点击旁边的 **“清除 (Clear)”** 按钮。
|
||||||
|
5. 点击确定,然后重新打开“显示日志”窗口,TortoiseSVN 会被迫从服务器重新下载最新的日志数据。
|
||||||
@@ -133,3 +133,5 @@ irm https://massgrave.dev/get | iex
|
|||||||
- `-o"D:"`: 这是指定**目标解压目录**。所有从压缩包中解压出来的内容都会放到这个目录下。
|
- `-o"D:"`: 这是指定**目标解压目录**。所有从压缩包中解压出来的内容都会放到这个目录下。
|
||||||
- **注意:** `-o` 后面直接跟目标文件夹的完整路径,不带 `*`。
|
- **注意:** `-o` 后面直接跟目标文件夹的完整路径,不带 `*`。
|
||||||
- `"source\repos\ruoyi-ai\*"`: 这是**压缩包内部想要解压的目录名称**。请确保这个名称与压缩包内的实际目录名完全一致(大小写敏感)。
|
- `"source\repos\ruoyi-ai\*"`: 这是**压缩包内部想要解压的目录名称**。请确保这个名称与压缩包内的实际目录名完全一致(大小写敏感)。
|
||||||
|
|
||||||
|
# Windows Server 2019
|
||||||
|
|||||||
@@ -0,0 +1,123 @@
|
|||||||
|
---
|
||||||
|
title: Windows Terminal
|
||||||
|
date: 2025-12-12 09:31:56
|
||||||
|
tags:
|
||||||
|
---
|
||||||
|
|
||||||
|
# SSH
|
||||||
|
|
||||||
|
## 生成 SSH 密钥
|
||||||
|
|
||||||
|
1. SSH 秘钥默认储存在账户的主目录下的 ~/.ssh 目录
|
||||||
|
如:`C:\Users\用户\.ssh\`
|
||||||
|
|
||||||
|
查看是否包含id_rsa和id_rsa.pub(或者是id_dsa和id_dsa.pub之类成对的文件),有`.pub 后缀的文件`就是**公钥**,另一个文件则是密钥。
|
||||||
|
|
||||||
|
如果有这两个文件,则跳过1.2;如果没有这两个文件,甚至.ssh目录也没有,则需要用ssh-keygen 来创建
|
||||||
|
|
||||||
|
2. ###### 生成密钥信息
|
||||||
|
|
||||||
|
在`.ssh 目录`下右键打开[Git Bash](https://so.csdn.net/so/search?q=Git Bash&spm=1001.2101.3001.7020)(.ssh目录不存在,则在任一目录下操作,或者手动创建该目录)
|
||||||
|
|
||||||
|
3. ###### 生成密钥
|
||||||
|
|
||||||
|
> ssh-keygen -t rsa -C "注释信息(一般为邮箱your_email@youremail.com)"
|
||||||
|
|
||||||
|
4. 在~/.ssh/下会生成两个文件,id_rsa和id_rsa.pub
|
||||||
|
|
||||||
|
> id_rsa是私钥
|
||||||
|
>
|
||||||
|
> id_rsa.pub是公钥
|
||||||
|
|
||||||
|
5. 启动 **PuTTY Key Generator**
|
||||||
|

|
||||||
|
|
||||||
|
6. 选择之前生成的id_rsa
|
||||||
|

|
||||||
|
|
||||||
|
7. 出现如下,选择 **Save private key** 保存秘钥
|
||||||
|

|
||||||
|
|
||||||
|
8. 保存到 ~/.ssh 目录即可
|
||||||
|

|
||||||
|
|
||||||
|
## 配置 SSH
|
||||||
|
|
||||||
|
1. 确认 .ssh 目录位置
|
||||||
|
|
||||||
|
SSH 的配置文件通常位于当前用户目录下的 `.ssh` 文件夹中。
|
||||||
|
|
||||||
|
- **路径通常是:** `C:\Users\你的用户名\.ssh\`
|
||||||
|
|
||||||
|
你可以按 `Win + R`,输入 `%USERPROFILE%\.ssh` 并回车。
|
||||||
|
|
||||||
|
- **如果文件夹存在:** 直接进入。
|
||||||
|
- **如果文件夹不存在:** 打开命令提示符(CMD)或 PowerShell,输入 `mkdir .ssh` 创建它。
|
||||||
|
|
||||||
|
2. 创建 config 文件
|
||||||
|
|
||||||
|
在 `.ssh` 文件夹内,创建一个名为 `config` 的文件。
|
||||||
|
|
||||||
|
- **注意:** 文件名必须是 `config`,**没有任何后缀名**(不要叫 `config.txt`)。
|
||||||
|
- **创建方法:** 在文件夹内右键 -> 新建文本文档 -> 命名为 `config` -> 删除 `.txt` 后缀 -> 确认修改。
|
||||||
|
|
||||||
|
3. 编辑 config 文件
|
||||||
|
使用任意文本编辑器(如记事本、VS Code、Notepad++)打开该文件,按照以下格式添加内容。
|
||||||
|
基础语法结构
|
||||||
|
|
||||||
|
```
|
||||||
|
Host 别名
|
||||||
|
HostName 主机IP或域名
|
||||||
|
Port 端口号 (如果是默认22端口可省略)
|
||||||
|
User 用户名
|
||||||
|
IdentityFile 私钥路径 (如果是密码登录可省略)
|
||||||
|
PreferredAuthentications publickey
|
||||||
|
```
|
||||||
|
|
||||||
|
4. 远程 Linux 服务器配置 ssh 公钥
|
||||||
|
```bash
|
||||||
|
vim ~/.ssh/authorized_keys
|
||||||
|
```
|
||||||
|
|
||||||
|
内容使用**PuTTY Key Generator**,**Load Private Key** 后显示的 **Public key**,内容换行追加即可
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
5. 测试连接
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
ssh <你的Host别名>
|
||||||
|
# 例如: ssh myserver
|
||||||
|
```
|
||||||
|
|
||||||
|
## 访问 Windows SSH 客户端和 SSH 服务器
|
||||||
|
|
||||||
|
最新版本的 Windows 10 和 Windows 11 包含基于 OpenSSH(一个使用 SSH 协议进行远程登录的连接工具)的内置 SSH 服务器和客户端。 OpenSSH 加密客户端与服务器之间的所有流量,从而遏止窃听、连接劫持和其他攻击。
|
||||||
|
|
||||||
|
默认情况下,OpenSSH 客户端和 OpenSSH 服务器位于以下目录:`C:\Windows\System32\OpenSSH`。 你还可以检查它是否存在于“Windows 设置”>“系统”>“可选功能”中,然后在添加的功能中搜索“OpenSSH”。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## 创建档案
|
||||||
|
|
||||||
|
你可以通过执行 `ssh user@machine` 在命令提示符下启动 SSH 会话,系统将提示你输入密码。 可以将 `commandline` 设置添加到配置文件对象的 `list` 内的 [settings.json 文件](https://learn.microsoft.com/zh-cn/windows/terminal/install#settings-json-file) 中的配置文件,以创建在启动时执行此项的 Windows 终端配置文件。
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"icon": "C:\\Windows\\System32\\wsl.exe",
|
||||||
|
"name": "user@machine ssh profile",
|
||||||
|
"commandline": "ssh user@machine"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 指定起始目录
|
||||||
|
|
||||||
|
若要指定 Windows 终端调用的 ssh 会话的起始目录,可以使用以下命令:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"commandline": "ssh -t bob@foo \"cd /data/bob && exec bash -l\""
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
`-t` 标志强制执行伪终端分配。 这可用于在远程计算机上执行任意基于屏幕的程序,例如实现菜单服务。 将需要使用转义双引号,因为 bourne 外壳派生物不会为单引号中的字符串执行任何额外分析。
|
||||||
@@ -0,0 +1,476 @@
|
|||||||
|
---
|
||||||
|
title: curl 命令完全指南
|
||||||
|
date: 2026-03-27 10:10:35
|
||||||
|
tags:
|
||||||
|
- curl
|
||||||
|
- Linux
|
||||||
|
- Windows
|
||||||
|
- API测试
|
||||||
|
---
|
||||||
|
|
||||||
|
## 简介
|
||||||
|
|
||||||
|
curl (Client for URLs) 是一个强大的命令行工具,用于传输数据。它支持多种协议(HTTP、HTTPS、FTP等),是开发者和运维人员必备的工具之一。
|
||||||
|
|
||||||
|
## 安装
|
||||||
|
|
||||||
|
### Linux
|
||||||
|
|
||||||
|
大多数 Linux 发行版已预装 curl:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Debian/Ubuntu
|
||||||
|
sudo apt install curl
|
||||||
|
|
||||||
|
# CentOS/RHEL
|
||||||
|
sudo yum install curl
|
||||||
|
|
||||||
|
# Arch Linux
|
||||||
|
sudo pacman -S curl
|
||||||
|
|
||||||
|
# 验证安装
|
||||||
|
curl --version
|
||||||
|
```
|
||||||
|
|
||||||
|
### Windows
|
||||||
|
|
||||||
|
**方式一:Windows 10/11 自带**
|
||||||
|
Windows 10 1803+ 和 Windows 11 已内置 curl。
|
||||||
|
|
||||||
|
**方式二:手动安装**
|
||||||
|
1. 访问 https://curl.se/windows/ 下载
|
||||||
|
2. 解压到 `C:\tools\curl`
|
||||||
|
3. 添加到系统 PATH 环境变量
|
||||||
|
|
||||||
|
**方式三:使用包管理器**
|
||||||
|
```powershell
|
||||||
|
# winget
|
||||||
|
winget install curl
|
||||||
|
|
||||||
|
# Chocolatey
|
||||||
|
choco install curl
|
||||||
|
|
||||||
|
# Scoop
|
||||||
|
scoop install curl
|
||||||
|
```
|
||||||
|
|
||||||
|
## 基础用法
|
||||||
|
|
||||||
|
### GET 请求
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 基本 GET 请求
|
||||||
|
curl https://api.example.com/users
|
||||||
|
|
||||||
|
# 带查询参数
|
||||||
|
curl "https://api.example.com/users?page=1&limit=10"
|
||||||
|
|
||||||
|
# 只显示响应头
|
||||||
|
curl -I https://api.example.com
|
||||||
|
|
||||||
|
# 显示响应头和响应体
|
||||||
|
curl -i https://api.example.com
|
||||||
|
|
||||||
|
# 跟随重定向
|
||||||
|
curl -L https://example.com/redirect
|
||||||
|
```
|
||||||
|
|
||||||
|
### POST 请求
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 发送 JSON 数据(请求体)
|
||||||
|
curl -X POST https://api.example.com/users \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"name": "张三", "email": "zhangsan@example.com"}'
|
||||||
|
|
||||||
|
# 发送表单数据
|
||||||
|
curl -X POST https://api.example.com/login \
|
||||||
|
-d "username=admin&password=123456"
|
||||||
|
|
||||||
|
# 发送文件
|
||||||
|
curl -X POST https://api.example.com/upload \
|
||||||
|
-F "file=@/path/to/file.jpg"
|
||||||
|
|
||||||
|
# 发送多部分表单(文件+字段)
|
||||||
|
curl -X POST https://api.example.com/upload \
|
||||||
|
-F "file=@/path/to/file.jpg" \
|
||||||
|
-F "name=张三" \
|
||||||
|
-F "description=用户头像"
|
||||||
|
```
|
||||||
|
|
||||||
|
### PUT / PATCH / DELETE 请求
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# PUT 请求(完整更新)
|
||||||
|
curl -X PUT https://api.example.com/users/1 \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"name": "李四", "email": "lisi@example.com"}'
|
||||||
|
|
||||||
|
# PATCH 请求(部分更新)
|
||||||
|
curl -X PATCH https://api.example.com/users/1 \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"name": "李四"}'
|
||||||
|
|
||||||
|
# DELETE 请求
|
||||||
|
curl -X DELETE https://api.example.com/users/1
|
||||||
|
```
|
||||||
|
|
||||||
|
## 常用选项详解
|
||||||
|
|
||||||
|
| 选项 | 说明 | 示例 |
|
||||||
|
|------|------|------|
|
||||||
|
| `-X` | 指定请求方法 | `-X POST` |
|
||||||
|
| `-H` | 添加请求头 | `-H "Authorization: Bearer token"` |
|
||||||
|
| `-d` | 发送数据 | `-d '{"key":"value"}'` |
|
||||||
|
| `-F` | 上传文件/表单 | `-F "file=@photo.jpg"` |
|
||||||
|
| `-u` | 基础认证 | `-u user:pass` |
|
||||||
|
| `-I` | 只获取响应头 | `curl -I url` |
|
||||||
|
| `-i` | 显示响应头和内容 | `curl -i url` |
|
||||||
|
| `-L` | 跟随重定向 | `curl -L url` |
|
||||||
|
| `-o` | 保存到文件 | `-o output.json` |
|
||||||
|
| `-O` | 使用远程文件名保存 | `-O` |
|
||||||
|
| `-s` | 静默模式 | `-s` |
|
||||||
|
| `-v` | 显示详细信息 | `-v` |
|
||||||
|
| `-k` | 忽略 SSL 证书验证 | `-k` |
|
||||||
|
| `-x` | 使用代理 | `-x http://proxy:8080` |
|
||||||
|
| `--connect-timeout` | 连接超时(秒) | `--connect-timeout 10` |
|
||||||
|
| `-m` | 最大请求时间(秒) | `-m 30` |
|
||||||
|
|
||||||
|
## 替代 Postman 的完整方案
|
||||||
|
|
||||||
|
### 1. 认证请求
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Bearer Token 认证
|
||||||
|
curl -H "Authorization: Bearer your_token_here" \
|
||||||
|
https://api.example.com/data
|
||||||
|
|
||||||
|
# Basic Auth 认证
|
||||||
|
curl -u "username:password" \
|
||||||
|
https://api.example.com/data
|
||||||
|
|
||||||
|
# API Key 认证(Header 方式)
|
||||||
|
curl -H "X-API-Key: your_api_key" \
|
||||||
|
https://api.example.com/data
|
||||||
|
|
||||||
|
# API Key 认证(Query 参数方式)
|
||||||
|
curl "https://api.example.com/data?api_key=your_api_key"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 处理 Cookie
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 保存 Cookie 到文件
|
||||||
|
curl -c cookies.txt https://api.example.com/login \
|
||||||
|
-d "username=admin&password=123456"
|
||||||
|
|
||||||
|
# 使用已保存的 Cookie
|
||||||
|
curl -b cookies.txt https://api.example.com/profile
|
||||||
|
|
||||||
|
# 同时读写 Cookie
|
||||||
|
curl -b cookies.txt -c cookies.txt https://api.example.com/action
|
||||||
|
|
||||||
|
# 直接设置 Cookie
|
||||||
|
curl -H "Cookie: session=abc123; token=xyz789" \
|
||||||
|
https://api.example.com/data
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 美化 JSON 输出
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 使用 jq 美化(Linux/macOS)
|
||||||
|
curl -s https://api.example.com/users | jq
|
||||||
|
|
||||||
|
# 使用 Python 美化(跨平台)
|
||||||
|
curl -s https://api.example.com/users | python -m json.tool
|
||||||
|
|
||||||
|
# Windows PowerShell 方式
|
||||||
|
curl -s https://api.example.com/users | ConvertFrom-Json | ConvertTo-Json -Depth 10
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. 保存请求集合
|
||||||
|
|
||||||
|
创建一个 `api-requests.sh` 文件:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# API 请求集合 - 类似 Postman Collection
|
||||||
|
|
||||||
|
BASE_URL="https://api.example.com"
|
||||||
|
TOKEN="your_token_here"
|
||||||
|
|
||||||
|
# 获取用户列表
|
||||||
|
get_users() {
|
||||||
|
curl -s "$BASE_URL/users" \
|
||||||
|
-H "Authorization: Bearer $TOKEN" \
|
||||||
|
-H "Content-Type: application/json"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 创建用户
|
||||||
|
create_user() {
|
||||||
|
curl -s -X POST "$BASE_URL/users" \
|
||||||
|
-H "Authorization: Bearer $TOKEN" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"name": "张三", "email": "zhangsan@example.com"}'
|
||||||
|
}
|
||||||
|
|
||||||
|
# 获取单个用户
|
||||||
|
get_user() {
|
||||||
|
local id=$1
|
||||||
|
curl -s "$BASE_URL/users/$id" \
|
||||||
|
-H "Authorization: Bearer $TOKEN"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 调用示例
|
||||||
|
case "$1" in
|
||||||
|
users) get_users | jq ;;
|
||||||
|
create) create_user | jq ;;
|
||||||
|
user) get_user "$2" | jq ;;
|
||||||
|
*) echo "用法: $0 {users|create|user <id>}" ;;
|
||||||
|
esac
|
||||||
|
```
|
||||||
|
|
||||||
|
使用方式:
|
||||||
|
```bash
|
||||||
|
chmod +x api-requests.sh
|
||||||
|
./api-requests.sh users
|
||||||
|
./api-requests.sh create
|
||||||
|
./api-requests.sh user 1
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. 环境变量配置
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 创建 .env 文件(添加到 .gitignore)
|
||||||
|
# .env
|
||||||
|
API_BASE_URL=https://api.example.com
|
||||||
|
API_TOKEN=your_token_here
|
||||||
|
|
||||||
|
# 在脚本中使用
|
||||||
|
source .env
|
||||||
|
|
||||||
|
curl -H "Authorization: Bearer $API_TOKEN" \
|
||||||
|
"$API_BASE_URL/users"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6. 环境切换
|
||||||
|
|
||||||
|
创建多环境配置:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# environments.sh
|
||||||
|
get_env() {
|
||||||
|
case "$1" in
|
||||||
|
dev)
|
||||||
|
BASE_URL="https://dev-api.example.com"
|
||||||
|
TOKEN="$DEV_TOKEN"
|
||||||
|
;;
|
||||||
|
staging)
|
||||||
|
BASE_URL="https://staging-api.example.com"
|
||||||
|
TOKEN="$STAGING_TOKEN"
|
||||||
|
;;
|
||||||
|
prod)
|
||||||
|
BASE_URL="https://api.example.com"
|
||||||
|
TOKEN="$PROD_TOKEN"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "未知环境: $1"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# 使用
|
||||||
|
source environments.sh
|
||||||
|
get_env dev
|
||||||
|
curl -H "Authorization: Bearer $TOKEN" "$BASE_URL/users"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7. 测试脚本示例
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# API 测试脚本
|
||||||
|
|
||||||
|
BASE_URL="https://api.example.com"
|
||||||
|
TOKEN="test_token"
|
||||||
|
|
||||||
|
echo "=== 测试用户 API ==="
|
||||||
|
|
||||||
|
# 测试获取用户
|
||||||
|
echo "1. GET /users"
|
||||||
|
response=$(curl -s -w "\n%{http_code}" "$BASE_URL/users" \
|
||||||
|
-H "Authorization: Bearer $TOKEN")
|
||||||
|
http_code=$(echo "$response" | tail -n1)
|
||||||
|
body=$(echo "$response" | head -n -1)
|
||||||
|
|
||||||
|
if [ "$http_code" -eq 200 ]; then
|
||||||
|
echo "✅ 成功 (HTTP $http_code)"
|
||||||
|
echo "$body" | jq
|
||||||
|
else
|
||||||
|
echo "❌ 失败 (HTTP $http_code)"
|
||||||
|
echo "$body"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 测试创建用户
|
||||||
|
echo -e "\n2. POST /users"
|
||||||
|
response=$(curl -s -w "\n%{http_code}" -X POST "$BASE_URL/users" \
|
||||||
|
-H "Authorization: Bearer $TOKEN" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"name": "测试用户"}')
|
||||||
|
http_code=$(echo "$response" | tail -n1)
|
||||||
|
body=$(echo "$response" | head -n -1)
|
||||||
|
|
||||||
|
if [ "$http_code" -eq 201 ]; then
|
||||||
|
echo "✅ 成功 (HTTP $http_code)"
|
||||||
|
else
|
||||||
|
echo "❌ 失败 (HTTP $http_code)"
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
## Windows 特殊处理
|
||||||
|
|
||||||
|
### PowerShell 中的引号问题
|
||||||
|
|
||||||
|
PowerShell 对单引号和双引号有特殊处理,推荐以下方式:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
# 方式一:使用双引号,内部双引号用反引号转义
|
||||||
|
curl -X POST https://api.example.com/users `
|
||||||
|
-H "Content-Type: application/json" `
|
||||||
|
-d "{`"name`": `"张三`"}"
|
||||||
|
|
||||||
|
# 方式二:使用单引号包裹 JSON(推荐)
|
||||||
|
curl -X POST https://api.example.com/users `
|
||||||
|
-H "Content-Type: application/json" `
|
||||||
|
-d '{"name": "张三"}'
|
||||||
|
|
||||||
|
# 方式三:从文件读取数据
|
||||||
|
curl -X POST https://api.example.com/users `
|
||||||
|
-H "Content-Type: application/json" `
|
||||||
|
-d "@request.json"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Windows CMD 中的处理
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
# 使用双引号,内部双引号用反斜杠转义
|
||||||
|
curl -X POST https://api.example.com/users ^
|
||||||
|
-H "Content-Type: application/json" ^
|
||||||
|
-d "{\"name\": \"张三\"}"
|
||||||
|
|
||||||
|
# 或使用文件
|
||||||
|
curl -X POST https://api.example.com/users ^
|
||||||
|
-H "Content-Type: application/json" ^
|
||||||
|
-d "@request.json"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 创建 request.json 文件
|
||||||
|
|
||||||
|
对于复杂的请求体,推荐使用文件:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"name": "张三",
|
||||||
|
"email": "zhangsan@example.com",
|
||||||
|
"roles": ["admin", "user"],
|
||||||
|
"settings": {
|
||||||
|
"theme": "dark",
|
||||||
|
"language": "zh-CN"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -X POST https://api.example.com/users \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d @request.json
|
||||||
|
```
|
||||||
|
|
||||||
|
## 实用技巧
|
||||||
|
|
||||||
|
### 1. 测量请求时间
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -w "DNS: %{time_namelookup}s\nConnect: %{time_connect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" \
|
||||||
|
-o /dev/null -s https://api.example.com
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 下载文件并显示进度
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -O --progress-bar https://example.com/large-file.zip
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 断点续传
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -C - -O https://example.com/large-file.zip
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. 限速下载
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 限制为 1MB/s
|
||||||
|
curl --limit-rate 1M -O https://example.com/file.zip
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. 批量下载
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 下载多个文件
|
||||||
|
curl -O https://example.com/file1.zip -O https://example.com/file2.zip
|
||||||
|
|
||||||
|
# 使用序列
|
||||||
|
curl -O https://example.com/file[1-10].jpg
|
||||||
|
|
||||||
|
# 使用字母序列
|
||||||
|
curl -O https://example.com/file[a-z].jpg
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6. 调试请求
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 显示完整请求/响应信息
|
||||||
|
curl -v https://api.example.com
|
||||||
|
|
||||||
|
# 输出详细信息到文件
|
||||||
|
curl --trace-ascii debug.txt https://api.example.com
|
||||||
|
```
|
||||||
|
|
||||||
|
## curl vs Postman 对比
|
||||||
|
|
||||||
|
| 功能 | curl | Postman |
|
||||||
|
|------|------|---------|
|
||||||
|
| 安装 | 系统内置/轻量 | 需下载安装 |
|
||||||
|
| 脚本化 | ✅ 原生支持 | ❌ 需导出 |
|
||||||
|
| 自动化 | ✅ 易于集成 CI/CD | 需 Newman |
|
||||||
|
| 资源占用 | 极低 | 较高 |
|
||||||
|
| 可视化 | ❌ 无 | ✅ 有 |
|
||||||
|
| 学习曲线 | 较陡 | 平缓 |
|
||||||
|
| 环境管理 | 手动配置 | 图形界面 |
|
||||||
|
| 团队协作 | Git + 脚本 | 云同步 |
|
||||||
|
| 价格 | 免费 | 免费版有限制 |
|
||||||
|
|
||||||
|
## 快速参考
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 最常用的命令模板
|
||||||
|
curl -X [METHOD] [URL] \
|
||||||
|
-H "Authorization: Bearer $TOKEN" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '[JSON_DATA]' | jq
|
||||||
|
|
||||||
|
# 常用组合
|
||||||
|
curl -s -X POST $URL -H $HEADERS -d $DATA | jq # 静默 POST,美化输出
|
||||||
|
curl -I $URL # 检查响应头
|
||||||
|
curl -L -I $URL # 跟随重定向并显示头
|
||||||
|
curl -v $URL # 调试模式
|
||||||
|
curl -u user:pass $URL # Basic Auth
|
||||||
|
```
|
||||||
|
|
||||||
|
## 总结
|
||||||
|
|
||||||
|
curl 是一个功能强大的 HTTP 客户端工具,通过脚本化和命令行参数可以完全替代 Postman 进行 API 测试。虽然缺少可视化界面,但其轻量、可自动化、易于集成的特点使其成为开发者和 DevOps 的首选工具。
|
||||||
|
|
||||||
|
掌握 curl 能让你在没有图形界面的服务器环境中也能灵活地进行 API 调试和测试,是每个开发者必备的技能。
|
||||||
@@ -138,6 +138,26 @@ brew services start colima
|
|||||||
colima start
|
colima start
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 卸载
|
||||||
|
|
||||||
|
```shell
|
||||||
|
colima stop
|
||||||
|
```
|
||||||
|
|
||||||
|
```shell
|
||||||
|
colima delete
|
||||||
|
```
|
||||||
|
|
||||||
|
```shell
|
||||||
|
brew uninstall colima
|
||||||
|
```
|
||||||
|
|
||||||
|
```shell
|
||||||
|
rm -rf ~/.colima
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### 运行时
|
### 运行时
|
||||||
|
|
||||||
初始启动时,Colima会使用默认为Docker的用户指定的运行时启动。
|
初始启动时,Colima会使用默认为Docker的用户指定的运行时启动。
|
||||||
@@ -298,6 +318,33 @@ git clone https://github.com/dracula/iterm.git ~/.dotfiles/iTerm-Settings/them
|
|||||||
5. 重启终端
|
5. 重启终端
|
||||||
关闭当前正在使用的所有终端窗口(无论是系统自带的 Terminal 还是 iTerm2),然后重新打开一个新的终端窗口。 这样做是为了让终端重新加载 `PATH` 环境变量,从而识别到新安装的 `code` 命令。
|
关闭当前正在使用的所有终端窗口(无论是系统自带的 Terminal 还是 iTerm2),然后重新打开一个新的终端窗口。 这样做是为了让终端重新加载 `PATH` 环境变量,从而识别到新安装的 `code` 命令。
|
||||||
|
|
||||||
|
## HBuilderX
|
||||||
|
|
||||||
|
### 常见问题
|
||||||
|
|
||||||
|
使用cli脚本创建uniapp 运行时报错“cli项目运行依赖本地的Nodejs环境,请先安装并配置到系统环境变量后重试。”
|
||||||
|
|
||||||
|
编辑~/.bash_profile
|
||||||
|
|
||||||
|
```bash
|
||||||
|
vim ~/.bash_profile
|
||||||
|
```
|
||||||
|
|
||||||
|
打开之后新增
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#nvm环境
|
||||||
|
export NVM_DIR="$HOME/.nvm"
|
||||||
|
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
|
||||||
|
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
|
||||||
|
```
|
||||||
|
|
||||||
|
保存退出后执行
|
||||||
|
|
||||||
|
```bash
|
||||||
|
source ~/.bash_profile
|
||||||
|
```
|
||||||
|
|
||||||
# 系统设置
|
# 系统设置
|
||||||
|
|
||||||
## 键盘
|
## 键盘
|
||||||
@@ -316,3 +363,42 @@ git clone https://github.com/dracula/iterm.git ~/.dotfiles/iTerm-Settings/them
|
|||||||
sudo spctl --master-disable
|
sudo spctl --master-disable
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 开启开发者模式
|
||||||
|
|
||||||
|
macOS每次在IDE开启debug的时候,都会出现Developer Tools Access的弹窗。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 解决方案
|
||||||
|
|
||||||
|
我们只需要启用开发者模式即可
|
||||||
|
|
||||||
|
打开终端输入下边命令:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
# 查看状态
|
||||||
|
DevToolsSecurity --status
|
||||||
|
# 输入密码,修改为enable,即可用
|
||||||
|
DevToolsSecurity --enable
|
||||||
|
# 输入密码,修改为disable,即关闭
|
||||||
|
DevToolsSecurity --disable
|
||||||
|
```
|
||||||
|
|
||||||
|
# 快捷键
|
||||||
|
|
||||||
|
## 创建虚拟桌面
|
||||||
|
|
||||||
|
Control + 上箭头
|
||||||
|
|
||||||
|
## 切换虚拟桌面
|
||||||
|
|
||||||
|
Control + 左右箭头
|
||||||
|
|
||||||
|
## 访问 Mission Control
|
||||||
|
|
||||||
|
F3
|
||||||
|
|
||||||
|
## 隐藏或显示程序呜
|
||||||
|
|
||||||
|
Option + Command + D
|
||||||
|
|
||||||
|
|||||||
+363
-2
@@ -347,6 +347,195 @@ modelscope download --model 'Qwen/Qwen2-7b' --include '*.json' --local_dir './lo
|
|||||||
echo 'export MODELSCOPE_CACHE=/AI/modelscope/hub' >> ~/.bashrc
|
echo 'export MODELSCOPE_CACHE=/AI/modelscope/hub' >> ~/.bashrc
|
||||||
```
|
```
|
||||||
|
|
||||||
|
# hugging face
|
||||||
|
|
||||||
|
## 模型下载
|
||||||
|
|
||||||
|
### 安装
|
||||||
|
|
||||||
|
`conda` 创建虚拟环境
|
||||||
|
|
||||||
|
```bash
|
||||||
|
conda create -n hf-mirror python=3.12
|
||||||
|
```
|
||||||
|
|
||||||
|
`conda` 激活虚拟环境
|
||||||
|
|
||||||
|
```bash
|
||||||
|
conda activate hf-mirror
|
||||||
|
```
|
||||||
|
|
||||||
|
安装包
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pip install -U "huggingface_hub"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 命令行下载
|
||||||
|
|
||||||
|
### Download a single file
|
||||||
|
|
||||||
|
```bash
|
||||||
|
hf download cyankiwi/Nemotron-Orchestrator-8B-AWQ-8bit --local-dir /AI/hf/models/cyankiwi/Nemotron-Orchestrator-8B-AWQ-8bit
|
||||||
|
```
|
||||||
|
|
||||||
|
-
|
||||||
|
|
||||||
|
# Code-forge
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
**先说结论(适用于企业/商用环境)**
|
||||||
|
|
||||||
|
- **Anaconda(defaults 源)不能免费商用**:在公司/商业场景下使用 Anaconda 的默认源通常需要付费许可。
|
||||||
|
- **Miniconda + conda-forge 能用,但要彻底移除 defaults,并避免在 base 开发**:否则仍可能触发 Anaconda 许可风险。
|
||||||
|
- **最稳妥方案:Miniforge + conda-forge**:安装即默认使用 conda-forge,规避 defaults,合规且轻量。
|
||||||
|
|
||||||
|
> 简单理解:不是“conda 这款工具”收费,而是“使用 Anaconda/Defaults 源的二进制分发”涉及商业许可;改用 **conda-forge** 社区源即可规避许可问题。
|
||||||
|
|
||||||
|
## 彻底卸载现有 Anaconda/Miniconda
|
||||||
|
|
||||||
|
> 目标:清掉默认源、配置与 shell 残留,避免后续“误连 defaults”。
|
||||||
|
|
||||||
|
1. 查看 conda 安装路径(含各环境)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
conda info --base
|
||||||
|
```
|
||||||
|
|
||||||
|
2. 删除用户侧配置与缓存
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rm -rf ~/.condarc ~/.conda ~/.continuum
|
||||||
|
```
|
||||||
|
|
||||||
|
3. 清理 shell 初始化残留
|
||||||
|
|
||||||
|
在 `~/.bashrc`、`~/.bash_profile`、`~/.zshrc` 中搜索并删除与 `conda init`、`anaconda` 相关的初始化片段,保存后重新加载:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
source ~/.zshrc # 或 source ~/.bashrc
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Windows 清理(如之前安装过 Anaconda/Miniconda)
|
||||||
|
|
||||||
|
- 通过“应用和功能”卸载 Anaconda/Miniconda。
|
||||||
|
- 删除用户目录:`C:\\Users\\<你的用户名>\\.conda`、`C:\\Users\\<你的用户名>\\.continuum`、`C:\\Users\\<你的用户名>\\.condarc`(若存在)。
|
||||||
|
- 检查“环境变量”中与 Anaconda/Miniconda 相关的 Path 条目并移除。
|
||||||
|
|
||||||
|
## 安装 Miniforge
|
||||||
|
|
||||||
|
> Miniforge 默认只使用 conda-forge,装好即合规、可商用。
|
||||||
|
|
||||||
|
- 发布页(选择你的平台与架构):
|
||||||
|
`https://github.com/conda-forge/miniforge/releases`
|
||||||
|
|
||||||
|
### macOS/Linux检查
|
||||||
|
|
||||||
|
```bash
|
||||||
|
conda list --show-channel-urls | grep -v "^#" | awk '{print $4}' | sort | uniq -c
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Windows检查
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
conda list --show-channel-urls | Where-Object {
|
||||||
|
$_ -notmatch '^#'
|
||||||
|
} | ForEach-Object {
|
||||||
|
($_ -split '\s+')[3]
|
||||||
|
} | Sort-Object | Group-Object | Select-Object Count,Name
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
到这里,「Miniforge」+「conda-forge」的安装就`已经完成了`!因为「Miniforge」`默认的就是「conda-forge」源`。
|
||||||
|
|
||||||
|
## 将通道固定为 conda-forge(严格优先)
|
||||||
|
|
||||||
|
> 如果你此前用过 Miniconda,请务必执行本小节以彻底规避 defaults。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 移除 defaults(如不存在会提示,无妨)
|
||||||
|
conda config --remove channels defaults || true
|
||||||
|
# 仅使用 conda-forge,并设置严格优先级
|
||||||
|
conda config --add channels conda-forge
|
||||||
|
conda config --set channel_priority strict
|
||||||
|
# 查看当前配置
|
||||||
|
conda config --show | sed -n '/channels:/,/^$/p'
|
||||||
|
```
|
||||||
|
|
||||||
|
建议:不要在 `base` 环境中开发,创建独立环境更干净:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
conda create -n ai python=3.11 -y
|
||||||
|
conda activate ai
|
||||||
|
```
|
||||||
|
|
||||||
|
## 验证是否仍引用 Anaconda 源
|
||||||
|
|
||||||
|
> 下面的命令会统计当前环境中每个包来自哪个 channel,方便确认是否“纯 conda-forge”。
|
||||||
|
|
||||||
|
macOS/Linux:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
conda list --show-channel-urls | grep -v "^#" | awk '{print $4}' | sort | uniq -c
|
||||||
|
```
|
||||||
|
|
||||||
|
Windows:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
conda list --show-channel-urls | Where-Object {
|
||||||
|
$_ -notmatch '^#'
|
||||||
|
} | ForEach-Object {
|
||||||
|
($_ -split '\s+')[3]
|
||||||
|
} | Sort-Object | Group-Object | Select-Object Count,Name
|
||||||
|
```
|
||||||
|
|
||||||
|
若输出仅包含 `conda-forge`,说明你的环境是合规的;若还出现 `defaults`/`anaconda`,请返回第三节重新清理并创建新环境。
|
||||||
|
|
||||||
|
## 常见问题(FAQ)
|
||||||
|
|
||||||
|
- Q:Miniconda + conda-forge 能不能商用?
|
||||||
|
A:可以,但务必移除 `defaults`,并新建环境后再安装依赖。历史 `base` 或旧环境中若残留来自 `defaults` 的包,仍可能存在许可风险。更稳妥的做法是直接使用 **Miniforge**。
|
||||||
|
|
||||||
|
- Q:为什么不在 base 环境开发?
|
||||||
|
A:base 常被用于初始化与管理,历史上最容易“混入” defaults 包。独立环境可保证依赖与渠道的可控性与可复现性。
|
||||||
|
|
||||||
|
- Q:国内下载慢怎么办?
|
||||||
|
A:可配置 conda-forge 的国内镜像(如清华镜像站),并保持 `channel_priority strict`,避免回落到 defaults。
|
||||||
|
|
||||||
|
- Q:已有项目如何迁移?
|
||||||
|
A:导出依赖、切换通道、重建环境:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
conda env export --from-history > env.yml
|
||||||
|
# 按第三节配置通道为 conda-forge 后
|
||||||
|
conda env create -n ai-new -f env.yml
|
||||||
|
conda activate ai-new
|
||||||
|
```
|
||||||
|
|
||||||
|
## 参考命令清单(便捷复用)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 卸载相关(macOS/Linux)
|
||||||
|
conda info --base
|
||||||
|
rm -rf ~/.condarc ~/.conda ~/.continuum
|
||||||
|
# Miniforge 安装(示例)
|
||||||
|
curl -LO https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh
|
||||||
|
bash Miniforge3-MacOSX-arm64.sh -b -p $HOME/miniforge3
|
||||||
|
source "$HOME/miniforge3/bin/activate" && conda init zsh &&
|
||||||
|
exec $SHELL
|
||||||
|
# 仅使用 conda-forge(严格优先)
|
||||||
|
conda config --remove channels defaults || true
|
||||||
|
conda config --add channels conda-forge
|
||||||
|
conda config --set channel_priority strict
|
||||||
|
# 创建与使用环境
|
||||||
|
conda create -n ai python=3.11 -y
|
||||||
|
conda activate ai
|
||||||
|
```
|
||||||
|
|
||||||
# Anaconda
|
# Anaconda
|
||||||
|
|
||||||
>
|
>
|
||||||
@@ -533,13 +722,15 @@ source ~/.zshrc
|
|||||||
|
|
||||||
>
|
>
|
||||||
|
|
||||||
## 安装
|
## 全局
|
||||||
|
|
||||||
|
### 安装
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
pip install jupyter
|
pip install jupyter
|
||||||
```
|
```
|
||||||
|
|
||||||
## 运行
|
### 运行
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
jupyter notebook
|
jupyter notebook
|
||||||
@@ -547,6 +738,176 @@ jupyter notebook
|
|||||||
jupyter notebook --allow-root
|
jupyter notebook --allow-root
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Conda 虚拟环境
|
||||||
|
|
||||||
|
### 安装
|
||||||
|
|
||||||
|
#### 使用 nb_conda_kernels 添加所有环境
|
||||||
|
|
||||||
|
```bash
|
||||||
|
conda activate my-conda-env # this is the environment for your project and code
|
||||||
|
conda install ipykernel
|
||||||
|
conda deactivate
|
||||||
|
|
||||||
|
conda activate base # could be also some other environment
|
||||||
|
conda install nb_conda_kernels
|
||||||
|
jupyter notebook
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 配置密码(适用于 Jupyter 7+ / JupyterLab 4+)
|
||||||
|
|
||||||
|
在 安装有 jupyter 包的终端中运行
|
||||||
|
|
||||||
|
```bash
|
||||||
|
jupyter server password
|
||||||
|
```
|
||||||
|
|
||||||
|
然后按提示输入并确认密码。
|
||||||
|
Jupyter 会自动将加密后的密码写入配置文件(通常是 `~/.jupyter/jupyter_server_config.json`)。
|
||||||
|
|
||||||
|
#### 生成并编辑配置文件
|
||||||
|
|
||||||
|
**生成配置文件**(如果还没有):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
jupyter notebook --generate-config
|
||||||
|
```
|
||||||
|
|
||||||
|
(对于新版本):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
jupyter server --generate-config
|
||||||
|
```
|
||||||
|
|
||||||
|
**编辑配置文件**(通常是 `~/.jupyter/jupyter_server_config.py` 或 `jupyter_notebook_config.py`)
|
||||||
|
|
||||||
|
```python
|
||||||
|
c = get_config()
|
||||||
|
|
||||||
|
# 允许远程访问
|
||||||
|
c.ServerApp.ip = '0.0.0.0' # 注意:新版本用 ServerApp 而非 NotebookApp
|
||||||
|
|
||||||
|
# 禁用自动打开浏览器
|
||||||
|
c.ServerApp.open_browser = False
|
||||||
|
|
||||||
|
# 设置端口(可选)
|
||||||
|
c.ServerApp.port = 8888
|
||||||
|
|
||||||
|
# (可选)设置工作目录
|
||||||
|
c.ServerApp.root_dir = '/path/to/your/notebooks'
|
||||||
|
|
||||||
|
# (可选)允许通过 token 或密码登录(设了密码后 token 会失效)
|
||||||
|
c.ServerApp.token = '' # 禁用 token(如果已设密码)
|
||||||
|
c.ServerApp.password_required = True
|
||||||
|
```
|
||||||
|
|
||||||
|
> 🔔注意:**Jupyter 新版本中 `NotebookApp` 已被 `ServerApp` 取代**,所以配置项要使用 `c.ServerApp.xxx`。
|
||||||
|
|
||||||
|
### 启动 Jupyter
|
||||||
|
|
||||||
|
```bash
|
||||||
|
jupyter notebook --ip=0.0.0.0 --port=5600 --no-browser
|
||||||
|
```
|
||||||
|
|
||||||
|
或直接:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
jupyter lab --ip=0.0.0.0 --port=5600 --no-browser
|
||||||
|
```
|
||||||
|
|
||||||
|
### 注册服务
|
||||||
|
|
||||||
|
#### 创建 systemd 服务文件
|
||||||
|
|
||||||
|
创建服务文件(以用户 `user` 为例,替换为你的实际用户名):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo vim /etc/systemd/system/jupyter-lab.service
|
||||||
|
```
|
||||||
|
|
||||||
|
内容如下(**关键:使用绝对路径 + conda run**):
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[Unit]
|
||||||
|
Description=Jupyter Lab Service
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=user
|
||||||
|
WorkingDirectory=/home/user
|
||||||
|
Environment=PATH=/home/user/miniforge3/envs/jupyter-env/bin:/home/user/miniforge3/condabin:/usr/local/bin:/usr/bin:/bin
|
||||||
|
ExecStart=/home/user/miniforge3/envs/jupyter-env/bin/jupyter lab --ip=0.0.0.0 --port=7745 --no-browser
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
StandardOutput=journal
|
||||||
|
StandardError=journal
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 重载 systemd 并启用服务
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 重载 systemd 配置
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
|
||||||
|
# 启动服务
|
||||||
|
sudo systemctl start jupyter-lab
|
||||||
|
|
||||||
|
# 设置开机自启
|
||||||
|
sudo systemctl enable jupyter-lab
|
||||||
|
|
||||||
|
# 查看状态和日志
|
||||||
|
sudo systemctl status jupyter-lab
|
||||||
|
journalctl -u jupyter-lab -f
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# UV
|
||||||
|
|
||||||
|
**优点:**
|
||||||
|
|
||||||
|
- 极快的速度(比 pip 快 10-100 倍)
|
||||||
|
- 自动管理 Python 版本
|
||||||
|
- 内置虚拟环境管理
|
||||||
|
- 现代化工具,Rust 编写
|
||||||
|
- 无需单独安装 Python
|
||||||
|
|
||||||
|
## 安装
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -LsSf https://astral.sh/uv/install.sh | sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## 创建项目并自动安装 Python
|
||||||
|
|
||||||
|
```bash
|
||||||
|
uv init myproject
|
||||||
|
cd myproject
|
||||||
|
uv python install 3.12 # 自动下载安装 Python 3.12
|
||||||
|
uv venv # 创建虚拟环境
|
||||||
|
source .venv/bin/activate
|
||||||
|
```
|
||||||
|
|
||||||
|
## 安装包(使用 pyproject.toml)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 创建项目
|
||||||
|
uv init langchain-project
|
||||||
|
cd langchain-project
|
||||||
|
|
||||||
|
# 添加依赖
|
||||||
|
uv add langchain==1.0.0
|
||||||
|
uv add langchain-core==1.0.0
|
||||||
|
uv add langchain-community==1.0.0
|
||||||
|
uv add langchain-openai # 可选
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# UnSloth
|
# UnSloth
|
||||||
|
|
||||||
# vLLM
|
# vLLM
|
||||||
|
|||||||
@@ -502,14 +502,10 @@ document.addEventListener('DOMContentLoaded', function () {
|
|||||||
$htmlDom.toggle('hide-aside')
|
$htmlDom.toggle('hide-aside')
|
||||||
},
|
},
|
||||||
toggleSakuraBtn: () => {
|
toggleSakuraBtn: () => {
|
||||||
const toggleBtn = document.getElementById('toggle_sakura_btn');
|
|
||||||
if (toggleBtn) {
|
|
||||||
// toggleBtn.addEventListener('click', function () {
|
|
||||||
const sakuraEffect = document.getElementById('canvas_sakura');
|
const sakuraEffect = document.getElementById('canvas_sakura');
|
||||||
if (sakuraEffect) {
|
if (sakuraEffect) {
|
||||||
sakuraEffect.style.display = (sakuraEffect.style.display === 'none' || sakuraEffect.style.display === '') ? 'block' : 'none';
|
const isHidden = window.getComputedStyle(sakuraEffect).display === 'none';
|
||||||
}
|
sakuraEffect.style.display = isHidden ? 'block' : 'none';
|
||||||
// });
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user