上一篇文章中我们介绍了 `ssh` 命令的基本用法和常用选项。可是每次都要手动输入繁琐的 IP、用户名、端口号等,实在是麻烦。 这时 **SSH Config 文件** 就能一次性解决这些问题。它就像收藏夹一样,把常用服务器的连接信息保存下来,然后用 **别名(Alias)** 轻松访问。 我在完全不知晓 config 文件的“初学者”时期,曾把常用的 ssh 命令直接写进 `.bashrc` 的 alias 中。后来学会了 config 文件后,才意识到自己当时的做法有多么低效。 ![SSH config存在感到惊叹的我](/media/whitedec/blog_img/ssh_config_favorite_style.webp) --- ## SSH Config 文件是什么? {#sec-481141e7802b} **SSH Config 文件** 是用来定制 SSH 客户端行为的配置文件。把特定主机的连接信息(用户名、端口、使用的密钥文件等)预先保存,之后只需使用短别名即可连接。 * **位置**:通常位于用户主目录下的 `.ssh` 文件夹中,文件名为 `config`。如果你刚安装 SSH,可能还没有这个文件,需要手动创建。 * **文件创建**:如果 `~/.ssh/config` 不存在,可以直接创建。**务必将权限设置为 600**。 ```bash touch ~/.ssh/config chmod 600 ~/.ssh/config # 为安全起见,必须设置权限! ``` --- ## Config 文件编写规则 {#sec-a6ba2fff88f5} Config 文件是一个简单的文本文件,每个主机的设置以 `Host` 关键字开始,形成块结构。 #### 基本结构 ``` Host [别名] [选项1] [值1] [选项2] [值2] ... ``` * **`Host [别名]`**:标识块的开始,并定义你将使用的 **别名(Alias)**。你也可以直接写实际的主机地址(IP 或域名),甚至使用通配符(`*`、`?`)。 * **缩进**:`Host` 下的选项必须缩进。空格或制表符都可以,但保持一致性更好。 * **选项**:在 `Host` 下列出你想在使用该别名时应用的各种 SSH 选项。它们与 `ssh -选项` 的用法相同。 ### 常用选项 {#sec-488803d47bdf} | | | | | --- | --- | --- | | **选项** | **说明** | **示例值** | | `HostName` | 实际连接的服务器 IP 或域名 | `192.168.1.100` 或 `example.com` | | `User` | 远程服务器的用户名 | `ubuntu`、`ec2-user`、`root` | | `Port` | 远程服务器的 SSH 端口(默认 22) | `2222` | | `IdentityFile` | 连接时使用的私钥文件路径 | `~/.ssh/id_ed25519_myserver` | | `ForwardAgent` | 启用 SSH 代理转发(`ssh-agent`) | `yes` | | `StrictHostKeyChecking` | 是否严格检查主机密钥(推荐 `yes`) | `no`(初期测试时临时使用) | | `PortForwarding` | 是否允许端口转发 | `yes` | | `LocalForward` | 本地端口转发设置(等同 `-L`) | `8080 localhost:80` | | `ServerAliveInterval` | 检查服务器存活的间隔(秒) | `60` | | `ServerAliveCountMax` | 失败后重试次数 | `3` | --- ## SSH Config 文件编写示例 {#sec-92c9daf3ee29} 让我们把常用的一些服务器添加到 `~/.ssh/config`。 ```ini # 第一个服务器:Web 服务器(别名:webserver) Host webserver HostName 192.168.1.100 User ubuntu Port 2222 IdentityFile ~/.ssh/id_ed25519_webserver # 使用专属密钥 # 第二个服务器:开发服务器(别名:devbox) Host devbox HostName dev.example.com User developer IdentityFile ~/.ssh/id_rsa_dev # RSA 密钥 # 连接时将本地 8000 端口转发到远程 80 端口 LocalForward 8000 localhost:80 # 第三个服务器:所有 AWS EC2 服务器(别名:aws-*) Host aws-* User ec2-user IdentityFile ~/.ssh/aws_ec2_key.pem # 防止连接中断,定期发送信号 ServerAliveInterval 60 ServerAliveCountMax 3 # 特定 IP 段的通用设置(别名:10.0.0.*) Host 10.0.0.* User admin Port 22 ``` **说明**: * `webserver`:使用 `ubuntu` 用户、`2222` 端口和 `id_ed25519_webserver` 密钥连接 `192.168.1.100`。 * `devbox`:使用 `developer` 用户、`id_rsa_dev` 密钥连接 `dev.example.com`,并将本地 8000 端口转发到远程 80 端口。 * `aws-*`:所有以 `aws-` 开头的别名都会使用 `ec2-user` 和 `aws_ec2_key.pem`,并保持连接活跃。 * `10.0.0.*`:匹配 `10.0.0.x` 形式的 IP,默认使用 `admin` 用户和 22 端口。 > 事实上,我很少使用 `*` 通配符。通常我会为每台服务器单独配置 1:1 的映射,便于管理。
> **如果同一台服务器需要不同配置**,我会为每种情况添加一个别名,像点餐一样挑选别名后 `ssh my-alias` 即可。 --- ![点击 SSH 连接按钮,网络中扩散的魔法图像](/media/whitedec/blog_img/ssh_config_network_magic.webp) ## 如何使用 Config 文件 {#sec-e176d1ccdfce} 保存好 Config 后,实际连接会变得更简单。让我们基于上面的示例来试试。 ### 1. 用别名连接 {#sec-b0810f8f4908} 只需使用别名即可。 * **使用 `webserver` 别名**: ```bash ssh webserver Enter passphrase for key '/home/youruser/.ssh/id_ed25519_webserver': ubuntu@webserver-ip:~ $ ``` > 这条命令内部等价于 `ssh -p 2222 -i ~/.ssh/id_ed25519_webserver ubuntu@192.168.1.100`。 * **使用 `devbox` 别名**: ```bash ssh devbox Enter passphrase for key '/home/youruser/.ssh/id_rsa_dev': developer@devbox-domain:~ $ ``` > (同时本地 8000 端口会转发到 dev.example.com 的 80 端口) --- ## Config 文件的优势 {#sec-2c234f7e8725} * **便利性**:用短别名替代冗长命令,减少输入错误,节省时间。 * **生产力**:频繁访问的服务器可以快速切换,提升工作效率。 * **易于管理**:所有连接设置集中在一个文件,维护更简单。服务器 IP 变更时,只需改动 Config 即可。 * **安全性**:敏感信息(如密钥路径)不再出现在命令历史中。 --- ## 结语 {#sec-9c659c3d712e} SSH Config 文件是每位使用 SSH 的开发者和系统管理员必备的工具。通过它,你可以让 SSH 连接体验更便捷、更高效。打开 `~/.ssh/config`,为你常用的服务器创建别名吧! 如果你想了解更多关于 SSH 的内容,右侧搜索框中输入 `ssh`,即可找到相关文章。 有任何疑问,欢迎在评论区提问!