SSH 的全称是 Secure Shell ,使用非对称加密方式,传输内容使用 rsa 或者 dsa 加密,可以有效避免网络窃听。有时候,我们需要能免密码登陆 Linux 系统,比如 Hadoop 操作,这时就要开启 SSH 免密码登陆。

注意,不用的用户生成的密钥是不同的,每个用户生成密钥都放在该用户主目录的“.ssh”目录中;比如:root 生成的密钥存放在“/root/.ssh”目录,个人用户的存放在“/home/[username]/.ssh”目录中。

ssh client 有两个配置文件,/etc/ssh/ssh_config 和 ~/.ssh/config,前者是对所有用户,后者是针对特定用户,两个文件的格式是一样的,待会密钥文件会生成在~/.ssh下。

现在进入正题,假设我要在 A 设备(我这里是本地mac OS,其他 linux 系统也都可以)免密码登陆 B 服务器。

第一步:在A中生成密钥

在A进入~/.ssh文件夹,执行以下命令:

ssh-keygen -t rsa

一路回车后,在~/.ssh下会生成 id_rsa,和 id_rsa.pub,其中id_rsa是密钥,id_rsa.pub是公钥。

第二步:把在 A 机生成的 id_rsa.pub 拷贝到 B 机上。

怎么跨主机复制文件呢,下面的命令可以做到:(假设放在 B 的 tmp 目录中)

scp id_rsa.pub root@B:/tmp  //scp -r是拷贝文件夹
# 举个例子:将服务器的/www/api/ 复制到本地的~/www(在本地执行) 
scp -r root@101.200.52.143:/www/api/ ~/www 

第三步:将刚才拷贝的 id_rsa.pub 公钥文件拷贝到 B 的 authorized_keys 目录中(没有就创建,注意权限不能是777,可以设置成700或者400):

cd ~/.ssh
cat /tmp/id_rsa.pub>>authorized_keys

如果需要修改权限,可以执行:

chmod 400 authorized_keys

然后就可以去A上面测试登录了,看是否还需要输入密码,如果直接进入了就表示成功了。

另外,每次登陆都要输入 ssh user@主机 -u -p 太麻烦了,我们可以修改一下 ssh_config 。
按照如下步骤即可:

cd /etc/ssh && sudo vim ssh_config 
# 或者(这个两个目录的都会生效)
cd ~/.ssh && sudo vim config

在其中加入如下代码:

Host service
  HostName 127.0.0.1
  User zhangsan
  IdentifyFile xxx

其中service是别名 127.0.0.1 是你要登陆的服务器,zhangsan是用户, IdentifyFile是密钥,之后直接使用下面的命令就可以通过 ssh 免密登录了,十分方便。

ssh service