来源:http://codinn.com/people/guoqiao/notes/110917/

引言

如果你维护着一台linux服务器, 你会经常需要ssh远程登录过去,进行一些操作.
每次都要输入 ssh user@10.10.20.223 这样的内容以及密码 OOXX#*&^%, 是一件很浪费时间的事.
如果你不幸要维护多台机器, 通常这些机器的用户名,密码,ip各不相同,那会更加伤脑筋.
假如你可以给每台机器定义一个别名, 并且让系统帮你记住对应的用户名和密码, 那就方便多了.
然后你就可以像下面这样登录远程服务器了:

ssh 223

以下文档介绍实现的步骤.

生成本地密钥

首先需要在本地生成自己的密钥:

ssh-keygen -t rsa -C "youremail@foobar.com"

这个过程中会询问你存放密钥的路径, 保持默认即可, 也就是 ~/.ssh.

接下来会询问你要不要为密钥创建口令(passphrase), 如果你对安全性要求不是特别高, 可以直接回车, 设为空.

具体的步骤可参考github的ssh设置教程.

结束后, 控制台会打印出密钥的指纹(finger print), 以及随机字符画(randomart image).

指纹就是你的密钥的md5码, 是为了防止"中间人攻击",用来确认远程主机身份的.

这部分的详细知识可以参考这里: 阮一峰: SSH原理与运用(一):远程登录

此时, 在你的~/.ssh目录下, 你可以看到如下文件:

qguo@psyche:~/.ssh$ ls
id_rsa  id_rsa.pub  known_hosts

这三个文件分别存储私钥, 公钥, 远程主机公钥

配置别名和账号

你可以在~/.ssh目录下创建如下的配置文件config, 以我们部门的四台服务器为例:

Host 220
HostName 10.10.20.220
User spig

Host 221
HostName 10.10.20.221
User user

Host 223
HostName 10.10.20.223
User user

Host 224
HostName 10.10.20.224
User spig

Host 是别名, HostName 是主机名或IP, User则是该机器的用户名

让远程主机记住你

用如下的命令, 就可以让远程主机记住你:

ssh-copy-id 223

这里的220是上一步中config文件中创建的别名, 完整的格式是:

ssh-copy-id spig@10.10.20.223

这个命令的意思是将本地的公钥(前面生成的id_rsa.pub)拷贝到远程主机.

此时还是要输入密码来校验身份. 控制台会打印出远程主机的指纹, 让用户核对, 以防止有人截获了用户请求, 然后伪装成远程主机, 骗取用户的密码. 也就是"中间人攻击".

如果你确实想要核对, 那么你需要知道远程主机的真实指纹. 你要如何获取呢? 通常的做法是在网站上张贴, 跟下载文件时的md5校验是一样的.

通常不会有问题, 直接输入yes即可.

公钥拷贝过去后, 当你下次尝试登录该主机时, 它会使用你的公钥加密一个随机字符串, 然后发给你的机器, 并要求你用本地的私钥解密, 再发回给它. 如果解密成功, 则通过验证.

这个过程都是在后台进行, 用户不需要输入任何东西. 这样记住密码的功能就实现了.

你可以使用下面的脚本将你的公钥拷贝到每台远程主机:

#! /bin/bash                                                                
ssh-copy-id spig@10.10.20.220
ssh-copy-id user@10.10.20.221
ssh-copy-id user@10.10.20.223
ssh-copy-id spig@10.10.20.224

依次按要求输入各自的密码即可.

以后, 你就可以像下面这样轻松登录这些主机了:

ssh 223

可能的问题

前面的过程中可能出现如下错误提示:

Agent admitted failure to sign using the key

这通常是因为你本地的ssh-agent没有运行. 执行如下命令即可:

cd ~/.ssh
ssh-agent
ssh-add id_rsa
Logo

更多推荐