当你通过 ssh, scp, rsync 等工具对远程服务器(如 VPS、联网的远程桌面)进行作业时,常会遇见以下情况。

  • 首次登录远端时,本地计算机不识别远方桌面,所以会提示是否继续连接。输入 yes 回车后,远方服务器就会被记录在案。本地的 ~/.ssh/known_hosts 中同时会添加一条指纹记录,当下次登录就不会再有是否连接 (yes/no) 的提示。
  • 其后每次登录远端时,都需要输入远方服务器的用户密码。每次重复相同的操作不仅输入不方便,也为运行自动化脚本带来障碍。

下面给出免密登录远端的方法。一般来说,远端需要保存本地计算机的 ssh 公钥,才能让 ssh 相关工具进行免密操作。如通过 git push 到远端的情形,除非使用 Http 协议,否则远端就需要本地的 ssh 公钥才能免密完成 push。

关于 SSH 密钥

如下查看 ~/.ssh 目录(ls -al ~/.ssh),其权限必须为 700;目录中文件 id_rsa 为私钥,权限必须是 600;文件 id_rsa.pub 为公钥,known_hosts 是远程计算机的指纹识别文件,这两个文件权限可以是 644。私钥需要自己妥善保留,公钥授权给可信任的远程服务器。

1
2
3
4
5
6
7
drwx------   2 abc abc 4096 3月   9 13:00 .
drwxr-xr-x 120 abc abc 4096 3月   9 18:11 ..
-rw-rw-r--   1 abc abc  390 5月   9 13:00 authorized_keys
-rw-r--r--   1 abc abc  110 3月   9 13:17 config
-rw-------   1 abc abc 1811 3月   7 14:57 id_rsa
-rw-r--r--   1 abc abc  390 3月   7 14:57 id_rsa.pub
-rw-r--r--   1 abc abc  444 3月   8 23:07 known_hosts

若是不存在密钥文件,可以通过 ssh-keygen -o 或是 ssh-keygen -t rsa -C “abc@gmail.com” 命令生成一对密钥,后者指定用 rsa 密码,并加上自己的邮箱。

向远程服务器授权

只需完成以下操作,即可免去登录远端服务器时输入密码的麻烦。下面以远端 192.168.1.123 上的 root 用户为例:

  1. 在本地生成授权文件:cat ~/.ssh/id_rsa.pub » ~/.ssh/authorized_keys
  2. 将授权文件拷贝到远端:rsync ~/.ssh/authorized_keys root@192.168.1.123:/root/.ssh/

第 2 步也可以使用 scp 工具将公钥授权文件 authorized_keys 拷贝到远端的 ~/.ssh 文件夹中。若是远端没有此文件夹,则拷贝不成功,需登录远端新建 ~/.ssh 文件夹。使用 rsync 命令则没有这个问题,同步工具可自动构建对应的目录结构。

当然在执行第 2 步时仍须输入密码,但之后就不用了。在能够实现免密远程作业时,就可以编写自动处理脚本提高工作效率,例如在 VPS 上自动部署静态博客网页。

除了 git 工具,常用的 远程作业命令 如下:

  • ssh:从本地登录远程用户的工具。用法:ssh root@192.168.1.123,其中 root 为用户名,后面是远端 ip 地址或者域名。
  • scp:双向远程拷贝工具。用法:scp path1 root@192.168.1.123:path2 从本地拷贝到远端,path1 为本地路径,path2 为远端路径。
  • rsync:双向远程同步工具。用法:rsync path1 root@192.168.1.123:path2 从本地同步到远端。

本文参考《远程连接服务器—SSH详解》。