在上一篇文章中,我们介绍了 `ssh` 命令的基本用法和常用选项。每次都要手动输入繁琐的 IP 地址、用户名、端口号等信息,着实不便。 这时,**SSH Config 文件** 可以一次性解决这些问题。它就像收藏夹一样,保存常用服务器的连接信息,然后通过 **别名(Alias)** 轻松连接。 我在完全不了解 config 文件的“初学者”时期,曾经把常用的命令行直接写进 `.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` 关键字开始,构成一个独立的配置块。 #### 基本结构 ```bash 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} 现在配置已保存,实际连接会更简洁。让我们基于上面的示例来试试。 ### 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`,即可找到相关文章。 有任何疑问,欢迎在评论区提问!