<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>HMT</title><description>个人博客</description><link>https://blog.homura.work/</link><language>zh_CN</language><item><title>Sudo 误删/权限丢失后的不重启救援指南</title><link>https://blog.homura.work/posts/tech/server/missing_sudo/</link><guid isPermaLink="true">https://blog.homura.work/posts/tech/server/missing_sudo/</guid><description>记录一次服务器 sudo 权限意外丢失后的紧急救援过程，利用 Docker 挂载宿主机根目录进行提权修复。</description><pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;问题根源&lt;/h1&gt;
&lt;p&gt;当 &lt;code&gt;/usr/bin/sudo&lt;/code&gt; 的所有者被误改为普通用户（如 &lt;code&gt;renlin&lt;/code&gt;）时，Linux 为了安全，自动剥夺了 sudo 的 SUID 特权位（那个 &lt;code&gt;s&lt;/code&gt; 权限）。&lt;/p&gt;
&lt;p&gt;正常情况下，sudo 的权限应该是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;-rwsr-xr-x 1 root root ... /usr/bin/sudo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但现在变成了：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;-rwxr-xr-x 1 renlin root ... /usr/bin/sudo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意两个致命问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;所有者从 &lt;code&gt;root&lt;/code&gt; 变成了 &lt;code&gt;renlin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;权限从 &lt;code&gt;rws&lt;/code&gt;（有 SUID）变成了 &lt;code&gt;rwx&lt;/code&gt;（无特权）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;你陷入了一个死循环：要修 sudo 需要用 sudo 命令，但 sudo 坏了所以你用不了 sudo。&lt;/p&gt;
&lt;h1&gt;利用 Docker 提权修复&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;原理&lt;/strong&gt;：Docker 守护进程是 Root 运行的。如果你能运行 docker 容器，你就可以把宿主机的根目录挂载到容器里，然后在容器里修改宿主机文件的权限。&lt;/p&gt;
&lt;h2&gt;第一步：使用 Docker 修复 sudo 权限&lt;/h2&gt;
&lt;p&gt;执行这条命令，它会启动一个容器，挂载你的硬盘，并修复 sudo 的权限：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker run -v /:/mnt --rm -it alpine sh -c &quot;chmod 4755 /mnt/usr/bin/sudo &amp;amp;&amp;amp; chown root:root /mnt/usr/bin/sudo&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;第二步：验证 sudo&lt;/h2&gt;
&lt;p&gt;Docker 命令跑完后，立刻在当前终端验证：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ls
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果提示输入密码并成功列出文件，说明 sudo 活了！&lt;/p&gt;
&lt;h2&gt;第三步：重装核心包（彻底修复）&lt;/h2&gt;
&lt;p&gt;现在 sudo 能用了，立刻用系统自带的安装命令，把那些坏掉的 ping、su、mount 全都重装一遍。系统会自动把它们修复到完美状态：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get update
sudo apt-get install --reinstall --allow-downgrades sudo passwd mount iputils-ping util-linux policykit-1 cron fuse3 login
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;最终验收（4 步验证）&lt;/h1&gt;
&lt;p&gt;为了确保万无一失，请按照以下 4 个步骤进行最终验收。如果这 4 步全过，你就彻底安全了。&lt;/p&gt;
&lt;h2&gt;✅ 第 1 步：验证 sudo 功能&lt;/h2&gt;
&lt;p&gt;最关键的一步。如果没有这个，别的都免谈。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo id
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;合格标准：&lt;/strong&gt;
输出必须包含 &lt;code&gt;uid=0(root)&lt;/code&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果系统问你要密码，并且输完密码后显示了 root 信息，通过！&lt;/li&gt;
&lt;li&gt;如果报错 &lt;code&gt;setuid&lt;/code&gt; 相关错误，说明没修好。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;✅ 第 2 步：验证 SUID 权限&lt;/h2&gt;
&lt;p&gt;检查关键系统命令的 SUID 特权位是否恢复。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ls -l /usr/bin/sudo /usr/bin/passwd /usr/bin/ping /usr/bin/mount /usr/bin/su /usr/bin/newgrp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;合格标准：&lt;/strong&gt;
仔细看每一行的权限部分（最左边一串字符）。&lt;strong&gt;必须&lt;/strong&gt; 看到 &lt;strong&gt;&lt;code&gt;rws&lt;/code&gt;&lt;/strong&gt;（注意是小写的 &lt;strong&gt;s&lt;/strong&gt;，且通常是红色的）。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;-rwsr-xr-x 1 root root ... /usr/bin/sudo
-rwsr-xr-x 1 root root ... /usr/bin/ping
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;如果有 &lt;code&gt;s&lt;/code&gt;，通过！&lt;/li&gt;
&lt;li&gt;如果是 &lt;code&gt;x&lt;/code&gt; (如 &lt;code&gt;-rwxr-xr-x&lt;/code&gt;)，说明特权没加上，功能受限。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;✅ 第 3 步：验证 ping 命令&lt;/h2&gt;
&lt;p&gt;回到最开始导致你发现问题的命令。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ping -c 3 www.baidu.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;合格标准：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;输出类似 &lt;code&gt;64 bytes from ...&lt;/code&gt;，通过！&lt;/li&gt;
&lt;li&gt;如果报错 &lt;code&gt;socket: Operation not permitted&lt;/code&gt;，说明 &lt;code&gt;ping&lt;/code&gt; 的 SUID 没修好。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;✅ 第 4 步：验证文件所有权&lt;/h2&gt;
&lt;p&gt;确认 &lt;code&gt;/usr/bin&lt;/code&gt; 目录下确实没有任何文件属于 &lt;code&gt;renlin&lt;/code&gt; 了。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;find /usr/bin -user renlin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;合格标准：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;没有任何输出&lt;/strong&gt;（直接跳到下一行命令提示符），通过！&lt;/li&gt;
&lt;li&gt;如果还有输出文件名，说明还有漏网之鱼（通常是软链接，可以用 &lt;code&gt;sudo chown -h root:root ...&lt;/code&gt; 修复）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;惨痛教训&lt;/h1&gt;
&lt;p&gt;以后永远、永远不要执行 &lt;code&gt;chown -R 用户名 /usr&lt;/code&gt; 或 &lt;code&gt;chown -R 用户名 /bin&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;Linux 的系统目录（/usr, /bin, /sbin, /etc, /lib）必须严格属于 root，一旦改了，系统防御机制就会自动&quot;自爆&quot;（剥夺特权）。&lt;/p&gt;
</content:encoded></item><item><title>服务器登录公告配置</title><link>https://blog.homura.work/posts/tech/server/announcement/</link><guid isPermaLink="true">https://blog.homura.work/posts/tech/server/announcement/</guid><pubDate>Wed, 28 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;登录通知类型说明&lt;/h1&gt;
&lt;p&gt;Linux系统中有三种主要的登录通知：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;通知类型&lt;/th&gt;
&lt;th&gt;显示时机&lt;/th&gt;
&lt;th&gt;配置文件&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Banner&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;登录前（输入密码前）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;法律声明、警告信息&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MOTD&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;登录后&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/etc/motd&lt;/code&gt; 或 &lt;code&gt;/etc/update-motd.d/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;欢迎消息、系统信息&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Last Login&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;登录后&lt;/td&gt;
&lt;td&gt;SSH配置&lt;/td&gt;
&lt;td&gt;上次登录时间和IP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;第一部分：配置登录前横幅（Banner）&lt;/h1&gt;
&lt;h2&gt;1. 创建横幅文件&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 创建横幅文件
sudo nano /etc/ssh/banner
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2. 添加横幅内容&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;###############################################################################
#                                                                             #
#                           🚀 欢迎访问服务器                                  #
#                                                                             #
#  警告：本系统仅供授权用户使用！                                                #
#  所有活动将被记录和监控。                                                     #
#  未经授权的访问将被追究法律责任。                                              #
#                                                                             #
###############################################################################
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3. 配置SSH使用横幅&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 编辑SSH配置
sudo nano /etc/ssh/sshd_config
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;找到 &lt;code&gt;Banner&lt;/code&gt; 配置行并修改：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 启用横幅
Banner /etc/ssh/banner
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;4. 重启SSH服务&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart ssh
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;5. 测试横幅显示&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;ssh username@服务器IP
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;第二部分：配置登录后欢迎消息（MOTD）&lt;/h1&gt;
&lt;p&gt;Ubuntu系统使用&lt;strong&gt;动态MOTD&lt;/strong&gt;系统，通过脚本生成消息。&lt;/p&gt;
&lt;h2&gt;方法一：使用静态MOTD（简单）&lt;/h2&gt;
&lt;h3&gt;1. 禁用动态MOTD&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 备份现有配置
sudo cp /etc/pam.d/sshd /etc/pam.d/sshd.backup

# 编辑PAM配置
sudo nano /etc/pam.d/sshd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注释掉这两行（在行首添加 &lt;code&gt;#&lt;/code&gt;）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# session    optional     pam_motd.so  motd=/run/motd.dynamic
# session    optional     pam_motd.so noupdate
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 创建静态MOTD&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/motd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加自定义消息：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;╔══════════════════════════════════════════════════════════════╗
║                                                              ║
║               🎉 欢迎登录 Ubuntu 服务器！                      ║
║                                                              ║
║  服务器名称：Production Server                                ║
║  系统版本：Ubuntu 22.04 LTS                                   ║
║  维护联系：admin@example.com                                  ║
║                                                              ║
║  📚 文档：https://wiki.example.com                           ║
║  🔧 工单：https://tickets.example.com                        ║
║                                                              ║
╚══════════════════════════════════════════════════════════════╝
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 设置文件权限&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo chmod 644 /etc/motd
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;方法二：自定义动态MOTD脚本（推荐）&lt;/h2&gt;
&lt;p&gt;动态MOTD可以显示实时系统信息。&lt;/p&gt;
&lt;h3&gt;1. 了解动态MOTD脚本位置&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 查看现有脚本
ls -la /etc/update-motd.d/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;脚本按数字顺序执行：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;00-header&lt;/code&gt; - 系统信息头&lt;/li&gt;
&lt;li&gt;&lt;code&gt;10-help-text&lt;/code&gt; - 帮助信息&lt;/li&gt;
&lt;li&gt;&lt;code&gt;50-motd-news&lt;/code&gt; - Ubuntu新闻&lt;/li&gt;
&lt;li&gt;&lt;code&gt;80-livepatch&lt;/code&gt; - Livepatch状态&lt;/li&gt;
&lt;li&gt;&lt;code&gt;90-updates-available&lt;/code&gt; - 可用更新&lt;/li&gt;
&lt;li&gt;&lt;code&gt;91-release-upgrade&lt;/code&gt; - 版本升级提示&lt;/li&gt;
&lt;li&gt;&lt;code&gt;95-hwe-eol&lt;/code&gt; - 硬件支持提示&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 禁用不需要的脚本&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 禁用Ubuntu新闻
sudo chmod -x /etc/update-motd.d/50-motd-news

# 禁用Livepatch提示
sudo chmod -x /etc/update-motd.d/80-livepatch

# 禁用释放升级提示
sudo chmod -x /etc/update-motd.d/91-release-upgrade

# 禁用所有默认脚本（如果要完全自定义）
sudo chmod -x /etc/update-motd.d/*
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 创建自定义欢迎脚本&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/update-motd.d/01-custom-banner
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

# 颜色定义
RED=&apos;\033[0;31m&apos;
GREEN=&apos;\033[0;32m&apos;
YELLOW=&apos;\033[1;33m&apos;
BLUE=&apos;\033[0;34m&apos;
NC=&apos;\033[0m&apos; # No Color

echo -e &quot;${GREEN}&quot;
echo &quot;╔══════════════════════════════════════════════════════════════╗&quot;
echo &quot;║                                                              ║&quot;
echo &quot;║               🚀 欢迎登录 Ubuntu 服务器                      ║&quot;
echo &quot;║                                                              ║&quot;
echo &quot;╚══════════════════════════════════════════════════════════════╝&quot;
echo -e &quot;${NC}&quot;

# 显示系统信息
echo -e &quot;${BLUE}📊 系统信息：${NC}&quot;
echo &quot;  ├─ 主机名：$(hostname)&quot;
echo &quot;  ├─ 内核版本：$(uname -r)&quot;
echo &quot;  ├─ 运行时间：$(uptime -p)&quot;
echo &quot;  ├─ 系统负载：$(uptime | awk -F&apos;load average:&apos; &apos;{print $2}&apos;)&quot;
echo &quot;&quot;

# 显示磁盘使用情况
echo -e &quot;${BLUE}💾 磁盘使用：${NC}&quot;
df -h | grep -E &apos;^/dev/&apos; | awk &apos;{printf &quot;  ├─ %s: %s / %s (%s)\n&quot;, $6, $3, $2, $5}&apos;
echo &quot;&quot;

# 显示内存使用
echo -e &quot;${BLUE}🧠 内存使用：${NC}&quot;
free -h | grep Mem | awk &apos;{printf &quot;  ├─ 已用: %s / %s\n&quot;, $3, $2}&apos;
echo &quot;&quot;

# 显示登录用户
echo -e &quot;${BLUE}👥 当前在线用户：${NC}&quot;
who | awk &apos;{printf &quot;  ├─ %s (来自 %s)\n&quot;, $1, $5}&apos; | sed &apos;s/[()]//g&apos;
echo &quot;&quot;

# 显示重要提示
echo -e &quot;${YELLOW}⚠️  提示：${NC}&quot;
echo &quot;  ├─ 请勿在生产环境进行未经测试的操作&quot;
echo &quot;  ├─ 所有操作将被记录&quot;
echo &quot;  └─ 遇到问题请联系：admin@example.com&quot;
echo &quot;&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. 设置脚本权限&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo chmod +x /etc/update-motd.d/01-custom-banner
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5. 测试MOTD&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 手动运行MOTD脚本查看效果
sudo run-parts /etc/update-motd.d/

# 或者重新登录查看
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;方法三：创建极简版MOTD&lt;/h2&gt;
&lt;p&gt;如果只想显示简单的欢迎消息：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 禁用所有动态脚本
sudo chmod -x /etc/update-motd.d/*

# 创建简单的欢迎脚本
sudo nano /etc/update-motd.d/00-header
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash
echo &quot;&quot;
echo &quot;🎉 欢迎登录 $(hostname)&quot;
echo &quot;📅 当前时间：$(date &apos;+%Y-%m-%d %H:%M:%S&apos;)&quot;
echo &quot;&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;设置权限：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chmod +x /etc/update-motd.d/00-header
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;第三部分：配置Last Login信息&lt;/h1&gt;
&lt;h2&gt;1. 禁用Last Login提示&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 编辑SSH配置
sudo nano /etc/ssh/sshd_config
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加或修改：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 禁用最后登录信息
PrintLastLog no
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2. 重启SSH服务&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart ssh
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;第四部分：高级自定义示例&lt;/h1&gt;
&lt;h2&gt;示例1：带系统监控的MOTD&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/update-motd.d/10-system-info
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

# 获取系统信息
HOSTNAME=$(hostname)
UPTIME=$(uptime -p | sed &apos;s/up //&apos;)
LOAD=$(cat /proc/loadavg | awk &apos;{print $1, $2, $3}&apos;)
MEMORY=$(free -m | awk &apos;NR==2{printf &quot;%.2f%%&quot;, $3*100/$2 }&apos;)
DISK=$(df -h / | awk &apos;NR==2{print $5}&apos;)
USERS=$(who | wc -l)

# 显示信息
cat &amp;lt;&amp;lt; EOF

┌─────────────────────────────────────────────────────┐
│           系统状态监控 - $(date &apos;+%Y-%m-%d %H:%M&apos;)        
├─────────────────────────────────────────────────────┤
│ 主机名称: $HOSTNAME
│ 运行时间: $UPTIME
│ 系统负载: $LOAD
│ 内存使用: $MEMORY
│ 磁盘使用: $DISK
│ 在线用户: $USERS
└─────────────────────────────────────────────────────┘

EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;sudo chmod +x /etc/update-motd.d/10-system-info
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;示例2：带安全提示的MOTD&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/update-motd.d/20-security-info
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

# 检查可用更新
UPDATES=$(apt list --upgradable 2&amp;gt;/dev/null | grep -c upgradable)
SECURITY=$(apt list --upgradable 2&amp;gt;/dev/null | grep -i security | wc -l)

# 检查重启需求
REBOOT_REQUIRED=&quot;&quot;
if [ -f /var/run/reboot-required ]; then
    REBOOT_REQUIRED=&quot;⚠️  需要重启系统&quot;
fi

# 显示信息
cat &amp;lt;&amp;lt; EOF
📦 系统更新状态：
  ├─ 可用更新：$UPDATES 个
  ├─ 安全更新：$SECURITY 个
  └─ $REBOOT_REQUIRED

EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;sudo chmod +x /etc/update-motd.d/20-security-info
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;示例3：带Docker状态的MOTD&lt;/h2&gt;
&lt;p&gt;如果服务器运行Docker：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/update-motd.d/30-docker-info
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

# 检查Docker是否安装
if command -v docker &amp;amp;&amp;gt; /dev/null; then
    CONTAINERS=$(docker ps -q | wc -l)
    IMAGES=$(docker images -q | wc -l)
    
    cat &amp;lt;&amp;lt; EOF
🐳 Docker 状态：
  ├─ 运行中的容器：$CONTAINERS
  └─ 镜像数量：$IMAGES

EOF
fi
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;sudo chmod +x /etc/update-motd.d/30-docker-info
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;第五部分：完整配置示例&lt;/h1&gt;
&lt;h2&gt;推荐的完整配置&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 1. 禁用所有默认脚本
sudo chmod -x /etc/update-motd.d/*

# 2. 创建自定义头部
sudo nano /etc/update-motd.d/00-header
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash
echo &quot;&quot;
echo -e &quot;\033[0;32m╔═══════════════════════════════════════════╗\033[0m&quot;
echo -e &quot;\033[0;32m║     🚀 欢迎登录生产环境服务器              ║\033[0m&quot;
echo -e &quot;\033[0;32m╚═══════════════════════════════════════════╝\033[0m&quot;
echo &quot;&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# 3. 创建系统信息脚本
sudo nano /etc/update-motd.d/10-sysinfo
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

HOSTNAME=$(hostname)
KERNEL=$(uname -r)
UPTIME=$(uptime -p | sed &apos;s/up //&apos;)
LOAD=$(cat /proc/loadavg | awk &apos;{print $1, $2, $3}&apos;)

echo &quot;📊 系统信息：&quot;
echo &quot;  ├─ 主机: $HOSTNAME&quot;
echo &quot;  ├─ 内核: $KERNEL&quot;
echo &quot;  ├─ 运行时间: $UPTIME&quot;
echo &quot;  └─ 负载: $LOAD&quot;
echo &quot;&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# 4. 创建资源使用脚本
sudo nano /etc/update-motd.d/20-resources
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

# 内存
MEMORY=$(free -h | awk &apos;NR==2{printf &quot;%s/%s (%.2f%%)&quot;, $3, $2, $3*100/$2}&apos;)

# 磁盘
DISK=$(df -h / | awk &apos;NR==2{printf &quot;%s/%s (%s)&quot;, $3, $2, $5}&apos;)

echo &quot;💻 资源使用：&quot;
echo &quot;  ├─ 内存: $MEMORY&quot;
echo &quot;  └─ 磁盘: $DISK&quot;
echo &quot;&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# 5. 设置权限
sudo chmod +x /etc/update-motd.d/00-header
sudo chmod +x /etc/update-motd.d/10-sysinfo
sudo chmod +x /etc/update-motd.d/20-resources

# 6. 测试
sudo run-parts /etc/update-motd.d/
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>服务器docker安装</title><link>https://blog.homura.work/posts/tech/server/docker_install/</link><guid isPermaLink="true">https://blog.homura.work/posts/tech/server/docker_install/</guid><description>Ubuntu/Debian 系统 Docker 安装配置完整指南（国内镜像源）</description><pubDate>Tue, 27 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;安装前准备&lt;/h1&gt;
&lt;h2&gt;更新系统并安装依赖&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get update

sudo apt-get install -y \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;创建密钥目录&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo mkdir -p /etc/apt/keyrings
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;Docker 安装&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：国内网络环境下无法直接访问 Docker 官方源，需使用国内镜像源（如阿里云）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;1. 清理旧的残留文件（可选）&lt;/h2&gt;
&lt;p&gt;如果之前安装失败过，先清理：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo rm -f /etc/apt/keyrings/docker.gpg
sudo rm -f /etc/apt/sources.list.d/docker.list
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2. 下载 GPG 密钥（阿里云镜像）&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3. 添加软件源（阿里云镜像）&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;echo \
  &quot;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
  $(lsb_release -cs) stable&quot; | sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;4. 更新软件列表&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get update
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;5. 安装 Docker Engine&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;6. 验证安装&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;docker --version

sudo docker run hello-world
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;看到 &quot;Hello from Docker!&quot; 说明安装成功。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;权限配置&lt;/h1&gt;
&lt;h2&gt;添加用户到 docker 组（推荐）&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 创建 docker 组（通常已自动创建）
sudo groupadd docker

# 将当前用户添加到 docker 组
sudo usermod -aG docker $USER
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;激活权限&lt;/h2&gt;
&lt;p&gt;权限修改后需要重新登录：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 方法1：激活新组设置（当前会话临时生效）
newgrp docker

# 方法2：重新登录 SSH

# 方法3：重启系统（最可靠）
sudo reboot 
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;验证权限&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 查看当前用户所属组
groups

# 测试（无需 sudo）
docker run hello-world
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;服务管理&lt;/h1&gt;
&lt;h2&gt;启停服务&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 启动
sudo systemctl start docker

# 停止
sudo systemctl stop docker

# 重启
sudo systemctl restart docker

# 查看状态
sudo systemctl status docker
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;开机自启&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 启用
sudo systemctl enable docker

# 禁用
sudo systemctl disable docker
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;镜像加速配置&lt;/h1&gt;
&lt;p&gt;国内拉取镜像较慢，建议配置镜像加速器。&lt;/p&gt;
&lt;h2&gt;创建配置文件&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json &amp;gt; /dev/null &amp;lt;&amp;lt;EOF
{
  &quot;registry-mirrors&quot;: [
    &quot;https://docker.mirrors.ustc.edu.cn&quot;,
    &quot;https://hub-mirror.c.163.com&quot;,
    &quot;https://mirror.ccs.tencentyun.com&quot;
  ],
  &quot;log-driver&quot;: &quot;json-file&quot;,
  &quot;log-opts&quot;: {
    &quot;max-size&quot;: &quot;100m&quot;,
    &quot;max-file&quot;: &quot;3&quot;
  }
}
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;应用配置&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl daemon-reload
sudo systemctl restart docker
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;验证配置&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;docker info | grep -A 5 &quot;Registry Mirrors&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;常用命令速查&lt;/h1&gt;
&lt;h2&gt;镜像操作&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;docker pull nginx:latest      # 拉取镜像
docker images                  # 查看本地镜像
docker rmi nginx:latest        # 删除镜像
docker build -t myapp:v1 .     # 构建镜像
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;容器操作&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;docker run -d --name web nginx             # 后台运行
docker run -it ubuntu /bin/bash            # 交互式运行
docker ps                                   # 查看运行中容器
docker ps -a                                # 查看所有容器
docker stop web                             # 停止容器
docker start web                            # 启动容器
docker rm web                               # 删除容器
docker exec -it web /bin/bash              # 进入容器
docker logs web                             # 查看日志
docker logs -f web                          # 实时查看日志
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;系统清理&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;docker system df                # 查看磁盘占用
docker system prune             # 清理未使用资源
docker system prune -a          # 清理所有未使用资源（含镜像）
docker volume prune             # 清理未使用卷
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;常见问题&lt;/h1&gt;
&lt;h2&gt;权限不足&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Got permission denied while trying to connect to the Docker daemon socket
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;解决&lt;/strong&gt;：确认用户已加入 docker 组并重新登录。&lt;/p&gt;
&lt;h2&gt;镜像下载慢&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;解决&lt;/strong&gt;：配置国内镜像加速器（见上文）。&lt;/p&gt;
&lt;h2&gt;服务无法启动&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 查看详细错误
sudo journalctl -xu docker.service

# 检查配置文件语法
sudo dockerd --validate
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>服务器配置</title><link>https://blog.homura.work/posts/tech/server/init/</link><guid isPermaLink="true">https://blog.homura.work/posts/tech/server/init/</guid><pubDate>Tue, 27 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;修改登录密码&lt;/h1&gt;
&lt;p&gt;如果你已经登录，想要修改自己的密码，只需在终端输入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo passwd user
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;开启ssh连接功能&lt;/h1&gt;
&lt;h2&gt;安装openssh&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Ubuntu / Debian:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;CentOS / RHEL / Fedora:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;sudo yum install openssh-server
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;启动并启用ssh服务&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 启动 SSH 服务
sudo systemctl start sshd

# 设置开机自启（防止重启后无法连接）
sudo systemctl enable sshd

# 再次确认状态（应显示 active (running)）
sudo systemctl status sshd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果提示没有对应服务，可以尝试运行ssh（而非sshd）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl enable --now ssh
sudo systemctl status ssh
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;验证服务状态&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 检查服务状态（应显示 active (running)）
sudo systemctl status ssh

# 检查端口监听（应看到 22 端口被 sshd 占用）
ss -ltn | grep 22
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;创建新用户（将数据盘设置为默认home路径）&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;# 1. 首先创建家目录基础路径（如果不存在）
sudo mkdir -p /mnt/data/home

# 2 修改访问权限
sudo chmod 755 /mnt/data

# 3. 创建用户并指定家目录
sudo useradd -m -d /mnt/data/home/&amp;lt;username&amp;gt; -s /bin/bash &amp;lt;username&amp;gt;

# 4. 设置用户密码
sudo passwd &amp;lt;username&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;（可选）将用户添加到sudo组&lt;/h2&gt;
&lt;p&gt;如果需要该用户有管理员权限：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo usermod -aG sudo &amp;lt;username&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;验证用户创建成功&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 查看用户信息（包括家目录位置）
id &amp;lt;username&amp;gt;
getent passwd &amp;lt;username&amp;gt;

# 查看用户家目录
ls -la /mnt/data/home/&amp;lt;username&amp;gt;

# 切换到新用户测试
su - &amp;lt;username&amp;gt;

# 查看当前路径（应该是用户家目录）
pwd

# 退出
exit
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;（可选）迁移已有用户的家目录&lt;/h2&gt;
&lt;p&gt;如果用户已经创建在默认位置，需要迁移：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 1. 创建新的家目录位置
sudo mkdir -p /mnt/data/home

# 2. 复制现有家目录内容
sudo rsync -av /home/&amp;lt;username&amp;gt;/ /mnt/data/home/&amp;lt;username&amp;gt;/

# 3. 修改用户的家目录配置
sudo usermod -d /mnt/data/home/&amp;lt;username&amp;gt; &amp;lt;username&amp;gt;

# 4. 验证修改
getent passwd &amp;lt;username&amp;gt;

# 5. 测试登录
su - &amp;lt;username&amp;gt;
pwd  # 应该显示 /mnt/data/home/username

# 6. 确认无误后，删除旧的家目录（谨慎操作！）
# sudo rm -rf /home/&amp;lt;username&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;生成ssh密钥对&lt;/h1&gt;
&lt;h2&gt;1. 在Ubuntu服务器上生成密钥对&lt;/h2&gt;
&lt;p&gt;切换到新创建的用户，然后生成密钥：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 切换到新用户
sudo su - username

# 创建.ssh目录
mkdir -p ~/.ssh
chmod 700 ~/.ssh

# 生成密钥对（不设置密码短语，直接回车）
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -C &quot;username@server&quot; -N &quot;&quot;

# 或生成RSA密钥
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -C &quot;username@server&quot; -N &quot;&quot;

# 将公钥添加到授权文件
cat ~/.ssh/id_ed25519.pub &amp;gt;&amp;gt; ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

# 查看生成的文件
ls -la ~/.ssh/
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2. 查看并保存私钥&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 显示私钥内容（需要发送给用户）
cat ~/.ssh/id_ed25519

# 或者直接将私钥复制到可下载的位置
sudo cp ~/.ssh/id_ed25519 /tmp/username_private_key
sudo chmod 644 /tmp/username_private_key

# 如果使用了自定义家目录，使用完整路径
# sudo cat /mnt/data1/home/username/.ssh/id_ed25519
# sudo cp /mnt/data1/home/username/.ssh/id_ed25519 /tmp/username_private_key
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3. 将私钥传递给用户&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 在服务器上显示
cat /tmp/username_private_key
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;⚠️ 安全提示：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;传递完私钥后，立即删除临时文件：&lt;code&gt;sudo rm /tmp/username_private_key&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;建议通过加密通道（如加密邮件、1Password、LastPass）发送私钥&lt;/li&gt;
&lt;li&gt;提醒用户妥善保管私钥，不要泄露&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;快速创建脚本&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

# 快速创建用户脚本
# 用法: ./create_user.sh username

# 配置变量
BASE_HOME_DIR=&quot;/mnt/data/home&quot;

# 检查是否提供了用户名参数
if [ -z &quot;$1&quot; ]; then
    echo &quot;错误：请提供用户名&quot;
    echo &quot;用法: $0 username&quot;
    exit 1
fi

USERNAME=$1
PASSWORD=$1
HOME_DIR=&quot;$BASE_HOME_DIR/$USERNAME&quot;
# 动态获取服务器IP地址（优先使用默认路由的源IP，否则使用hostname -I）
SERVER_IP=$(ip route get 1.1.1.1 2&amp;gt;/dev/null | awk &apos;{print $7; exit}&apos; || hostname -I | awk &apos;{print $1}&apos; || echo &quot;127.0.0.1&quot;)

# 检查是否以root权限运行
if [ &quot;$EUID&quot; -ne 0 ]; then 
    echo &quot;错误：请使用sudo运行此脚本&quot;
    exit 1
fi

# 检查用户是否已存在
if id &quot;$USERNAME&quot; &amp;amp;&amp;gt;/dev/null; then
    echo &quot;错误：用户 $USERNAME 已存在&quot;
    exit 1
fi

# 创建家目录基础路径
mkdir -p &quot;$BASE_HOME_DIR&quot;

# 创建用户并指定家目录
useradd -m -d &quot;$HOME_DIR&quot; -s /bin/bash &quot;$USERNAME&quot;

# 设置密码（密码与用户名相同）
echo &quot;$USERNAME:$PASSWORD&quot; | chpasswd

# 切换到新用户并创建SSH密钥
su - &quot;$USERNAME&quot; &amp;lt;&amp;lt; &apos;EOF&apos;
mkdir -p ~/.ssh
chmod 700 ~/.ssh
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -C &quot;$USERNAME@server&quot; -N &quot;&quot;
cat ~/.ssh/id_ed25519.pub &amp;gt;&amp;gt; ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
EOF

# 获取私钥内容
PRIVATE_KEY=$(cat &quot;$HOME_DIR/.ssh/id_ed25519&quot;)

# 输出结果
echo &quot;&quot;
echo &quot;======================================&quot;
echo &quot;用户创建成功！&quot;
echo &quot;======================================&quot;
echo &quot;&quot;
echo &quot;服务器IP：$SERVER_IP&quot;
echo &quot;账号：$USERNAME&quot;
echo &quot;密码：$PASSWORD&quot;
echo &quot;&quot;
echo &quot;======================================&quot;
echo &quot;私钥内容（保存为文件后需修改权限）：&quot;
echo &quot;======================================&quot;
echo &quot;$PRIVATE_KEY&quot;
echo &quot;======================================&quot;
echo &quot;&quot;
echo &quot;【Windows 用户】保存私钥后，在 PowerShell 中执行以下命令修复权限：&quot;
echo &apos;（将 &amp;lt;密钥路径&amp;gt; 替换为实际路径，如 C:\Users\你的用户名\.ssh\id_ed25519）&apos;
echo &quot;&quot;
echo &apos;icacls &quot;&amp;lt;密钥路径&amp;gt;&quot; /inheritance:r&apos;
echo &apos;icacls &quot;&amp;lt;密钥路径&amp;gt;&quot; /grant:r &quot;$env:UserName:F&quot;&apos;
echo &quot;&quot;
echo &quot;【Linux/macOS 用户】保存私钥后执行：&quot;
echo &apos;chmod 600 &amp;lt;密钥路径&amp;gt;&apos;
echo &quot;&quot;
echo &quot;======================================&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;取消账号密码连接&lt;/h1&gt;
&lt;p&gt;要只允许密钥连接并关闭密码登录，你需要修改 SSH 服务端的主配置文件 &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;⚠️ &lt;strong&gt;极重要警告&lt;/strong&gt;： 在执行下面操作之前，请务必确认你已经配置好了 SSH 公钥/私钥，并且当前已经能够使用密钥成功登录。 如果你还没有配置好密钥就关闭了密码登录，你将被锁在服务器外面，无法远程连接！&lt;/p&gt;
&lt;h2&gt;1. 编辑 SSH 配置文件&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo vim /etc/ssh/sshd_config
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2. 修改关键参数&lt;/h2&gt;
&lt;p&gt;在文件中找到以下参数并进行修改（如果找不到，可以在文件末尾添加）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;必须修改项&lt;/strong&gt;： 找到 PasswordAuthentication，将其改为 no：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PasswordAuthentication no
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;检查确认项&lt;/strong&gt;： 确保公钥验证是开启的（通常默认是开启的，但最好检查一下）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PubkeyAuthentication yes
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3. 检查语法是否正确&lt;/h2&gt;
&lt;p&gt;为了防止配置文件写错导致 SSH 服务启动失败，先运行测试命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo sshd -t
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;如果不显示任何输出，说明配置文件语法正确。&lt;/li&gt;
&lt;li&gt;如果报错，请重新打开文件检查拼写。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;4. 重启 SSH 服务&lt;/h2&gt;
&lt;p&gt;使配置生效：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart ssh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(注意：在某些发行版中，服务名可能是 &lt;code&gt;sshd&lt;/code&gt;，命令为 &lt;code&gt;sudo systemctl restart sshd&lt;/code&gt;)&lt;/p&gt;
&lt;h1&gt;密钥权限修改&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;# 1. 禁用权限继承并删除所有已继承的权限
icacls &quot;D:\Archive\Passkey\Pro6000\Pro6000&quot; /inheritance:r

# 2. 为当前用户添加显式的“完全控制”权限
# 注意：$env:UserName 会自动获取你当前的用户名
icacls &quot;D:\Archive\Passkey\Pro6000\Pro6000&quot; /grant:r &quot;${env:UserName}:F&quot;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>LLM Agent资料收集</title><link>https://blog.homura.work/posts/study/paper/agent/</link><guid isPermaLink="true">https://blog.homura.work/posts/study/paper/agent/</guid><pubDate>Wed, 21 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Agent 综述&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;[2025] Huang, Y., Li, S., Liu, M., Liu, W., Huang, S., Fan, Z., ... &amp;amp; Fung, Y. R. (2025). &amp;lt;a href=&quot;https://arxiv.org/pdf/2511.09586&quot;&amp;gt;&amp;lt;i&amp;gt;Environment Scaling for Interactive Agentic Experience Collection: A Survey&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;. arXiv preprint arXiv:2511.09586.
本文从以环境为中心的视角综述了智能体通过与环境交互进行强化学习的方法，提出了生成-执行-反馈(GEF)循环框架，系统回顾了环境扩展在任务生成、执行和反馈各阶段的代表性方法。&lt;/li&gt;
&lt;li&gt;[2025] Cemri, M., Pan, M. Z., Yang, S., Agrawal, L. A., Chopra, B., Tiwari, R., ... &amp;amp; Stoica, I. (2025). &amp;lt;a href=&quot;https://arxiv.org/pdf/2503.13657&quot;&amp;gt;&amp;lt;i&amp;gt;Why do multi-agent llm systems fail?&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;. arXiv preprint arXiv:2503.13657. [&amp;lt;a href=&quot;https://github.com/multi-agent-systems-failure-taxonomy/MAST/tree/main&quot;&amp;gt;Dataset&amp;lt;/a&amp;gt;]
本文通过构建包含 1600+ 标注轨迹的 MAST-Data 数据集和首个多智能体系统失败分类法(MAST)，系统分析了多智能体 LLM 系统的失败模式，识别出 14 种失败类型（分为系统设计、智能体间失配、任务验证三类），并为未来 MAS 研究提供了明确路线图。&lt;/li&gt;
&lt;li&gt;[2025]Gao, H. A., Geng, J., Hua, W., Hu, M., Juan, X., Liu, H., ... &amp;amp; Wang, M. (2025). &amp;lt;a href=&quot;https://openreview.net/pdf?id=CTr3bovS5F&quot;&amp;gt;&amp;lt;i&amp;gt;A Survey of Self-Evolving Agents: On Path to Artificial Super Intelligence&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;. Transactions on Machine Learning Research (TMLR). [&amp;lt;a href=&quot;https://github.com/CharlesQ9/Self-Evolving-Agents&quot;&amp;gt;Code&amp;lt;/a&amp;gt;]
本文对自我进化智能体（Self-Evolving Agents）进行了系统全面的综述，围绕“进化什么、何时进化、如何进化”三个核心维度构建了研究框架。文章系统回顾了智能体各组件（模型、记忆、工具、架构）的进化机制，按阶段分类了适配方法，并探讨了通往人工超智能（ASI）的自主进化路径。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Memory Bank相关&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;[2025] Ouyang, S., Yan, J., Hsu, I., Chen, Y., Jiang, K., Wang, Z., ... &amp;amp; Pfister, T. (2025). &amp;lt;a href=&quot;https://arxiv.org/pdf/2509.25140&quot;&amp;gt;&amp;lt;i&amp;gt;Reasoningbank: Scaling agent self-evolving with reasoning memory&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;. arXiv preprint arXiv:2509.25140.
本文提出 ReasoningBank 记忆框架，从智能体的成功和失败经验中提炼可泛化的推理策略，并引入记忆感知测试时扩展(MaTTS)方法，通过为每个任务分配更多计算资源生成丰富对比信号来合成高质量记忆，实现智能体的自我进化。&lt;/li&gt;
&lt;li&gt;[2025] Cai, Y., Cai, S., Shi, Y., Xu, Z., Chen, L., Qin, Y., ... &amp;amp; Sun, X. (2025). &amp;lt;a href=&quot;https://arxiv.org/pdf/2510.08191&quot;&amp;gt;&amp;lt;i&amp;gt;Training-free group relative policy optimization&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;. arXiv preprint arXiv:2510.08191. [&amp;lt;a href=&quot;https://github.com/TencentCloudADP/youtu-agent/tree/training_free_GRPO&quot;&amp;gt;Code&amp;lt;/a&amp;gt;]
本文提出无训练的组相对策略优化(Training-Free GRPO)方法，通过将经验知识作为 token 先验学习而非参数更新，在数十个训练样本下即可显著提升 LLM 智能体在数学推理和网络搜索等任务的域外性能。&lt;/li&gt;
&lt;li&gt;[2025] Zhou, H., Chen, Y., Guo, S., Yan, X., Lee, K. H., Wang, Z., ... &amp;amp; Wang, J. (2025). &amp;lt;a href=&quot;https://arxiv.org/pdf/2508.16153&quot;&amp;gt;&amp;lt;i&amp;gt;Memento: Fine-tuning llm agents without fine-tuning llms&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;. arXiv preprint arXiv:2508.16153. [&amp;lt;a href=&quot;https://github.com/Agent-on-the-Fly/Memento&quot;&amp;gt;Code&amp;lt;/a&amp;gt;]
本文提出 Memento 框架，通过引入记忆增强的马尔可夫决策过程 (M-MDP) 和案例选择策略，实现了无需微调底层大语言模型即可进行在线强化学习和持续自适应。通过在情境记忆中存储和重写过去经验，Memento 在 GAIA 和 DeepResearcher 等深度研究基准测试中表现出色，在保持低成本的同时显著提升了智能体的域外泛化能力。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>VKG资料收集</title><link>https://blog.homura.work/posts/study/paper/vkg/</link><guid isPermaLink="true">https://blog.homura.work/posts/study/paper/vkg/</guid><pubDate>Sat, 17 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;VKG 基础&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;[2024] Xiao, G. (2024). &amp;lt;a href=&quot;/papers/vkg/Xiao - Introduction to Virtual Knowledge Graphs.pdf&quot;&amp;gt;&amp;lt;i&amp;gt;1. Introduction to Virtual Knowledge Graphs&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;. University of Bergen, Norway.&lt;/li&gt;
&lt;li&gt;[2024] Xiao, G. (2024). &amp;lt;a href=&quot;/papers/vkg/Xiao - Virtual Knowledge Graphs Query Processing.pdf&quot;&amp;gt;&amp;lt;i&amp;gt;2. Virtual Knowledge Graphs Query Processing&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;. University of Bergen, Norway.&lt;/li&gt;
&lt;li&gt;[2024] Calvanese, D., &amp;amp; Lanti, D. (2024). &amp;lt;a href=&quot;/papers/vkg/tutorial-design-vkg.pdf&quot;&amp;gt;&amp;lt;i&amp;gt;Designing Virtual Knowledge Graphs&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;. Tutorial at the 36th Int. Conf. on Advanced Information Systems Engineering (CAiSE 2024), Limassol, Cyprus.&lt;/li&gt;
&lt;li&gt;[2019] Xiao, G., Ding, L., Cogrel, B., &amp;amp; Calvanese, D. (2019). &amp;lt;a href=&quot;https://direct.mit.edu/dint/article-pdf/1/3/201/683759/dint_a_00011.pdf&quot;&amp;gt;&amp;lt;i&amp;gt;Virtual knowledge graphs: An overview of systems and use cases&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;. Data Intelligence, 1(3), 201-223.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;VKG 构造 (VKG Generation / Mapping Generation)&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;[2017] Pinkel, C., Binnig, C., Jimenez-Ruiz, E., Kharlamov, E., May, W., Nikolov, A., ... &amp;amp; Horrocks, I. (2017). &amp;lt;a href=&quot;http://www.semantic-web-journal.net/system/files/swj1439.pdf&quot;&amp;gt;&amp;lt;i&amp;gt;RODI: Benchmarking Relational-to-Ontology Mapping Generation Quality&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;. Semantic Web Journal. IOS Press.
RODI 是一个关系到本体映射生成质量的基准测试，包含科学会议、地理数据和油气勘探等领域的测试场景，通过评估系统处理关系模式和本体特性的能力以及映射在查询回答中的表现，对七个映射生成系统进行了综合评估。&lt;/li&gt;
&lt;li&gt;[2025] Xiao, G., Ren, L., Qi, G., Xue, H., Panfilo, M. D., &amp;amp; Lanti, D. (2025, August). &amp;lt;a href=&quot;https://www.ijcai.org/proceedings/2025/0525.pdf&quot;&amp;gt;&amp;lt;i&amp;gt;LLM4VKG: Leveraging large language models for virtual knowledge graph construction&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;. In Proceedings of the 34th International Joint Conference on Artificial Intelligence (IJCAI).
LLM4VKG 利用大语言模型自动化 VKG 构建过程，包括本体开发、模式分析和映射创建，有效解决命名歧义和匹配问题。&lt;/li&gt;
&lt;li&gt;[2025] Kosten, C., Lanti, D., Cudré-Mauroux, P., &amp;amp; Stockinger, K. (2025, June). &amp;lt;a href=&quot;https://digitalcollection.zhaw.ch/server/api/core/bitstreams/0d11c310-c829-4f58-9a02-2021840f4604/content&quot;&amp;gt;&amp;lt;i&amp;gt;Bootstrapping Text-to-SQL Resources for Knowledge Graph Question Answering&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;. In 2025 IEEE Swiss Conference on Data Science (SDS) (pp. 8-15). IEEE.
本文展示如何将数据库社区现有的 SQL 和关系数据库资源转换为 SPARQL 和知识图谱问答（KGQA）基准测试，通过扩展 Ontop VKG 系统的 bootstrapper 开发 MPBoot 工具，利用 R2RML 的灵活性克服 Direct Mapping 的局限性，基于查询负载分析学习 KG 的丰富模式信息，创建了目前规模最大且最复杂的 KGQA 基准测试，并演示了该方法在 ScienceBenchmark 数据集上的应用。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;VKG 问答&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;[2025] Feng, Y., Zhang, P., Xiao, G., Ding, L., &amp;amp; Meng, L. (2025). &amp;lt;a href=&quot;https://arxiv.org/pdf/2503.14251&quot;&amp;gt;&amp;lt;i&amp;gt;Towards a Barrier-free GeoQA Portal: Natural Language Interaction with Geospatial Data Using Multi-Agent LLMs and Semantic Search&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;. International Journal of Applied Earth Observation and Geoinformation.
提出一个无障碍地理问答门户，通过多智能体 LLM 框架实现自然语言交互，将复杂查询分解为子任务并分配给不同智能体处理,支持默认和自定义数据输入,并基于语义搜索提高数据检索的容错性,降低非专家用户使用地理信息门户的门槛。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;VKG 应用&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;[2015] Lanti, D., Rezk, M. I., Xiao, G., &amp;amp; Calvanese, D. (2015). &amp;lt;a href=&quot;https://bia.unibz.it/esploro/fulltext/conferenceProceeding/The-NPD-benchmark-Reality-check-for/991005773114601241?repId=12235330170001241&amp;amp;mId=13235268350001241&amp;amp;institution=39UBZ_INST&quot;&amp;gt;&amp;lt;i&amp;gt;The NPD benchmark: Reality check for OBDA systems&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;. In Advances in database technology-EDBT 2015: 18th International Conference on Extending Database Technology, Brussels, Belgium, March 23-27, 2015, proceedings (pp. 617-628). University of Konstanz, University Library.
NPD 基准测试基于挪威石油管理局（NPD）的真实石油工业数据，专门针对 OBDA 系统的性能评估需求设计，提供可扩展的数据集生成技术，用于验证 OBDA 系统在工业环境中的实际表现。&lt;/li&gt;
&lt;li&gt;[2016] Brüggemann, S., Bereta, K., Xiao, G., &amp;amp; Koubarakis, M. (2016, May). &amp;lt;a href=&quot;https://pdfs.semanticscholar.org/4940/66c67a23d04661825e68f249b9038725d518.pdf&quot;&amp;gt;&amp;lt;i&amp;gt;Ontology-based data access for maritime security&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;. In European Semantic Web Conference (pp. 741-757). Cham: Springer International Publishing.
VKG 在海事安全领域的应用，通过本体数据访问技术整合实时和静态船舶数据，用于异常行为检测和可疑船只追踪。&lt;/li&gt;
&lt;li&gt;[2016] Calvanese, D., Liuzzo, P., Mosca, A., Remesal, J., Rezk, M., &amp;amp; Rull, G. (2016). &amp;lt;a href=&quot;https://www.researchgate.net/profile/Alessandro-Mosca/publication/295844702_Ontology-based_data_integration_in_EPNet_Production_and_distribution_of_food_during_the_Roman_Empire/links/60675063a6fdccad3f69775d/Ontology-based-data-integration-in-EPNet-Production-and-distribution-of-food-during-the-Roman-Empire.pdf&quot;&amp;gt;&amp;lt;i&amp;gt;Ontology-based data integration in EPNet: Production and distribution of food during the Roman Empire&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;. Engineering Applications of Artificial Intelligence, 51, 212-229.
VKG 在历史研究领域的应用，通过本体数据访问技术整合罗马帝国时期食品生产和商业贸易的分散数据源，为学者提供统一的概念视图和访问入口。&lt;/li&gt;
&lt;li&gt;[2017] Kharlamov, E., Hovland, D., Skjæveland, M. G., Bilidas, D., Jiménez-Ruiz, E., Xiao, G., ... &amp;amp; Waaler, A. (2017). &amp;lt;a href=&quot;https://ora.ox.ac.uk/objects/uuid:c077fe8d-7517-4a4c-b6a1-a87f517f91d6/files/mb397af762843355a7db3173cd2bc61b5&quot;&amp;gt;&amp;lt;i&amp;gt;Ontology based data access in Statoil&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;. Journal of Web Semantics, 44, 3-36.
VKG 在石油工业的应用，在挪威国家石油公司（Statoil）部署 OBDA 系统，通过半自动生成本体和映射、优化查询处理以及为工程师提供友好的查询构建界面，解决数据密集型企业的数据访问挑战。&lt;/li&gt;
&lt;li&gt;[2017] Kharlamov, E., Mailis, T., Mehdi, G., Neuenstadt, C., Özçep, Ö., Roshchin, M., ... &amp;amp; Waaler, A. (2017). &amp;lt;a href=&quot;https://papers.ssrn.com/sol3/Delivery.cfm?abstractid=3199299&quot;&amp;gt;&amp;lt;i&amp;gt;Semantic access to streaming and static data at Siemens&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;. Journal of Web Semantics, 44, 54-74.
VKG 在西门子能源的应用，通过 Optique 平台实现对流式和静态数据的统一语义访问，包括本体和映射自动生成（BootOX）、流式查询语言（STARQL）、高性能后端（ExaStream）以及可视化查询构建界面（OptiqueVQS）。&lt;/li&gt;
&lt;li&gt;[2018] Güzel Kalayci, E., Xiao, G., Ryzhikov, V., Kalayci, T. E., &amp;amp; Calvanese, D. (2018, October). &amp;lt;a href=&quot;https://dl.acm.org/doi/pdf/10.1145/3269206.3269230&quot;&amp;gt;&amp;lt;i&amp;gt;Ontop-temporal: a tool for ontology-based query answering over temporal data&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;. In Proceedings of the 27th ACM International Conference on Information and Knowledge Management (pp. 1927-1930).
VKG 在医疗时序数据中的应用，Ontop-temporal 扩展支持时间戳日志数据查询，通过有效时间映射和基于度量时态逻辑的规则，应用于 MIMIC-III 重症监护数据集，用于临床试验患者筛选。&lt;/li&gt;
&lt;li&gt;[2019] Kharlamov, E., Mehdi, G., Savković, O., Xiao, G., Kalaycı, E. G., &amp;amp; Roshchin, M. (2019). &amp;lt;a href=&quot;https://papers.ssrn.com/sol3/Delivery.cfm?abstractid=3281719&quot;&amp;gt;&amp;lt;i&amp;gt;Semantically-enhanced rule-based diagnostics for industrial Internet of Things: The SDRL language and case study for Siemens trains and turbines&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;. Journal of web semantics, 56, 11-29.
VKG 在工业物联网诊断中的应用，提出语义诊断规则语言（SDRL），通过本体中介传感器信号和诊断规则，简化规则编写和维护，应用于西门子列车和涡轮机的故障诊断。&lt;/li&gt;
&lt;li&gt;[2020] Chaves-Fraga, D., Priyatna, F., Cimmino, A., Toledo, J., Ruckhaus, E., &amp;amp; Corcho, O. (2020). &amp;lt;a href=&quot;https://www.sciencedirect.com/science/article/pii/S1570826820300354&quot;&amp;gt;&amp;lt;i&amp;gt;GTFS-Madrid-Bench: A benchmark for virtual knowledge graph access in the transport domain&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;. Journal of Web Semantics, 65, 100596.
GTFS-Madrid-Bench 是一个 VKG 访问引擎的综合基准测试，基于马德里地铁 GTFS 数据，涵盖多种数据格式（CSV、JSON、SQL、XML）和 SPARQL 1.1 查询特性，用于评估不同 OBDI 引擎的查询能力、性能和可扩展性。&lt;/li&gt;
&lt;li&gt;[2020] Kalaycı, E. G., Grangel González, I., Lösch, F., Xiao, G., ul-Mehdi, A., Kharlamov, E., &amp;amp; Calvanese, D. (2020, November). &amp;lt;a href=&quot;http://www.ghxiao.org/publications/2020-iswc-bosch.pdf&quot;&amp;gt;&amp;lt;i&amp;gt;Semantic integration of Bosch manufacturing data using virtual knowledge graphs&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;. In International Semantic Web Conference (pp. 464-481). Cham: Springer International Publishing.
VKG 在博世制造业的应用，通过 SIB 框架语义集成表面贴装工艺（SMT）流水线的异构机器数据，开发 SMT 本体和映射，支持产品质量分析任务的 SPARQL 查询。&lt;/li&gt;
&lt;li&gt;[2021] Calvanese, D., Lanti, D., De Farias, T. M., Mosca, A., &amp;amp; Xiao, G. (2021). &amp;lt;a href=&quot;https://www.sciencedirect.com/science/article/pii/S2666389921002014&quot;&amp;gt;&amp;lt;i&amp;gt;Accessing scientific data through knowledge graphs with Ontop&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;. Patterns, 2(10).
VKG 在科学数据访问中的应用教程，展示如何使用 Ontop 系统通过本体提供的概念视图访问关系数据库中的遗留数据，并整合来自不同异构生物医学资源的领域知识，使用户无需了解底层存储细节即可获得更丰富的查询结果。&lt;/li&gt;
&lt;li&gt;[2022] Xiao, G., Pfaff, E., Prud&apos;hommeaux, E., Booth, D., Sharma, D. K., Huo, N., ... &amp;amp; Jiang, G. (2022). &amp;lt;a href=&quot;https://www.sciencedirect.com/science/article/pii/S1532046422002064&quot;&amp;gt;&amp;lt;i&amp;gt;FHIR-Ontop-OMOP: Building clinical knowledge graphs in FHIR RDF with the OMOP Common data Model&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;. Journal of biomedical informatics, 134, 104201.
VKG 在临床数据标准化中的应用，FHIR-Ontop-OMOP 系统将基于 OMOP CDM 的关系数据库暴露为符合 FHIR RDF 规范的虚拟临床知识图谱，实现 FHIR 与 OMOP CDM 的互操作性，为可解释的医疗 AI 应用提供语义基础。&lt;/li&gt;
&lt;li&gt;[2022] Xiong, J., Xiao, G., Kalayci, T. E., Montali, M., Gu, Z., &amp;amp; Calvanese, D. (2022, October). &amp;lt;a href=&quot;https://link.springer.com/content/pdf/10.1007/978-3-031-27815-0_34.pdf&quot;&amp;gt;&amp;lt;i&amp;gt;A virtual knowledge graph based approach for object-centric event logs extraction&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;. In International Conference on Process Mining (pp. 466-478). Cham: Springer Nature Switzerland.
VKG 在流程挖掘中的应用，通过 OnProm 系统利用 VKG 方法从关系数据库中提取对象中心事件日志（OCEL），解决传统 XES 格式的收敛和发散问题，支持一个事件关联多个对象，实现可扩展的 OCEL 日志提取。&lt;/li&gt;
&lt;li&gt;[2025] Ding, L., Xiao, G., Pano, A., Fumagalli, M., Chen, D., Feng, Y., ... &amp;amp; Meng, L. (2025). &amp;lt;a href=&quot;https://www.tandfonline.com/doi/pdf/10.1080/10095020.2024.2337360&quot;&amp;gt;&amp;lt;i&amp;gt;Integrating 3D city data through knowledge graphs&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;. Geo-Spatial Information Science, 28(2), 780-799.
VKG 在 3D 城市数据集成中的应用，通过 CityGML-KG 框架将 3DCityDB 中的 CityGML 数据暴露为知识图谱，弥合 CityGML 语义与关系数据库模式的差距，并支持与 OpenStreetMap 等其他空间数据源的集成查询。&lt;/li&gt;
&lt;li&gt;[2025] Xiao, G., Sathalingam, D., Pano, A., Feng, Y., &amp;amp; Ding, L. (2025). &amp;lt;a href=&quot;https://www.tandfonline.com/doi/pdf/10.1080/17538947.2025.2528703&quot;&amp;gt;&amp;lt;i&amp;gt;ATKIS-DLM-KG: a unified knowledge graph framework for integrating and querying fragmented topographic-cartographic data in the German digital landscape model&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;. International Journal of Digital Earth, 18(1), 2528703.
VKG 在德国地形数据集成中的应用，通过 ATKIS-DLM-KG 框架将 ATKIS 数字景观模型（DLM）中按主题和几何类型分散的 Shapefile 数据集成为统一的知识图谱，支持跨主题的语义查询和关联分析。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;VKG 公开资源&lt;/h1&gt;
&lt;h2&gt;ontop&lt;/h2&gt;
&lt;p&gt;::github{repo=&quot;ontop/ontop&quot;}
:::note
最先进的VKG系统Ontop，官网为&lt;a href=&quot;https://ontop-vkg.org/&quot;&gt;https://ontop-vkg.org/&lt;/a&gt;，&amp;lt;a href=&quot;/docs/Introduction-Ontop.pdf&quot;&amp;gt;&amp;lt;i&amp;gt;Ontop 完整文档&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;。
:::&lt;/p&gt;
&lt;h2&gt;LLM4VKG&lt;/h2&gt;
&lt;p&gt;::github{repo=&quot;HomuraT/LLM4VKG&quot;}
:::note
IJCAI2025论文LLM4VKG: Leveraging large language models for virtual knowledge graph construction的仓库
:::&lt;/p&gt;
&lt;h2&gt;GeoQA&lt;/h2&gt;
&lt;p&gt;::github{repo=&quot;nitpicker55555/Geo-QA-Paper&quot;}
:::note
论文Towards a Barrier-free GeoQA Portal: Natural Language Interaction with Geospatial Data Using Multi-Agent LLMs and Semantic Search的仓库
:::&lt;/p&gt;
&lt;h2&gt;公开VKG&lt;/h2&gt;
&lt;h3&gt;BGEE&lt;/h3&gt;
&lt;p&gt;::github{repo=&quot;ontop/ontop-patterns-tutorial&quot;}&lt;/p&gt;
&lt;h3&gt;DEST&lt;/h3&gt;
&lt;p&gt;::github{repo=&quot;ontopic-vkg/destination-tutorial&quot;}&lt;/p&gt;
&lt;h3&gt;NPD&lt;/h3&gt;
&lt;p&gt;::github{repo=&quot;ontop/npd-benchmark&quot;}&lt;/p&gt;
&lt;h3&gt;Südtirol&lt;/h3&gt;
&lt;p&gt;::github{repo=&quot;dinglinfang/suedTirolOpenDataOBDA&quot;}&lt;/p&gt;
&lt;h3&gt;ATKIS&lt;/h3&gt;
&lt;p&gt;::github{repo=&quot;apano-on/atkis&quot;}&lt;/p&gt;
</content:encoded></item><item><title>歌曲视频收藏</title><link>https://blog.homura.work/posts/hmt/playlist/</link><guid isPermaLink="true">https://blog.homura.work/posts/hmt/playlist/</guid><description>个人喜爱的歌单收藏</description><pubDate>Wed, 14 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;GODDESS OF VICTORY: NIKKE&lt;/h2&gt;
&lt;p&gt;&amp;lt;img src=&quot;/images/hmt/playlist/nikke-nearly-white.png&quot; style=&quot;height: 200px; width: auto;&quot;&amp;gt;&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=dJuvCEdXP4k&amp;amp;list=RDMM&quot;&gt;NIKKE - Nearly White&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&amp;lt;img src=&quot;/images/hmt/playlist/nikke-Hurricanes.png&quot; style=&quot;height: 200px; width: auto;&quot;&amp;gt;&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=dYNJMVh2LSQ&amp;amp;list=RDdYNJMVh2LSQ&amp;amp;start_radio=1&amp;amp;rv=fs798xDXm0o&quot;&gt;NIKKE - Hurricanes (3rd Anniv Main Theme)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&amp;lt;img src=&quot;/images/hmt/playlist/nikke-Unbreakable-Sphere.png&quot; style=&quot;height: 200px; width: auto;&quot;&amp;gt;&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=FopHtdnCLg4&amp;amp;list=RDFopHtdnCLg4&amp;amp;start_radio=1&quot;&gt;NIKKE - Unbreakable Sphere&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&amp;lt;img src=&quot;/images/hmt/playlist/nikke-Unbreakable (Old Tales).png&quot; style=&quot;height: 200px; width: auto;&quot;&amp;gt;&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=FopHtdnCLg4&amp;amp;list=RDFopHtdnCLg4&amp;amp;start_radio=1&quot;&gt;NIKKE - Unbreakable (Old Tales)&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&amp;lt;img src=&quot;/images/hmt/playlist/nikke-Rising Higher.png&quot; style=&quot;height: 200px; width: auto;&quot;&amp;gt;&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=6wt5_a7vT7M&amp;amp;list=RDCVVUjePzG0I&amp;amp;index=3&quot;&gt;NIKKE - Rising Higher&lt;/a&gt;&lt;/h3&gt;
</content:encoded></item><item><title>东南大学因公出国报销流程</title><link>https://blog.homura.work/posts/seu/20251213_%E5%9B%A0%E5%85%AC%E5%87%BA%E5%9B%BD%E6%8A%A5%E9%94%80/</link><guid isPermaLink="true">https://blog.homura.work/posts/seu/20251213_%E5%9B%A0%E5%85%AC%E5%87%BA%E5%9B%BD%E6%8A%A5%E9%94%80/</guid><pubDate>Sat, 13 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;流程&lt;/h1&gt;
&lt;h2&gt;收到论文录用邮件后&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;签证&lt;/strong&gt;：有些国家的签证办理周期很长，需要尽快。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;邀请信&lt;/strong&gt;：有的会议可以直接在投稿论文的网站中下载邀请信，否则需要向大会秘书发送邮件索要邀请信。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;学校系统&lt;/strong&gt;：注意在下图两个地方都要申请：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/%E5%87%BA%E5%9B%BD%E5%89%8D-%E5%AD%A6%E6%A0%A1%E7%B3%BB%E7%BB%9F%E7%94%B3%E8%AF%B7.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;先进入&lt;a href=&quot;https://ehall.seu.edu.cn/new/index.html&quot;&gt;【东南大学-综合服务大厅】&lt;/a&gt;中的【研究生国际交流】，选择【研究生参加顶级国际学术会】，在会议名称下拉列表中，可以看到各个学院所规定的顶级学术会议列表，从而知道自己参加的会议是不是顶会。
&lt;img src=&quot;./images/%E5%87%BA%E5%9B%BD%E5%89%8D-%E5%AD%A6%E6%A0%A1%E7%B3%BB%E7%BB%9F%E7%94%B3%E8%AF%B7%E9%A1%B6%E4%BC%9A%E6%8A%A5%E9%94%80.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;同时要在&lt;a href=&quot;https://i.seu.edu.cn/default/index.html#/itemDetail?wid=913100035107135488&quot;&gt;【学生因公出国(境)申请】&lt;/a&gt;中提交申请，这个是国际合作处的，先仔细看一下官网的&lt;a href=&quot;https://oic.seu.edu.cn/12540/list.htm&quot;&gt;【出国申报说明】&lt;/a&gt;说明，学校对离境和入境时间有严格限制，离境时间可以提前一天，入境时间不能延后。比如会议日程是11号到15号共5天，则要求最早10号离境，最晚15号入境。在系统中填写出发和返回时间时也能看到相应的时间限制。没提前申请或没按照规定时限出入境都会遭到领导的亲切问候。&lt;/p&gt;
&lt;p&gt;提交以上两个申请后需要提醒导师及学院领导审核。校级领导一般会在三个工作日内完成审核而不需提醒。总之在出境前一定要完成两个系统的所有审核流程。&lt;/p&gt;
&lt;h3&gt;学生相关签证材料&lt;/h3&gt;
&lt;p&gt;在&lt;a href=&quot;https://ehall.seu.edu.cn/new/index.html&quot;&gt;【综合服务大厅】&lt;/a&gt;搜索【研究生证明打印申请】，进入申请可获得【东南大学研究生在读证明】。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://i.seu.edu.cn/default/index.html#/itemDetail?wid=913100035107135488&quot;&gt;【学生因公出国（境）申报审批】&lt;/a&gt;通过后可以在&lt;a href=&quot;https://oic.seu.edu.cn/lxwm/list.htm&quot;&gt;【四牌楼老图书馆国际合作处】&lt;/a&gt;获得两个材料【事业单位法人证书】和【资助证明】。&lt;/p&gt;
&lt;p&gt;在&lt;a href=&quot;https://www.chsi.com.cn/&quot;&gt;【学信网】&lt;/a&gt;可以打印【学籍在线验证报告】。&lt;/p&gt;
&lt;h2&gt;准备行程&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;机票&lt;/strong&gt;：按照国际合作处登记的出入境时间购买机票。一次性购买往返机票可以省钱，不必分开购买。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;酒店&lt;/strong&gt;：可以在booking.com等网站或携程等软件预定，可以根据预算选择酒店档次，不同国家地区的标准可参考&lt;a href=&quot;https://mp.weixin.qq.com/s/82U9kLYM_YEaI6eyWHc-Rg&quot;&gt;【因公临时出国——各国家和地区住宿费、伙食费、公杂费开支标准表】&lt;/a&gt;。&lt;/p&gt;
&lt;h2&gt;参会&lt;/h2&gt;
&lt;p&gt;在国外注意保存好充值公交卡的收据，进行演讲前需找人帮忙拍照，报销要用。&lt;/p&gt;
&lt;h2&gt;回国后材料准备&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;总结材料&lt;/strong&gt;：进入学校系统，在【研究生国际交流】中提交总结材料，提交即可，学校领导会在之后给纸质材料盖章时现场审核（没有申请可以跳过）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;批件&lt;/strong&gt;：前往&lt;a href=&quot;https://oic.seu.edu.cn/lxwm/list.htm&quot;&gt;【国际合作处办公室】&lt;/a&gt;，领导会现场打印【《东南大学出国、赴港澳任务批件》】、【《因公临时出国（境）任务和财务核算审批意见表》】，称这俩文件为【批件】。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;报销单&lt;/strong&gt;：登录&lt;a href=&quot;https://caiwuchujf.seu.edu.cn/&quot;&gt;【东南大学-财务处】&lt;/a&gt;，申请报销单，业务大类选择【因公出国】，项目号和负责人根据学院老师公布的信息填写（&lt;strong&gt;如果是走导师的项目，需要填写导师的项目号和上传发票&lt;/strong&gt;）。
&lt;img src=&quot;./images/%E6%8A%A5%E9%94%80-%E7%B1%BB%E5%9E%8B%E9%80%89%E6%8B%A9.png&quot; alt=&quot;&quot; /&gt;
之后页面就与日常报销业务一样了，完成后打印报销单。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如需要填写经费使用计划，按要求填写即可&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;其他报销材料&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;报销单中每项支出的发票或收据和大额支出的支付记录。有发票最好，没有发票就用收据，保险起见可以把所有超过1000的支出项的支付记录都打印出来，火车票可以去火车站打印报销凭证。&lt;/li&gt;
&lt;li&gt;护照人像页复印件；&lt;/li&gt;
&lt;li&gt;出入境记录（支付宝搜出入境小程序可打印）。&lt;/li&gt;
&lt;li&gt;如果实际出入境天数超出了申请天数，需要写一个实际在外天数超批件天数说明，说明为何超出了申请天数，然后道歉之类的话，然后准备好挨骂，找国际合作处领导签字盖章。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;签字盖章提交&lt;/h2&gt;
&lt;p&gt;至此，手中应当有：&lt;strong&gt;两个【批件】、【报销单】、【经费使用计划】（可选）&lt;/strong&gt;，和上面列出的其他报销材料，如：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;【来回机票费】的【支付记录】、【发票】、【出行单】。&lt;/li&gt;
&lt;li&gt;【酒店费】的【支付记录】、【发票】、【酒店水单】、【入住证明】。&lt;/li&gt;
&lt;li&gt;【签证费】的【支付记录】、【税务发票收据】。&lt;/li&gt;
&lt;li&gt;【会议注册费】的【支付记录】、【邀请函】、【收据】、【收费标准】、【会议日程】。&lt;/li&gt;
&lt;li&gt;【护照】的【照片页】、&lt;a href=&quot;https://s.nia.gov.cn/mps/main.html&quot;&gt;【出入境证明】&lt;/a&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;下方为申请了学校报销的一些流程：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;报销单和经费使用计划需要先找导师和学院领导签字，然后把所有这些材料拿到研究生院管理国际会议的办公室，由相关老师签字盖章，同时他也会审核学校系统中提交的总结材料。牌区地址为逸夫建筑馆107，之后老师还会提示到108找报销单项目负责人签字，再到204盖研究生院章。&lt;/p&gt;
&lt;p&gt;至此，把所有材料用夹子或别针夹在一起，投递到【自助提交报销单】的机器内，之后财务处可能会发短信提示补充缺失的材料，所有材料补齐后，银行卡会在1-2个工作日内收到报销经费。&lt;/p&gt;
&lt;h1&gt;参考资料&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.csdn.net/weixin_44226356/article/details/143359813&quot;&gt;CSDN-含泪总结东南大学国际顶会报销流程&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://seugs.seu.edu.cn/28558/list.htm&quot;&gt;东南大学-关于研究生出国（境）参加国际会议申请资助的通知&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://i.seu.edu.cn/default/index.html#/itemDetail?wid=913100035107135488&quot;&gt;东南大学-信息服务门户-学生因公出国(境)申请&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://oic.seu.edu.cn/12540/list.htm&quot;&gt;东南大学-国际合作处-出国申报说明&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ehall.seu.edu.cn/new/index.html&quot;&gt;东南大学-综合服务大厅&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://caiwuchujf.seu.edu.cn/&quot;&gt;东南大学-财务处&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>GitHub HTTPS 连接问题解决方案</title><link>https://blog.homura.work/posts/github-https-connection-fix/</link><guid isPermaLink="true">https://blog.homura.work/posts/github-https-connection-fix/</guid><description>解决服务器上 SSH 可以连接 GitHub 但 HTTPS 连接失败的问题，通过修改 hosts 文件指向可用 IP 地址</description><pubDate>Mon, 01 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在服务器运维过程中，有时会遇到 SSH 可以正常连接 GitHub，但使用 HTTPS 协议克隆仓库时却连接超时的问题。本文记录了这个问题的原因分析和解决方案。&lt;/p&gt;
&lt;h2&gt;问题现象&lt;/h2&gt;
&lt;p&gt;在服务器上使用 HTTPS 协议克隆 GitHub 仓库时，连接超时：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/xxx/xxx.git
# 报错：Failed to connect to github.com port 443 after xxxxx ms: Connection timed out
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;而使用 SSH 协议则可以正常工作。这种情况通常让人感到困惑，因为 SSH 能通，说明网络本身是可以连接到 GitHub 的。&lt;/p&gt;
&lt;h2&gt;问题原因&lt;/h2&gt;
&lt;p&gt;经过排查发现，问题的根源在于：&lt;strong&gt;DNS 解析到的 GitHub IP 地址的 443 端口被阻断了&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;虽然 GitHub 有多个 IP 地址，但由于网络环境、地理位置或 DNS 解析策略的不同，不同服务器解析到的 IP 地址可能不同。当解析到的某个 IP 的 443 端口不可达时，就会出现 HTTPS 连接失败的情况。&lt;/p&gt;
&lt;h2&gt;解决方案&lt;/h2&gt;
&lt;h3&gt;步骤 1：找到可用的 IP 地址&lt;/h3&gt;
&lt;p&gt;首先，我们需要在&lt;strong&gt;能够正常访问 GitHub 的服务器&lt;/strong&gt;上查询 GitHub 的 IP 地址：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ping -c 1 github.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;记录返回的 IP 地址。例如，输出可能是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PING github.com (20.205.243.166) 56(84) bytes of data.
64 bytes from 20.205.243.166: icmp_seq=1 ttl=112 time=5.23 ms
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里的 IP 地址 &lt;code&gt;20.205.243.166&lt;/code&gt; 就是我们需要的可用 IP。&lt;/p&gt;
&lt;h3&gt;步骤 2：修改 hosts 文件&lt;/h3&gt;
&lt;p&gt;在出现问题的服务器上，编辑 &lt;code&gt;/etc/hosts&lt;/code&gt; 文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo vim /etc/hosts
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在文件末尾添加以下内容（使用你在步骤 1 中获取的 IP 地址）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;20.205.243.166 github.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存并退出编辑器。&lt;/p&gt;
&lt;h3&gt;步骤 3：验证修复结果&lt;/h3&gt;
&lt;p&gt;修改完成后，进行验证：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 测试 HTTPS 连接
curl -v https://github.com

# 尝试克隆仓库
git clone https://github.com/xxx/xxx.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果一切正常，应该可以成功连接和克隆了。&lt;/p&gt;
&lt;h2&gt;方案 2：禁用 HTTP/2（备选方案）&lt;/h2&gt;
&lt;p&gt;如果上述修改 hosts 的方案配置后仍然失败，可以尝试临时禁用 HTTP/2 协议。这个方法在某些网络环境下非常有效：&lt;/p&gt;
&lt;h3&gt;临时禁用（仅本次操作）&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 临时禁用 HTTP/2，仅对当前命令生效
GIT_CURL_VERBOSE=1 GIT_TRACE=1 git -c http.version=HTTP/1.1 push
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个命令会：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GIT_CURL_VERBOSE=1&lt;/code&gt;：显示详细的 curl 调试信息&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GIT_TRACE=1&lt;/code&gt;：显示 Git 的详细跟踪信息&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-c http.version=HTTP/1.1&lt;/code&gt;：强制使用 HTTP/1.1 协议&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;全局禁用 HTTP/2&lt;/h3&gt;
&lt;p&gt;如果临时禁用有效，可以将其设置为全局配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 全局禁用 HTTP/2
git config --global http.version HTTP/1.1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样设置后，所有的 Git HTTPS 操作都会使用 HTTP/1.1 协议，无需每次都手动指定。&lt;/p&gt;
&lt;h3&gt;恢复 HTTP/2&lt;/h3&gt;
&lt;p&gt;如果以后想恢复使用 HTTP/2，可以执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 恢复默认设置（使用 HTTP/2）
git config --global --unset http.version
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;实际案例分析&lt;/h2&gt;
&lt;p&gt;在我遇到的实际案例中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;问题服务器&lt;/strong&gt;：DNS 解析到 &lt;code&gt;140.82.114.4&lt;/code&gt;，测试发现该 IP 的 443 端口不通&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;正常服务器&lt;/strong&gt;：DNS 解析到 &lt;code&gt;20.205.243.166&lt;/code&gt;（亚洲节点），可以正常访问&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;解决方法&lt;/strong&gt;：在问题服务器的 hosts 文件中添加 &lt;code&gt;20.205.243.166 github.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结果&lt;/strong&gt;：HTTPS 连接恢复正常，可以顺利克隆仓库&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>UV 学习记录</title><link>https://blog.homura.work/posts/uv-learning/</link><guid isPermaLink="true">https://blog.homura.work/posts/uv-learning/</guid><description>基于 Rust 的极速 Python 包与项目管理器 UV：安装、环境与包管理、运行、导出/锁定、版本管理、常见问题与最佳实践速查。</description><pubDate>Thu, 06 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;UV 是什么？&lt;/h2&gt;
&lt;p&gt;UV 是一个用 Rust 编写的快速 Python 包/项目管理工具，旨在替代 pip、pip-tools、pipx、poetry、pyenv、virtualenv 等工具，提供统一而高效的体验。&lt;/p&gt;
&lt;h2&gt;安装&lt;/h2&gt;
&lt;h3&gt;Linux/macOS&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;curl -LsSf https://astral.sh/uv/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Windows（推荐）&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;powershell -c &quot;irm https://astral.sh/uv/install.ps1 | iex&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;通过 pip 安装&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;pip install uv
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;基本使用速查&lt;/h2&gt;
&lt;h3&gt;1) 创建项目与环境&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 新建并初始化项目
uv init my-project
cd my-project

# 在现有目录初始化
uv init

# 指定 Python 版本
uv init --python 3.11 my-project
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2) 管理 Python 环境&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 创建虚拟环境（自动检测 Python）
uv venv

# 指定 Python 版本
uv venv --python 3.11

# 指定虚拟环境名称（如需）
uv venv my-env

# 激活（传统方式）
# Linux/macOS: source .venv/bin/activate
# Windows: .venv\Scripts\activate

# 推荐：无需显式激活，直接运行
uv run python script.py

# 停用（传统方式）
deactivate
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3) 包管理&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 安装包
uv add requests
uv add requests pandas numpy
uv add --dev pytest black
uv add &quot;requests&amp;gt;=2.28.0&quot;
uv add &quot;pandas==1.5.0&quot;

# 从 requirements.txt 安装
uv add -r requirements.txt

# 移除包
uv remove requests
uv remove requests pandas

# 更新
uv lock --upgrade      # 全部包
uv add requests --upgrade  # 指定包
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4) 运行代码&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 脚本/模块
uv run python script.py
uv run python -m pytest

# 带参数
uv run python script.py --arg value

# 一次性脚本（临时环境安装后运行）
uv run --with requests python -c &quot;import requests; print(requests.get(&apos;https://httpbin.org/get&apos;).json())&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5) requirements.txt 管理&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 由当前环境导出
uv pip freeze &amp;gt; requirements.txt

# 或直接导出
uv export --format requirements-txt --output-file requirements.txt

# 从 requirements.txt 安装
uv add -r requirements.txt
# 或（在虚拟环境中）
uv pip install -r requirements.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若需手动维护依赖，UV 主要使用 &lt;code&gt;pyproject.toml&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[project]
name = &quot;my-project&quot;
version = &quot;0.1.0&quot;
dependencies = [
  &quot;requests&amp;gt;=2.28.0&quot;,
  &quot;pandas&amp;gt;=1.5.0&quot;,
  &quot;numpy&amp;gt;=1.24.0&quot;,
]

[project.optional-dependencies]
dev = [
  &quot;pytest&amp;gt;=7.0.0&quot;,
  &quot;black&amp;gt;=22.0.0&quot;,
  &quot;flake8&amp;gt;=5.0.0&quot;,
]

[build-system]
requires = [&quot;hatchling&quot;]
build-backend = &quot;hatchling.build&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6) 锁定依赖&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 生成/更新锁定文件 uv.lock
uv lock
uv lock --upgrade

# 按锁定版本安装
uv sync
uv sync --no-dev  # 仅生产依赖
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;7) Python 版本管理&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;uv python list
uv python install 3.11
uv python install 3.12
uv run --python 3.11 python script.py
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;8) 常用工作流&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 新项目
uv init my-project &amp;amp;&amp;amp; cd my-project
uv add requests pandas
uv add --dev pytest black
uv run python main.py

# 克隆现有项目
git clone &amp;lt;repo&amp;gt; &amp;amp;&amp;amp; cd &amp;lt;dir&amp;gt;
uv sync
uv run python main.py
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;9) 高级功能&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 工具（类似 pipx）
uv tool run black .
uv tool run pytest
uv tool install black
uv tool install pytest

# 缓存
uv cache info
uv cache clean

# 配置
uv config list
uv config set index-url https://pypi.org/simple/
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;10) 迁移指南&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 从 pip + requirements.txt 迁移
uv init
uv add -r requirements.txt
rm requirements.txt  # 可选

# 从 Poetry 迁移
uv init
uv sync
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;11) 设置超时时间&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;UV_HTTP_TIMEOUT=60 uv sync
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;常见问题（FAQ）&lt;/h2&gt;
&lt;h3&gt;在 CI/CD 中使用 UV&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;- name: Install uv
  uses: astral-sh/setup-uv@v1

- name: Install dependencies
  run: uv sync

- name: Run tests
  run: uv run pytest
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;配置私有源&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;uv config set index-url https://private-pypi.company.com/simple/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或在 &lt;code&gt;pyproject.toml&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[[tool.uv.index]]
name = &quot;private&quot;
url = &quot;https://private-pypi.company.com/simple/&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;查看已安装的包&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;uv pip list
uv pip show requests
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;换源示例&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 阿里云
export UV_INDEX_URL=https://mirrors.aliyun.com/pypi/simple/

# 清华
export UV_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple/

# 中科大
export UV_INDEX_URL=https://mirrors.ustc.edu.cn/pypi/simple/

# 使用示例
uv pip install &amp;lt;package-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;最佳实践&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;uv run&lt;/code&gt; 代替手动激活环境&lt;/li&gt;
&lt;li&gt;提交 &lt;code&gt;uv.lock&lt;/code&gt;，确保团队一致性&lt;/li&gt;
&lt;li&gt;以 &lt;code&gt;pyproject.toml&lt;/code&gt; 为中心管理依赖&lt;/li&gt;
&lt;li&gt;定期 &lt;code&gt;uv lock --upgrade&lt;/code&gt; 更新依赖&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;--dev&lt;/code&gt; 区分开发/生产依赖&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;UV 官方文档&lt;/li&gt;
&lt;li&gt;UV GitHub 仓库&lt;/li&gt;
&lt;li&gt;Python 打包用户指南&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item></channel></rss>