<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>芥子</title><link>https://molicx.github.io/</link><description>shawn 的个人空间，记录后端开发、系统设计与日常折腾</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><managingEditor>vindamocx@gmail.com (shawn)</managingEditor><webMaster>vindamocx@gmail.com (shawn)</webMaster><lastBuildDate>Tue, 26 Aug 2025 10:30:00 +0800</lastBuildDate><atom:link href="https://molicx.github.io/index.xml" rel="self" type="application/rss+xml"/><item><title>更新服务器 DNS</title><link>https://molicx.github.io/posts/update-dns-script/</link><pubDate>Tue, 26 Aug 2025 10:30:00 +0800</pubDate><author>shawn</author><guid>https://molicx.github.io/posts/update-dns-script/</guid><description><![CDATA[<blockquote>
<p>由于众所周知的原因，国内的云服务器经常出现访问不了github的情况.通过shell脚本实现定时更新的功能</p></blockquote>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="cp">#!/usr/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="c1"># ==================== 配置参数（根据需求修改）====================</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 远程 Hosts 文件的 URL（替换为你的实际远程地址）</span>
</span></span><span class="line"><span class="cl"><span class="nv">REMOTE_HOSTS_URL</span><span class="o">=</span><span class="s2">&#34;https://gitlab.com/ineo6/hosts/-/raw/master/next-hosts&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 更新间隔（秒），默认 1 小时（3600 秒）</span>
</span></span><span class="line"><span class="cl"><span class="nv">UPDATE_INTERVAL</span><span class="o">=</span><span class="m">3600</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 日志文件路径</span>
</span></span><span class="line"><span class="cl"><span class="nv">LOG_FILE</span><span class="o">=</span><span class="s2">&#34;/var/log/github_hosts_updater.log&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 备份文件存放目录（自动创建）</span>
</span></span><span class="line"><span class="cl"><span class="nv">BACKUP_DIR</span><span class="o">=</span><span class="s2">&#34;/var/backups/hosts&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 标记：用于识别脚本自动添加的内容（避免覆盖手动配置）</span>
</span></span><span class="line"><span class="cl"><span class="nv">START_MARKER</span><span class="o">=</span><span class="s2">&#34;# === GitHub Hosts Auto-Update Start === #&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">END_MARKER</span><span class="o">=</span><span class="s2">&#34;# === GitHub Hosts Auto-Update End === #&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ==================== 配置结束 ====================</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 初始化：创建备份目录、日志文件</span>
</span></span><span class="line"><span class="cl">init<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># 创建备份目录（若不存在）</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="o">[</span> ! -d <span class="s2">&#34;</span><span class="nv">$BACKUP_DIR</span><span class="s2">&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        mkdir -p <span class="s2">&#34;</span><span class="nv">$BACKUP_DIR</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        chmod <span class="m">700</span> <span class="s2">&#34;</span><span class="nv">$BACKUP_DIR</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># 创建日志文件（若不存在）</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="o">[</span> ! -f <span class="s2">&#34;</span><span class="nv">$LOG_FILE</span><span class="s2">&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        touch <span class="s2">&#34;</span><span class="nv">$LOG_FILE</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        chmod <span class="m">600</span> <span class="s2">&#34;</span><span class="nv">$LOG_FILE</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># 检查 curl 是否安装（用于获取远程文件）</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> ! <span class="nb">command</span> -v curl <span class="p">&amp;</span>&gt; /dev/null<span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        log <span class="s2">&#34;错误：未安装 curl，请先执行 &#39;sudo apt install curl&#39;（Linux）或 &#39;brew install curl&#39;（macOS）&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="nb">exit</span> <span class="m">1</span>
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 日志函数：输出时间+内容到日志文件和控制台</span>
</span></span><span class="line"><span class="cl">log<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">    <span class="nb">local</span> <span class="nv">msg</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$1</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nb">local</span> <span class="nv">time</span><span class="o">=</span><span class="k">$(</span>date <span class="s2">&#34;+%Y-%m-%d %H:%M:%S&#34;</span><span class="k">)</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;[</span><span class="nv">$time</span><span class="s2">] </span><span class="nv">$msg</span><span class="s2">&#34;</span> <span class="p">|</span> tee -a <span class="s2">&#34;</span><span class="nv">$LOG_FILE</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 备份当前 hosts 文件（带时间戳，避免覆盖）</span>
</span></span><span class="line"><span class="cl">backup_hosts<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">    <span class="nb">local</span> <span class="nv">timestamp</span><span class="o">=</span><span class="k">$(</span>date <span class="s2">&#34;+%Y%m%d%H%M%S&#34;</span><span class="k">)</span>
</span></span><span class="line"><span class="cl">    <span class="nb">local</span> <span class="nv">backup_path</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$BACKUP_DIR</span><span class="s2">/hosts_</span><span class="nv">$timestamp</span><span class="s2">.bak&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># 复制 hosts 到备份目录</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> cp /etc/hosts <span class="s2">&#34;</span><span class="nv">$backup_path</span><span class="s2">&#34;</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        log <span class="s2">&#34;已备份 hosts 到：</span><span class="nv">$backup_path</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span>
</span></span><span class="line"><span class="cl">        log <span class="s2">&#34;警告：备份 hosts 失败！&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 从远程 URL 获取最新 Hosts 内容</span>
</span></span><span class="line"><span class="cl">fetch_remote_hosts<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">    log <span class="s2">&#34;正在从远程获取 Hosts：</span><span class="nv">$REMOTE_HOSTS_URL</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># 使用 curl 获取远程内容（超时 10 秒，失败重试 2 次）</span>
</span></span><span class="line"><span class="cl">    <span class="nb">local</span> <span class="nv">remote_content</span><span class="o">=</span><span class="k">$(</span>curl -s --connect-timeout <span class="m">10</span> --retry <span class="m">2</span> <span class="s2">&#34;</span><span class="nv">$REMOTE_HOSTS_URL</span><span class="s2">&#34;</span><span class="k">)</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># 检查获取结果（为空则失败）</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="o">[</span> -z <span class="s2">&#34;</span><span class="nv">$remote_content</span><span class="s2">&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        log <span class="s2">&#34;错误：获取远程 Hosts 失败（URL 无效或网络异常）&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="m">1</span>
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;</span><span class="nv">$remote_content</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="m">0</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 更新本地 hosts 文件（保留手动配置，替换脚本添加的部分）</span>
</span></span><span class="line"><span class="cl">update_hosts<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">    <span class="nb">local</span> <span class="nv">new_hosts</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$1</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># 1. 先备份当前 hosts</span>
</span></span><span class="line"><span class="cl">    backup_hosts
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># 2. 读取现有 hosts 内容，提取「非脚本添加」的部分</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># 若存在标记，则保留标记外的内容；若不存在标记，则保留全部内容</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> grep -q <span class="s2">&#34;</span><span class="nv">$START_MARKER</span><span class="s2">&#34;</span> /etc/hosts <span class="o">&amp;&amp;</span> grep -q <span class="s2">&#34;</span><span class="nv">$END_MARKER</span><span class="s2">&#34;</span> /etc/hosts<span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># 删除标记及其间内容，只保留手动配置部分</span>
</span></span><span class="line"><span class="cl">        <span class="nb">local</span> <span class="nv">pre_content</span><span class="o">=</span><span class="k">$(</span>sed <span class="s2">&#34;/</span><span class="nv">$START_MARKER</span><span class="s2">/,/</span><span class="nv">$END_MARKER</span><span class="s2">/d&#34;</span> /etc/hosts<span class="k">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># 无标记，保留全部内容（并提示首次添加）</span>
</span></span><span class="line"><span class="cl">        <span class="nb">local</span> <span class="nv">pre_content</span><span class="o">=</span><span class="k">$(</span>cat /etc/hosts<span class="k">)</span>
</span></span><span class="line"><span class="cl">        log <span class="s2">&#34;首次更新：未发现标记，将在 hosts 末尾添加自动配置&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># 3. 构建新的 hosts 内容（原有内容 + 新 Hosts + 标记）</span>
</span></span><span class="line"><span class="cl">    <span class="nb">local</span> <span class="nv">new_content</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$pre_content</span><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2"></span><span class="nv">$START_MARKER</span><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2"># 更新时间：</span><span class="k">$(</span>date <span class="s2">&#34;+%Y-%m-%d %H:%M:%S&#34;</span><span class="k">)</span><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2"></span><span class="nv">$new_hosts</span><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2"></span><span class="nv">$END_MARKER</span><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># 4. 写入新内容到 hosts（需要 root 权限）</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="nb">echo</span> <span class="s2">&#34;</span><span class="nv">$new_content</span><span class="s2">&#34;</span> &gt; /etc/hosts<span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        log <span class="s2">&#34;hosts 更新成功！&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># 刷新 DNS 缓存（不同系统命令不同）</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="k">$(</span>uname -s<span class="k">)</span><span class="s2">&#34;</span> <span class="o">=</span> <span class="s2">&#34;Darwin&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">            <span class="c1"># macOS 刷新 DNS</span>
</span></span><span class="line"><span class="cl">            dscacheutil -flushcache <span class="o">&amp;&amp;</span> killall -HUP mDNSResponder
</span></span><span class="line"><span class="cl">            log <span class="s2">&#34;已刷新 macOS DNS 缓存&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="k">else</span>
</span></span><span class="line"><span class="cl">            <span class="c1"># Linux 刷新 DNS（适用于大多数系统）</span>
</span></span><span class="line"><span class="cl">            systemctl restart systemd-resolved 2&gt;/dev/null <span class="o">||</span> /etc/init.d/nscd restart 2&gt;/dev/null
</span></span><span class="line"><span class="cl">            log <span class="s2">&#34;已刷新 Linux DNS 缓存&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="k">fi</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span>
</span></span><span class="line"><span class="cl">        log <span class="s2">&#34;错误：写入 hosts 失败（请确保以 root 权限运行脚本）&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="m">1</span>
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 主循环：定时执行更新</span>
</span></span><span class="line"><span class="cl">main<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">    init
</span></span><span class="line"><span class="cl">    log <span class="s2">&#34;=== GitHub Hosts 自动更新脚本启动 ===&#34;</span>
</span></span><span class="line"><span class="cl">    log <span class="s2">&#34;更新间隔：</span><span class="k">$((</span>UPDATE_INTERVAL/3600<span class="k">))</span><span class="s2"> 小时 | 远程 URL：</span><span class="nv">$REMOTE_HOSTS_URL</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">while</span> true<span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">        log <span class="s2">&#34;=== 开始新一轮更新 ===&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># 获取远程 Hosts</span>
</span></span><span class="line"><span class="cl">        <span class="nv">remote_hosts</span><span class="o">=</span><span class="k">$(</span>fetch_remote_hosts<span class="k">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="o">[</span> <span class="nv">$?</span> -eq <span class="m">0</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">            <span class="c1"># 更新本地 hosts</span>
</span></span><span class="line"><span class="cl">            update_hosts <span class="s2">&#34;</span><span class="nv">$remote_hosts</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="k">fi</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># 等待下一次更新</span>
</span></span><span class="line"><span class="cl">        log <span class="s2">&#34;等待 </span><span class="k">$((</span>UPDATE_INTERVAL/3600<span class="k">))</span><span class="s2"> 小时后再次更新...\n&#34;</span>
</span></span><span class="line"><span class="cl">        sleep <span class="s2">&#34;</span><span class="nv">$UPDATE_INTERVAL</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">done</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 启动主程序</span>
</span></span><span class="line"><span class="cl">main
</span></span></code></pre></div><p>然后</p>]]></description></item><item><title>Hugo 使用方法</title><link>https://molicx.github.io/posts/hugo-usage/</link><pubDate>Sun, 15 Oct 2023 10:30:00 +0800</pubDate><author>shawn</author><guid>https://molicx.github.io/posts/hugo-usage/</guid><description><![CDATA[<blockquote>
<p>折腾过很多种blog,都半途而废了,借助于AI,搭建hugo</p></blockquote>
<p>使用 GitHub 配合 Hugo 部署个人博客是一个高效且免费的方案，主要利用 GitHub Pages 托管静态文件。以下是详细步骤：</p>]]></description></item></channel></rss>