无论是基于测试还是维护,日常工作中常常需要频繁登录到某台服务器,除了使用第三方软件记录密码外,还可以通过 SSH-Key 实现免密登录。

创建 SSH 密钥

SSH 采用非对称加密技术,认证密钥包含两部分:公钥和私钥,公钥用于远程服务器,私钥存于本地,因此如果想实现免密登录需要先创建密钥:

# 创建密钥,指定加密算法为 rsa
ssh-keygen -t rsa

Generating public/private rsa key pair.
# 一路 Enter 键
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
# 提示私钥和公钥的保存位置
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
...................

可以用命令cat查看公钥内容:

cat ~/.ssh/id_rsa.pub

保存至服务端

前文提过公钥用于远程服务器,因此需把公钥拷贝到远程服务器~/.ssh/authorized_keys文件中。最常规的方法是通过 ssh 连接后把id_rsa.pub的内容手动复制到远程服务器,不过这里打算用另一种方式实现:

ssh root@10.1.1.42 \
"cat >> ~/.ssh/authorized_keys" < ~/.ssh/id_rsa.pub
root@10.1.1.42's password:

当然还有一种更为简洁和优雅的方法,可以直接将公钥自动添加到远程服务器上:

# 使用 ssh-copy-id 命令实现
ssh-copy-id root@10.1.1.42

现在输入ssh root@10.1.1.42便可以实现免密登录,上面两种方法的效果是一样的。

注:

  • authorized_keys 文件如果不存在,需手动创建;
  • 如果端口不是默认 22,连接时均需另行指定;

更进一步

既然不用密码便可自动登录 SSH,我们可以更进一步把输入账号和 IP 的步骤也一起省略:

# 先用 vi 编辑 ~/.ssh/config 
Host zwy # 连接时的名称
    HostName 10.1.1.42
    User root
    Port 2222 # 如果是默认端口可省略

保存后配合之前的免密登录,连接 shh 不要太简单了:

ssh zwy

参考


本周语录

琐事就是运维服务中手动性的,重复性的,可以被自动化的,战术性,没有持久价值的工作。

———— 《SRE:Google 运维解密》