跳转到内容

SSH 远程连接入门

SSH(Secure Shell)是远程登录 Linux 主机最主流的协议,在不安全的公共网络上,为客户端和远程主机之间的通信提供加密和身份验证。日常说的“连服务器”,绝大多数情况下就是通过 SSH 建立的连接。

Terminal window
ssh username@hostname # 使用密码登录
ssh username@hostname -p 2222 # 指定非默认端口(SSH 默认端口为 22)

首次连接一台此前从未连接过的主机时,客户端会显示这台主机的公钥指纹,并询问是否信任、继续连接——这是 SSH 防止连接被中间人劫持的机制之一,确认后指纹会被记录到本机的 ~/.ssh/known_hosts 文件中,之后再次连接同一台主机不会重复询问,但如果对方主机的密钥发生变化(可能意味着遭遇了中间人攻击,也可能只是主机重装或密钥被主动更换),会收到明显的警告提示。

密码登录需要每次连接手动输入远程主机的用户密码,除了操作繁琐之外,也存在密码可能被暴力破解的风险。密钥登录基于非对称加密,是更推荐的方式:

  1. 在本机生成一对密钥(私钥和公钥):ssh-keygen -t ed25519,按提示选择保存路径(默认即可),可以选择性设置一个密钥口令(Passphrase)
  2. 把公钥内容添加到远程主机的 ~/.ssh/authorized_keys 文件中,最简单的方式是执行 ssh-copy-id username@hostname,它会自动完成这一步
  3. 之后再连接这台主机,客户端会用本机的私钥完成一次加密握手证明身份,不再需要输入远程主机的密码

私钥文件(默认是 ~/.ssh/id_ed25519)绝对不应该离开本机、也不应该分享给他人——公钥可以公开,私钥是身份凭证本身。设置密钥口令,是为了防止私钥文件本身被盗(例如设备丢失)之后被直接冒用;口令本身只在本机验证,不会经过网络传输。

需要经常连接同一台主机、或者需要维护多台主机的连接信息时,把连接参数写进 ~/.ssh/config 文件比每次手动拼接完整命令更高效:

Host myserver
HostName 203.0.113.10
User deploy
Port 2222
IdentityFile ~/.ssh/id_ed25519

配置好之后,直接执行 ssh myserver 即可,Host 后面的名称是本地起的别名,HostName 才是实际连接的地址。这个文件可以为不同主机分别配置对应的用户名、端口、私钥路径,避免每次都要输入完整参数。

  • 文件夹~/.ssh/
    • id_ed25519 私钥,权限必须严格限制
    • id_ed25519.pub 公钥,可以公开分享
    • known_hosts 记录已连接过的主机指纹
    • config 主机别名与连接参数配置

SSH 连接的信任关系由两部分组成:本机通过 known_hosts 确认远程主机身份没有被冒充,远程主机通过密码或密钥确认发起连接的一方拥有相应凭证。密钥登录相比密码登录,在安全性和使用便利性上都更有优势,是绝大多数正式使用场景下的推荐做法。