<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Linux on XEDCZQ的博客</title><link>https://xedczq.cn/tags/linux/</link><description>Recent content in Linux on XEDCZQ的博客</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 16 Jul 2026 10:00:00 +0800</lastBuildDate><atom:link href="https://xedczq.cn/tags/linux/index.xml" rel="self" type="application/rss+xml"/><item><title>通过 Tailscale 连接服务器：解决校园网无法 SSH 的问题</title><link>https://xedczq.cn/post/tailscale_ssh_campusnetwork/</link><pubDate>Thu, 16 Jul 2026 10:00:00 +0800</pubDate><guid>https://xedczq.cn/post/tailscale_ssh_campusnetwork/</guid><description>&lt;h1 id="通过-tailscale-连接服务器解决校园网无法-ssh-的问题"&gt;&lt;a href="#%e9%80%9a%e8%bf%87-tailscale-%e8%bf%9e%e6%8e%a5%e6%9c%8d%e5%8a%a1%e5%99%a8%e8%a7%a3%e5%86%b3%e6%a0%a1%e5%9b%ad%e7%bd%91%e6%97%a0%e6%b3%95-ssh-%e7%9a%84%e9%97%ae%e9%a2%98" class="header-anchor"&gt;&lt;/a&gt;通过 Tailscale 连接服务器：解决校园网无法 SSH 的问题
&lt;/h1&gt;&lt;p&gt;这篇记录一个很实用的问题：在校园网环境下，直接 SSH 连接云服务器可能失败，但服务器本身并没有坏，SSH 配置也没有问题。&lt;/p&gt;
&lt;p&gt;常见现象是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在家里、手机热点、公司网络下可以正常 SSH&lt;/li&gt;
&lt;li&gt;换到校园网后，&lt;code&gt;ssh user@server-ip&lt;/code&gt; 连接超时&lt;/li&gt;
&lt;li&gt;云服务器安全组、端口、密钥都检查过，依然连不上&lt;/li&gt;
&lt;li&gt;网站可能能打开，但 SSH 的 22 端口就是不稳定&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这种情况下，可以用 Tailscale 把本地电脑和服务器放进同一个私有网络。之后 SSH 不再走服务器公网 IP，而是走 Tailscale 分配的内网 IP 或设备名。&lt;/p&gt;
&lt;p&gt;文中所有 IP、用户名、密钥路径都使用占位符，不包含真实服务器信息。&lt;/p&gt;
&lt;h2 id="一为什么校园网会影响-ssh"&gt;&lt;a href="#%e4%b8%80%e4%b8%ba%e4%bb%80%e4%b9%88%e6%a0%a1%e5%9b%ad%e7%bd%91%e4%bc%9a%e5%bd%b1%e5%93%8d-ssh" class="header-anchor"&gt;&lt;/a&gt;一、为什么校园网会影响 SSH
&lt;/h2&gt;&lt;p&gt;SSH 默认使用 22 端口。部分校园网、公共网络或企业网络可能会对出站端口做限制。&lt;/p&gt;
&lt;p&gt;可能的表现包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;直接阻断 22 端口&lt;/li&gt;
&lt;li&gt;对长连接不友好&lt;/li&gt;
&lt;li&gt;NAT 或防火墙策略导致连接不稳定&lt;/li&gt;
&lt;li&gt;某些云服务器 IP 段访问质量较差&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这时即使服务器本身是正常的，本地也可能连不上：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh your-user@your-server-public-ip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可能会卡住，最后报：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Operation timed out
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或者：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Connection timed out
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Tailscale 的思路是：让你的本地电脑和云服务器加入同一个 tailnet，形成一个基于 WireGuard 的私有网络。之后你连接的是 Tailscale 网络里的地址，而不是直接访问公网 SSH 入口。&lt;/p&gt;
&lt;h2 id="二整体方案"&gt;&lt;a href="#%e4%ba%8c%e6%95%b4%e4%bd%93%e6%96%b9%e6%a1%88" class="header-anchor"&gt;&lt;/a&gt;二、整体方案
&lt;/h2&gt;&lt;p&gt;最终目标是这样的：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;本地电脑 -- Tailscale 私有网络 -- 云服务器
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;连接方式从：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -i ~/.ssh/your-key your-user@your-server-public-ip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;变成：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -i ~/.ssh/your-key your-user@your-server-tailscale-ip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或者更方便：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh your-server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里的 &lt;code&gt;your-server&lt;/code&gt; 是自己在 &lt;code&gt;~/.ssh/config&lt;/code&gt; 中配置的别名。&lt;/p&gt;
&lt;h2 id="三准备条件"&gt;&lt;a href="#%e4%b8%89%e5%87%86%e5%a4%87%e6%9d%a1%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;三、准备条件
&lt;/h2&gt;&lt;p&gt;你需要准备：&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;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;本地电脑&lt;/td&gt;
 &lt;td&gt;Mac / Windows / Linux&lt;/td&gt;
 &lt;td&gt;安装 Tailscale 客户端&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;云服务器&lt;/td&gt;
 &lt;td&gt;Linux 服务器&lt;/td&gt;
 &lt;td&gt;安装 Tailscale 服务端客户端&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Tailscale 账号&lt;/td&gt;
 &lt;td&gt;GitHub / Google / Microsoft 等&lt;/td&gt;
 &lt;td&gt;用同一个账号登录&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SSH 用户&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;your-user&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;例如普通用户或 &lt;code&gt;root&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SSH 私钥&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;~/.ssh/your-key&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;如果使用密钥登录&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;官方文档：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://tailscale.com/docs/install/linux" target="_blank" rel="noopener"
 &gt;Tailscale Linux 安装文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tailscale.com/docs/features/magicdns" target="_blank" rel="noopener"
 &gt;Tailscale MagicDNS 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://tailscale.com/docs/features/tailscale-ssh" target="_blank" rel="noopener"
 &gt;Tailscale SSH 文档&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="四在本地电脑安装-tailscale"&gt;&lt;a href="#%e5%9b%9b%e5%9c%a8%e6%9c%ac%e5%9c%b0%e7%94%b5%e8%84%91%e5%ae%89%e8%a3%85-tailscale" class="header-anchor"&gt;&lt;/a&gt;四、在本地电脑安装 Tailscale
&lt;/h2&gt;&lt;h3 id="mac"&gt;&lt;a href="#mac" class="header-anchor"&gt;&lt;/a&gt;Mac
&lt;/h3&gt;&lt;p&gt;可以从官网下载并安装：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://tailscale.com/download
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安装完成后，登录自己的 Tailscale 账号。&lt;/p&gt;
&lt;p&gt;也可以用 Homebrew：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install --cask tailscale
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后打开 Tailscale App 登录。&lt;/p&gt;
&lt;h3 id="windows"&gt;&lt;a href="#windows" class="header-anchor"&gt;&lt;/a&gt;Windows
&lt;/h3&gt;&lt;p&gt;从官网下载 Windows 安装包：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://tailscale.com/download
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安装后登录同一个 Tailscale 账号。&lt;/p&gt;
&lt;h3 id="linux-本地电脑"&gt;&lt;a href="#linux-%e6%9c%ac%e5%9c%b0%e7%94%b5%e8%84%91" class="header-anchor"&gt;&lt;/a&gt;Linux 本地电脑
&lt;/h3&gt;&lt;p&gt;Linux 可以使用官方安装脚本：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -fsSL https://tailscale.com/install.sh &lt;span class="p"&gt;|&lt;/span&gt; sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后登录：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo tailscale up
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;浏览器会打开认证页面，登录后这台电脑就加入 tailnet 了。&lt;/p&gt;
&lt;h2 id="五在云服务器安装-tailscale"&gt;&lt;a href="#%e4%ba%94%e5%9c%a8%e4%ba%91%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%ae%89%e8%a3%85-tailscale" class="header-anchor"&gt;&lt;/a&gt;五、在云服务器安装 Tailscale
&lt;/h2&gt;&lt;p&gt;先通过能连接服务器的网络进入服务器。例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;手机热点&lt;/li&gt;
&lt;li&gt;家里网络&lt;/li&gt;
&lt;li&gt;云厂商网页控制台&lt;/li&gt;
&lt;li&gt;云服务器的 VNC / Web Shell&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;进入服务器后安装 Tailscale：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -fsSL https://tailscale.com/install.sh &lt;span class="p"&gt;|&lt;/span&gt; sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;启动并登录：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo tailscale up
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;终端会输出一个登录链接。复制链接到浏览器，使用和本地电脑相同的 Tailscale 账号登录。&lt;/p&gt;
&lt;p&gt;登录完成后，服务器也会加入同一个 tailnet。&lt;/p&gt;
&lt;h2 id="六查看-tailscale-ip"&gt;&lt;a href="#%e5%85%ad%e6%9f%a5%e7%9c%8b-tailscale-ip" class="header-anchor"&gt;&lt;/a&gt;六、查看 Tailscale IP
&lt;/h2&gt;&lt;p&gt;在服务器上执行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tailscale ip -4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;会输出一个类似下面的地址：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;100.x.y.z
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个 &lt;code&gt;100.x.y.z&lt;/code&gt; 就是服务器在 Tailscale 私有网络里的 IP。&lt;/p&gt;
&lt;p&gt;在本地电脑也可以查看当前 tailnet 里的设备：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tailscale status
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;你会看到类似：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;100.x.y.z your-server your-account linux
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;100.a.b.c your-laptop your-account macOS
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;只要两台设备都在列表里，就说明它们已经在同一个 Tailscale 网络中了。&lt;/p&gt;
&lt;h2 id="七通过-tailscale-ip-连接服务器"&gt;&lt;a href="#%e4%b8%83%e9%80%9a%e8%bf%87-tailscale-ip-%e8%bf%9e%e6%8e%a5%e6%9c%8d%e5%8a%a1%e5%99%a8" class="header-anchor"&gt;&lt;/a&gt;七、通过 Tailscale IP 连接服务器
&lt;/h2&gt;&lt;p&gt;现在不要再用公网 IP 连接，而是改用 Tailscale IP：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -i ~/.ssh/your-key your-user@100.x.y.z
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果你的服务器 SSH 端口不是 22，需要加 &lt;code&gt;-p&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -i ~/.ssh/your-key -p your-ssh-port your-user@100.x.y.z
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;连接成功后，说明 SSH 已经绕过校园网对公网 SSH 的限制，改走 Tailscale 私有网络了。&lt;/p&gt;
&lt;h2 id="八使用-magicdns用设备名代替-ip"&gt;&lt;a href="#%e5%85%ab%e4%bd%bf%e7%94%a8-magicdns%e7%94%a8%e8%ae%be%e5%a4%87%e5%90%8d%e4%bb%a3%e6%9b%bf-ip" class="header-anchor"&gt;&lt;/a&gt;八、使用 MagicDNS：用设备名代替 IP
&lt;/h2&gt;&lt;p&gt;Tailscale 支持 MagicDNS。开启后，可以直接用设备名连接，不用记 &lt;code&gt;100.x.y.z&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;例如服务器设备名是 &lt;code&gt;your-server&lt;/code&gt;，可以尝试：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -i ~/.ssh/your-key your-user@your-server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果设备名冲突或解析失败，可以回到 Tailscale 管理后台查看设备名称。&lt;/p&gt;
&lt;p&gt;MagicDNS 的好处是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不用记 Tailscale IP&lt;/li&gt;
&lt;li&gt;服务器 Tailscale IP 变化时影响更小&lt;/li&gt;
&lt;li&gt;命令更短，更适合日常使用&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="九配置-ssh-config让连接更短"&gt;&lt;a href="#%e4%b9%9d%e9%85%8d%e7%bd%ae-ssh-config%e8%ae%a9%e8%bf%9e%e6%8e%a5%e6%9b%b4%e7%9f%ad" class="header-anchor"&gt;&lt;/a&gt;九、配置 SSH Config，让连接更短
&lt;/h2&gt;&lt;p&gt;推荐把连接信息写进本地 &lt;code&gt;~/.ssh/config&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;打开文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nano ~/.ssh/config
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;加入：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Host your-server
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; HostName 100.x.y.z
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; User your-user
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Port 22
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; IdentityFile ~/.ssh/your-key
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ServerAliveInterval 60
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ServerAliveCountMax 3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;保存后，连接命令变成：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh your-server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果你启用了 MagicDNS，也可以把 &lt;code&gt;HostName&lt;/code&gt; 写成设备名：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Host your-server
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; HostName your-server
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; User your-user
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Port 22
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; IdentityFile ~/.ssh/your-key
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ServerAliveInterval 60
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ServerAliveCountMax 3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;不过我更喜欢第一种：&lt;code&gt;Host&lt;/code&gt; 用短别名，&lt;code&gt;HostName&lt;/code&gt; 写明确的 Tailscale IP。这样排查问题时更直观。&lt;/p&gt;
&lt;h2 id="十在-codex-中使用"&gt;&lt;a href="#%e5%8d%81%e5%9c%a8-codex-%e4%b8%ad%e4%bd%bf%e7%94%a8" class="header-anchor"&gt;&lt;/a&gt;十、在 Codex 中使用
&lt;/h2&gt;&lt;p&gt;配置好 SSH 别名后，Codex 里可以直接让它执行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh your-server &lt;span class="s2"&gt;&amp;#34;pwd&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看服务器目录：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh your-server &lt;span class="s2"&gt;&amp;#34;ls -lah&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看磁盘：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh your-server &lt;span class="s2"&gt;&amp;#34;df -h&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看内存：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh your-server &lt;span class="s2"&gt;&amp;#34;free -h&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看服务状态：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh your-server &lt;span class="s2"&gt;&amp;#34;systemctl status nginx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样 Codex 不需要知道你的公网 IP，只需要知道本地 SSH 别名即可。&lt;/p&gt;
&lt;h2 id="十一普通-ssh-over-tailscale-和-tailscale-ssh-的区别"&gt;&lt;a href="#%e5%8d%81%e4%b8%80%e6%99%ae%e9%80%9a-ssh-over-tailscale-%e5%92%8c-tailscale-ssh-%e7%9a%84%e5%8c%ba%e5%88%ab" class="header-anchor"&gt;&lt;/a&gt;十一、普通 SSH over Tailscale 和 Tailscale SSH 的区别
&lt;/h2&gt;&lt;p&gt;这里容易混淆，简单区分一下。&lt;/p&gt;
&lt;h3 id="普通-ssh-over-tailscale"&gt;&lt;a href="#%e6%99%ae%e9%80%9a-ssh-over-tailscale" class="header-anchor"&gt;&lt;/a&gt;普通 SSH over Tailscale
&lt;/h3&gt;&lt;p&gt;命令类似：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -i ~/.ssh/your-key your-user@100.x.y.z
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;特点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;仍然使用服务器上的 OpenSSH&lt;/li&gt;
&lt;li&gt;仍然使用原来的 Linux 用户和 SSH 密钥&lt;/li&gt;
&lt;li&gt;只是网络路径从公网变成了 Tailscale 私有网络&lt;/li&gt;
&lt;li&gt;对个人服务器来说最直观，也最容易理解&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="tailscale-ssh"&gt;&lt;a href="#tailscale-ssh" class="header-anchor"&gt;&lt;/a&gt;Tailscale SSH
&lt;/h3&gt;&lt;p&gt;Tailscale 也提供自己的 SSH 能力，可以让 Tailscale 接管 tailnet 内的 SSH 认证与授权。&lt;/p&gt;
&lt;p&gt;服务器上可以启用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo tailscale &lt;span class="nb"&gt;set&lt;/span&gt; --ssh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后配合 Tailscale 管理后台的访问控制规则使用。&lt;/p&gt;
&lt;p&gt;它的好处是可以把 SSH 权限和 Tailscale 身份绑定起来，适合多人团队、统一权限管理、减少手动维护 SSH key 的场景。&lt;/p&gt;
&lt;p&gt;如果只是自己连接自己的服务器，我更建议先用“普通 SSH over Tailscale”。它和传统 SSH 习惯一致，排查也简单。&lt;/p&gt;
&lt;h2 id="十二建议的安全设置"&gt;&lt;a href="#%e5%8d%81%e4%ba%8c%e5%bb%ba%e8%ae%ae%e7%9a%84%e5%ae%89%e5%85%a8%e8%ae%be%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;十二、建议的安全设置
&lt;/h2&gt;&lt;h3 id="不要公开真实信息"&gt;&lt;a href="#%e4%b8%8d%e8%a6%81%e5%85%ac%e5%bc%80%e7%9c%9f%e5%ae%9e%e4%bf%a1%e6%81%af" class="header-anchor"&gt;&lt;/a&gt;不要公开真实信息
&lt;/h3&gt;&lt;p&gt;公开教程里不要写：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;真实公网 IP&lt;/li&gt;
&lt;li&gt;真实 Tailscale IP&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;li&gt;&lt;code&gt;.env&lt;/code&gt; 里的生产配置&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;用占位符就够：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;your-server-public-ip
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;100.x.y.z
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;your-user
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;~/.ssh/your-key
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="尽量使用密钥登录"&gt;&lt;a href="#%e5%b0%bd%e9%87%8f%e4%bd%bf%e7%94%a8%e5%af%86%e9%92%a5%e7%99%bb%e5%bd%95" class="header-anchor"&gt;&lt;/a&gt;尽量使用密钥登录
&lt;/h3&gt;&lt;p&gt;比起密码登录，更推荐 SSH key。&lt;/p&gt;
&lt;p&gt;私钥权限建议设置为：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod &lt;span class="m"&gt;600&lt;/span&gt; ~/.ssh/your-key
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="保留公网-ssh-的最小暴露"&gt;&lt;a href="#%e4%bf%9d%e7%95%99%e5%85%ac%e7%bd%91-ssh-%e7%9a%84%e6%9c%80%e5%b0%8f%e6%9a%b4%e9%9c%b2" class="header-anchor"&gt;&lt;/a&gt;保留公网 SSH 的最小暴露
&lt;/h3&gt;&lt;p&gt;如果已经能稳定通过 Tailscale 连接服务器，可以考虑收紧云服务器安全组。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;公网 SSH 只允许自己的固定 IP&lt;/li&gt;
&lt;li&gt;或者关闭公网 SSH，仅通过 Tailscale 访问&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这个操作要谨慎。关闭公网 SSH 前，一定要确认 Tailscale 可以稳定连接，否则容易把自己锁在服务器外面。&lt;/p&gt;
&lt;h2 id="十三常见问题排查"&gt;&lt;a href="#%e5%8d%81%e4%b8%89%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98%e6%8e%92%e6%9f%a5" class="header-anchor"&gt;&lt;/a&gt;十三、常见问题排查
&lt;/h2&gt;&lt;h3 id="tailscale-status-看不到服务器"&gt;&lt;a href="#tailscale-status-%e7%9c%8b%e4%b8%8d%e5%88%b0%e6%9c%8d%e5%8a%a1%e5%99%a8" class="header-anchor"&gt;&lt;/a&gt;tailscale status 看不到服务器
&lt;/h3&gt;&lt;p&gt;检查服务器是否已经登录：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tailscale status
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果没有登录，重新执行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo tailscale up
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="本地能看到服务器但-ssh-失败"&gt;&lt;a href="#%e6%9c%ac%e5%9c%b0%e8%83%bd%e7%9c%8b%e5%88%b0%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%bd%86-ssh-%e5%a4%b1%e8%b4%a5" class="header-anchor"&gt;&lt;/a&gt;本地能看到服务器，但 SSH 失败
&lt;/h3&gt;&lt;p&gt;先测试网络：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ping 100.x.y.z
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;再测试 SSH：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -v your-user@100.x.y.z
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;-v&lt;/code&gt; 会输出详细日志，方便判断是网络问题、密钥问题还是用户名问题。&lt;/p&gt;
&lt;h3 id="permission-denied"&gt;&lt;a href="#permission-denied" class="header-anchor"&gt;&lt;/a&gt;Permission denied
&lt;/h3&gt;&lt;p&gt;通常是 SSH 认证问题，而不是 Tailscale 网络问题。&lt;/p&gt;
&lt;p&gt;重点检查：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用户名是否正确&lt;/li&gt;
&lt;li&gt;私钥路径是否正确&lt;/li&gt;
&lt;li&gt;私钥权限是否为 &lt;code&gt;600&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;服务器上是否有对应公钥&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="连接超时"&gt;&lt;a href="#%e8%bf%9e%e6%8e%a5%e8%b6%85%e6%97%b6" class="header-anchor"&gt;&lt;/a&gt;连接超时
&lt;/h3&gt;&lt;p&gt;如果连接 Tailscale IP 也超时，检查：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本地 Tailscale 是否在线&lt;/li&gt;
&lt;li&gt;服务器 Tailscale 是否在线&lt;/li&gt;
&lt;li&gt;两台设备是否在同一个 Tailscale 账号或 tailnet 中&lt;/li&gt;
&lt;li&gt;服务器防火墙是否限制了来自 &lt;code&gt;tailscale0&lt;/code&gt; 网卡的 SSH&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可以在服务器上查看 SSH 是否监听：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ss -tulnp &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s1"&gt;&amp;#39;:22&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="十四完整推荐流程"&gt;&lt;a href="#%e5%8d%81%e5%9b%9b%e5%ae%8c%e6%95%b4%e6%8e%a8%e8%8d%90%e6%b5%81%e7%a8%8b" class="header-anchor"&gt;&lt;/a&gt;十四、完整推荐流程
&lt;/h2&gt;&lt;p&gt;我的推荐流程是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先用能连服务器的网络登录服务器&lt;/li&gt;
&lt;li&gt;服务器安装 Tailscale&lt;/li&gt;
&lt;li&gt;本地电脑安装 Tailscale&lt;/li&gt;
&lt;li&gt;两台设备登录同一个 Tailscale 账号&lt;/li&gt;
&lt;li&gt;在服务器执行 &lt;code&gt;tailscale ip -4&lt;/code&gt; 获取 &lt;code&gt;100.x.y.z&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;本地用 &lt;code&gt;ssh your-user@100.x.y.z&lt;/code&gt; 测试连接&lt;/li&gt;
&lt;li&gt;写入 &lt;code&gt;~/.ssh/config&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;以后直接 &lt;code&gt;ssh your-server&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;在 Codex 中使用 &lt;code&gt;ssh your-server &amp;quot;命令&amp;quot;&lt;/code&gt; 做远程控制&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;到这一步，校园网能不能直连云服务器公网 SSH，就没那么重要了。因为真正使用的是 Tailscale 私有网络。&lt;/p&gt;
&lt;h2 id="十五命令速查"&gt;&lt;a href="#%e5%8d%81%e4%ba%94%e5%91%bd%e4%bb%a4%e9%80%9f%e6%9f%a5" class="header-anchor"&gt;&lt;/a&gt;十五、命令速查
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&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;code&gt;curl -fsSL https://tailscale.com/install.sh | sh&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Linux 安装 Tailscale&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;sudo tailscale up&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;登录并加入 tailnet&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;tailscale status&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;查看当前 tailnet 设备状态&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;tailscale ip -4&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;查看本机 Tailscale IPv4 地址&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ssh your-user@100.x.y.z&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;通过 Tailscale IP 连接服务器&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ssh -i ~/.ssh/your-key your-user@100.x.y.z&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;使用私钥通过 Tailscale 连接&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ssh -v your-server&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;输出 SSH 调试日志&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ssh your-server &amp;quot;df -h&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;远程查看服务器磁盘&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;sudo tailscale set --ssh&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;启用 Tailscale SSH&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="十六总结"&gt;&lt;a href="#%e5%8d%81%e5%85%ad%e6%80%bb%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;十六、总结
&lt;/h2&gt;&lt;p&gt;校园网无法 SSH 时，不一定是服务器配置错了，也可能是网络环境对端口或长连接不友好。&lt;/p&gt;
&lt;p&gt;Tailscale 的价值在于：它给本地电脑和服务器建立了一个稳定的私有网络。之后我们不再依赖公网 SSH 链路，而是通过 &lt;code&gt;100.x.y.z&lt;/code&gt; 这类 Tailscale 地址连接服务器。&lt;/p&gt;
&lt;p&gt;对个人开发者来说，最舒服的组合是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Tailscale IP + SSH key + ~/.ssh/config + Codex
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;配置完成后，连接服务器会变得很轻：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh your-server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后 Codex 也可以基于这个别名帮你做远程排查、部署和记录整理。&lt;/p&gt;</description></item><item><title>Codex SSH 便捷连接服务器与远程控制教程</title><link>https://xedczq.cn/post/codex_ssh_remotecontrol/</link><pubDate>Wed, 15 Jul 2026 10:00:00 +0800</pubDate><guid>https://xedczq.cn/post/codex_ssh_remotecontrol/</guid><description>&lt;h1 id="codex-ssh-便捷连接服务器与远程控制教程"&gt;&lt;a href="#codex-ssh-%e4%be%bf%e6%8d%b7%e8%bf%9e%e6%8e%a5%e6%9c%8d%e5%8a%a1%e5%99%a8%e4%b8%8e%e8%bf%9c%e7%a8%8b%e6%8e%a7%e5%88%b6%e6%95%99%e7%a8%8b" class="header-anchor"&gt;&lt;/a&gt;Codex SSH 便捷连接服务器与远程控制教程
&lt;/h1&gt;&lt;p&gt;这篇记录的是我在本地 Codex 中连接云服务器的通用流程。目标是：不用每次都手动输入一大串 SSH 命令，也尽量不暴露服务器敏感信息。&lt;/p&gt;
&lt;p&gt;文中的 IP、用户名、密钥路径全部使用占位符，实际使用时替换成自己的信息即可。&lt;/p&gt;
&lt;h2 id="一准备工作"&gt;&lt;a href="#%e4%b8%80%e5%87%86%e5%a4%87%e5%b7%a5%e4%bd%9c" class="header-anchor"&gt;&lt;/a&gt;一、准备工作
&lt;/h2&gt;&lt;p&gt;先确认自己手里有下面几类信息：&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;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;服务器 IP&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;your-server-ip&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;云服务器公网 IP&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SSH 用户名&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;your-user&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;常见是 &lt;code&gt;root&lt;/code&gt; 或自建用户&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SSH 端口&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;22&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;默认是 22，如果改过就填实际端口&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;私钥路径&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;~/.ssh/your-key&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;本地私钥文件路径&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;服务器目录&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;/data/www/your-site&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;可选，比如网站部署目录&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;注意：不要把真实 IP、服务器密码、私钥内容写到公开博客、公开仓库或截图里。&lt;/p&gt;
&lt;h2 id="二最基础的-ssh-连接命令"&gt;&lt;a href="#%e4%ba%8c%e6%9c%80%e5%9f%ba%e7%a1%80%e7%9a%84-ssh-%e8%bf%9e%e6%8e%a5%e5%91%bd%e4%bb%a4" class="header-anchor"&gt;&lt;/a&gt;二、最基础的 SSH 连接命令
&lt;/h2&gt;&lt;p&gt;如果使用私钥连接服务器，基础命令是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -i ~/.ssh/your-key -p &lt;span class="m"&gt;22&lt;/span&gt; your-user@your-server-ip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;含义：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ssh&lt;/code&gt;：发起 SSH 远程连接&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-i ~/.ssh/your-key&lt;/code&gt;：指定本地私钥文件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-p 22&lt;/code&gt;：指定 SSH 端口&lt;/li&gt;
&lt;li&gt;&lt;code&gt;your-user@your-server-ip&lt;/code&gt;：用哪个用户连接哪台服务器&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果服务器使用默认 22 端口，也可以省略 &lt;code&gt;-p 22&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -i ~/.ssh/your-key your-user@your-server-ip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第一次连接时，终端可能会提示是否信任服务器指纹，确认 IP 无误后输入：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;连接成功后，命令行会进入服务器环境。&lt;/p&gt;
&lt;h2 id="三检查私钥权限"&gt;&lt;a href="#%e4%b8%89%e6%a3%80%e6%9f%a5%e7%a7%81%e9%92%a5%e6%9d%83%e9%99%90" class="header-anchor"&gt;&lt;/a&gt;三、检查私钥权限
&lt;/h2&gt;&lt;p&gt;SSH 对私钥权限比较严格。如果权限太开放，可能会拒绝连接。&lt;/p&gt;
&lt;p&gt;可以执行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod &lt;span class="m"&gt;600&lt;/span&gt; ~/.ssh/your-key
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;含义：只允许当前用户读写这个私钥文件。&lt;/p&gt;
&lt;p&gt;如果 &lt;code&gt;.ssh&lt;/code&gt; 目录权限异常，也可以执行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod &lt;span class="m"&gt;700&lt;/span&gt; ~/.ssh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;含义：只允许当前用户访问 &lt;code&gt;.ssh&lt;/code&gt; 目录。&lt;/p&gt;
&lt;h2 id="四推荐方式配置-ssh-别名"&gt;&lt;a href="#%e5%9b%9b%e6%8e%a8%e8%8d%90%e6%96%b9%e5%bc%8f%e9%85%8d%e7%bd%ae-ssh-%e5%88%ab%e5%90%8d" class="header-anchor"&gt;&lt;/a&gt;四、推荐方式：配置 SSH 别名
&lt;/h2&gt;&lt;p&gt;每次输入完整命令比较麻烦，更推荐写进 &lt;code&gt;~/.ssh/config&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;打开配置文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nano ~/.ssh/config
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;加入下面内容：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Host my-server
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; HostName your-server-ip
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; User your-user
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Port 22
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; IdentityFile ~/.ssh/your-key
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ServerAliveInterval 60
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ServerAliveCountMax 3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;字段含义：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Host my-server&lt;/code&gt;：本地连接别名，之后直接用 &lt;code&gt;my-server&lt;/code&gt; 连接&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HostName your-server-ip&lt;/code&gt;：真实服务器 IP&lt;/li&gt;
&lt;li&gt;&lt;code&gt;User your-user&lt;/code&gt;：登录用户名&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Port 22&lt;/code&gt;：SSH 端口&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IdentityFile ~/.ssh/your-key&lt;/code&gt;：私钥路径&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ServerAliveInterval 60&lt;/code&gt;：每 60 秒发送一次保活包&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ServerAliveCountMax 3&lt;/code&gt;：连续 3 次无响应后断开&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;保存后连接服务器就变成：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh my-server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这就是最方便的方式。以后在 Codex 里也可以直接让它执行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh my-server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="五用-codex-辅助连接服务器"&gt;&lt;a href="#%e4%ba%94%e7%94%a8-codex-%e8%be%85%e5%8a%a9%e8%bf%9e%e6%8e%a5%e6%9c%8d%e5%8a%a1%e5%99%a8" class="header-anchor"&gt;&lt;/a&gt;五、用 Codex 辅助连接服务器
&lt;/h2&gt;&lt;p&gt;在 Codex 中，可以把连接命令当作普通终端命令执行。&lt;/p&gt;
&lt;p&gt;例如直接说：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;帮我连接 my-server，看一下 nginx 状态
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Codex 可以执行类似命令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh my-server &lt;span class="s2"&gt;&amp;#34;systemctl status nginx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里的关键点是：远程命令可以直接放在 SSH 后面的引号中。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh my-server &lt;span class="s2"&gt;&amp;#34;pwd&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;含义：连接服务器后执行 &lt;code&gt;pwd&lt;/code&gt;，查看当前目录。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh my-server &lt;span class="s2"&gt;&amp;#34;ls -lah /data/www/your-site&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;含义：查看服务器上某个网站目录。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh my-server &lt;span class="s2"&gt;&amp;#34;df -h&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;含义：查看服务器磁盘空间。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh my-server &lt;span class="s2"&gt;&amp;#34;free -h&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;含义：查看服务器内存使用情况。&lt;/p&gt;
&lt;h2 id="六常用远程检查命令"&gt;&lt;a href="#%e5%85%ad%e5%b8%b8%e7%94%a8%e8%bf%9c%e7%a8%8b%e6%a3%80%e6%9f%a5%e5%91%bd%e4%bb%a4" class="header-anchor"&gt;&lt;/a&gt;六、常用远程检查命令
&lt;/h2&gt;&lt;h3 id="查看系统信息"&gt;&lt;a href="#%e6%9f%a5%e7%9c%8b%e7%b3%bb%e7%bb%9f%e4%bf%a1%e6%81%af" class="header-anchor"&gt;&lt;/a&gt;查看系统信息
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh my-server &lt;span class="s2"&gt;&amp;#34;uname -a&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看系统内核和基础信息。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh my-server &lt;span class="s2"&gt;&amp;#34;uptime&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看服务器运行时间和负载。&lt;/p&gt;
&lt;h3 id="查看磁盘和内存"&gt;&lt;a href="#%e6%9f%a5%e7%9c%8b%e7%a3%81%e7%9b%98%e5%92%8c%e5%86%85%e5%ad%98" class="header-anchor"&gt;&lt;/a&gt;查看磁盘和内存
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh my-server &lt;span class="s2"&gt;&amp;#34;df -h&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看磁盘空间。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh my-server &lt;span class="s2"&gt;&amp;#34;free -h&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看内存使用情况。&lt;/p&gt;
&lt;h3 id="查看端口监听"&gt;&lt;a href="#%e6%9f%a5%e7%9c%8b%e7%ab%af%e5%8f%a3%e7%9b%91%e5%90%ac" class="header-anchor"&gt;&lt;/a&gt;查看端口监听
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh my-server &lt;span class="s2"&gt;&amp;#34;ss -tulnp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看当前服务器开放和监听的端口。&lt;/p&gt;
&lt;p&gt;如果只想看 80 和 443：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh my-server &lt;span class="s2"&gt;&amp;#34;ss -tulnp | grep -E &amp;#39;:80|:443&amp;#39;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="查看-nginx-状态"&gt;&lt;a href="#%e6%9f%a5%e7%9c%8b-nginx-%e7%8a%b6%e6%80%81" class="header-anchor"&gt;&lt;/a&gt;查看 Nginx 状态
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh my-server &lt;span class="s2"&gt;&amp;#34;systemctl status nginx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看 Nginx 服务状态。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh my-server &lt;span class="s2"&gt;&amp;#34;nginx -t&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;检查 Nginx 配置是否正确。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh my-server &lt;span class="s2"&gt;&amp;#34;systemctl reload nginx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;重载 Nginx 配置。&lt;/p&gt;
&lt;h2 id="七用-rsync-上传文件"&gt;&lt;a href="#%e4%b8%83%e7%94%a8-rsync-%e4%b8%8a%e4%bc%a0%e6%96%87%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;七、用 rsync 上传文件
&lt;/h2&gt;&lt;p&gt;如果要把本地构建好的静态网站上传到服务器，常见方式是 &lt;code&gt;rsync&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rsync -az --delete -e &lt;span class="s2"&gt;&amp;#34;ssh&amp;#34;&lt;/span&gt; ./public/ my-server:/data/www/your-site/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;含义：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rsync&lt;/code&gt;：同步文件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-a&lt;/code&gt;：归档模式，保留文件属性&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-z&lt;/code&gt;：传输时压缩&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--delete&lt;/code&gt;：删除服务器上本地已经不存在的文件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-e &amp;quot;ssh&amp;quot;&lt;/code&gt;：通过 SSH 传输&lt;/li&gt;
&lt;li&gt;&lt;code&gt;./public/&lt;/code&gt;：本地待上传目录&lt;/li&gt;
&lt;li&gt;&lt;code&gt;my-server:/data/www/your-site/&lt;/code&gt;：服务器目标目录&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意：&lt;code&gt;--delete&lt;/code&gt; 很有用，但也要谨慎。目标目录写错时，可能会删除不该删的远程文件。&lt;/p&gt;
&lt;h2 id="八用部署脚本进一步简化"&gt;&lt;a href="#%e5%85%ab%e7%94%a8%e9%83%a8%e7%bd%b2%e8%84%9a%e6%9c%ac%e8%bf%9b%e4%b8%80%e6%ad%a5%e7%ae%80%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;八、用部署脚本进一步简化
&lt;/h2&gt;&lt;p&gt;如果一个项目经常需要发布，可以把构建和上传写成脚本。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./scripts/deploy.sh ./scripts/deploy.env
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;通常部署脚本会做几件事：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;构建本地项目&lt;/li&gt;
&lt;li&gt;检查 SSH 配置&lt;/li&gt;
&lt;li&gt;创建远程目录&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;rsync&lt;/code&gt; 上传文件&lt;/li&gt;
&lt;li&gt;输出部署结果&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;环境变量文件可以写成这样：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-env" data-lang="env"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DEPLOY_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-server-ip
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DEPLOY_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-user
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DEPLOY_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;22&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;SSH_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/Users/your-name/.ssh/your-key
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DEPLOY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/data/www/your-site
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;LOCAL_PUBLIC_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;public
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果这个文件会提交到公开仓库，不建议写真实服务器信息。可以只提交 &lt;code&gt;deploy.env.example&lt;/code&gt;，真实的 &lt;code&gt;deploy.env&lt;/code&gt; 放在本地并加入 &lt;code&gt;.gitignore&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id="九让-codex-更安全地帮你远程操作"&gt;&lt;a href="#%e4%b9%9d%e8%ae%a9-codex-%e6%9b%b4%e5%ae%89%e5%85%a8%e5%9c%b0%e5%b8%ae%e4%bd%a0%e8%bf%9c%e7%a8%8b%e6%93%8d%e4%bd%9c" class="header-anchor"&gt;&lt;/a&gt;九、让 Codex 更安全地帮你远程操作
&lt;/h2&gt;&lt;p&gt;让 Codex 执行远程命令时，建议遵循几个原则。&lt;/p&gt;
&lt;h3 id="先查状态再做修改"&gt;&lt;a href="#%e5%85%88%e6%9f%a5%e7%8a%b6%e6%80%81%e5%86%8d%e5%81%9a%e4%bf%ae%e6%94%b9" class="header-anchor"&gt;&lt;/a&gt;先查状态，再做修改
&lt;/h3&gt;&lt;p&gt;比如先执行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh my-server &lt;span class="s2"&gt;&amp;#34;systemctl status nginx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;确认状态后，再决定是否重启：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh my-server &lt;span class="s2"&gt;&amp;#34;systemctl restart nginx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="谨慎执行删除命令"&gt;&lt;a href="#%e8%b0%a8%e6%85%8e%e6%89%a7%e8%a1%8c%e5%88%a0%e9%99%a4%e5%91%bd%e4%bb%a4" class="header-anchor"&gt;&lt;/a&gt;谨慎执行删除命令
&lt;/h3&gt;&lt;p&gt;远程服务器上的删除操作要格外小心，尤其是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -rf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;执行前应该确认当前目录和目标路径：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh my-server &lt;span class="s2"&gt;&amp;#34;pwd &amp;amp;&amp;amp; ls -lah&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="不要在公开内容中暴露敏感信息"&gt;&lt;a href="#%e4%b8%8d%e8%a6%81%e5%9c%a8%e5%85%ac%e5%bc%80%e5%86%85%e5%ae%b9%e4%b8%ad%e6%9a%b4%e9%9c%b2%e6%95%8f%e6%84%9f%e4%bf%a1%e6%81%af" class="header-anchor"&gt;&lt;/a&gt;不要在公开内容中暴露敏感信息
&lt;/h3&gt;&lt;p&gt;不要公开：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;真实服务器 IP&lt;/li&gt;
&lt;li&gt;服务器密码&lt;/li&gt;
&lt;li&gt;私钥内容&lt;/li&gt;
&lt;li&gt;数据库密码&lt;/li&gt;
&lt;li&gt;云厂商 AccessKey&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.env&lt;/code&gt; 里的真实生产配置&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;写教程时可以使用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;your-server-ip
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;your-user
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;your-key
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;your-site
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这些占位符足够说明流程，也不会暴露真实环境。&lt;/p&gt;
&lt;h2 id="十常见问题排查"&gt;&lt;a href="#%e5%8d%81%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98%e6%8e%92%e6%9f%a5" class="header-anchor"&gt;&lt;/a&gt;十、常见问题排查
&lt;/h2&gt;&lt;h3 id="permission-denied"&gt;&lt;a href="#permission-denied" class="header-anchor"&gt;&lt;/a&gt;Permission denied
&lt;/h3&gt;&lt;p&gt;可能原因：&lt;/p&gt;
&lt;ul&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;/ul&gt;
&lt;p&gt;可以先检查：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls -lah ~/.ssh/your-key
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod &lt;span class="m"&gt;600&lt;/span&gt; ~/.ssh/your-key
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="connection-refused"&gt;&lt;a href="#connection-refused" class="header-anchor"&gt;&lt;/a&gt;Connection refused
&lt;/h3&gt;&lt;p&gt;可能原因：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SSH 服务没有启动&lt;/li&gt;
&lt;li&gt;端口写错&lt;/li&gt;
&lt;li&gt;安全组没有开放 SSH 端口&lt;/li&gt;
&lt;li&gt;服务器防火墙拦截&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可以从云服务器控制台检查安全组和防火墙配置。&lt;/p&gt;
&lt;h3 id="operation-timed-out"&gt;&lt;a href="#operation-timed-out" class="header-anchor"&gt;&lt;/a&gt;Operation timed out
&lt;/h3&gt;&lt;p&gt;可能原因：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;服务器 IP 不通&lt;/li&gt;
&lt;li&gt;本地网络异常&lt;/li&gt;
&lt;li&gt;云服务器安全组未放行&lt;/li&gt;
&lt;li&gt;服务器已经关机&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可以先尝试：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ping your-server-ip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果禁用了 ping，也可以直接测试 SSH：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -v my-server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;-v&lt;/code&gt; 会输出更详细的连接日志，方便排查问题。&lt;/p&gt;
&lt;h2 id="十一我的推荐流程"&gt;&lt;a href="#%e5%8d%81%e4%b8%80%e6%88%91%e7%9a%84%e6%8e%a8%e8%8d%90%e6%b5%81%e7%a8%8b" class="header-anchor"&gt;&lt;/a&gt;十一、我的推荐流程
&lt;/h2&gt;&lt;p&gt;日常使用时，我更推荐这个流程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;本地生成或准备 SSH 私钥&lt;/li&gt;
&lt;li&gt;把公钥配置到服务器&lt;/li&gt;
&lt;li&gt;在 &lt;code&gt;~/.ssh/config&lt;/code&gt; 中配置服务器别名&lt;/li&gt;
&lt;li&gt;本地用 &lt;code&gt;ssh my-server&lt;/code&gt; 测试连接&lt;/li&gt;
&lt;li&gt;在 Codex 中让它通过 &lt;code&gt;ssh my-server &amp;quot;命令&amp;quot;&lt;/code&gt; 执行远程检查&lt;/li&gt;
&lt;li&gt;对重复操作写部署脚本或维护脚本&lt;/li&gt;
&lt;li&gt;公开笔记只写占位符，不写真实服务器信息&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这样做的好处是：连接命令短，远程操作清晰，迁移到新电脑时也容易恢复。&lt;/p&gt;
&lt;h2 id="十二命令速查"&gt;&lt;a href="#%e5%8d%81%e4%ba%8c%e5%91%bd%e4%bb%a4%e9%80%9f%e6%9f%a5" class="header-anchor"&gt;&lt;/a&gt;十二、命令速查
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&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;code&gt;ssh -i ~/.ssh/your-key your-user@your-server-ip&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;使用私钥连接服务器&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ssh my-server&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;使用 SSH Config 别名连接服务器&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ssh my-server &amp;quot;pwd&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;在服务器上执行单条命令&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ssh my-server &amp;quot;df -h&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;查看服务器磁盘空间&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ssh my-server &amp;quot;free -h&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;查看服务器内存&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ssh my-server &amp;quot;systemctl status nginx&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;查看 Nginx 状态&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ssh my-server &amp;quot;nginx -t&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;检查 Nginx 配置&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ssh -v my-server&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;输出详细 SSH 连接日志&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;rsync -az --delete ./public/ my-server:/data/www/your-site/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;同步本地静态文件到服务器&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;把 SSH 连接配置好之后，Codex 就可以像一个本地终端助手一样，帮你查看服务器状态、分析报错、执行部署和整理操作记录。真正要注意的是边界：公开内容用占位符，真实密钥和生产配置只留在本地。&lt;/p&gt;</description></item></channel></rss>