明道学苑

学而不思则罔,思而不学则殆

0%

使用密钥文件实现SSH免密码访问Linux

本文说明如何使用密钥文件实现SSH免密码登陆Linux服务器。

生成密钥文件

首先使用下面的命令在本地机器上生成公钥文件:

ssh-keygen -b 1024 -t dsa -N <yourKeypasswd>

其中<yourKeypasswd>为你使用keyfile时的密码,非必选项,可以提高安全性。

命令正确执行后,将生成私钥、公钥两个文件,正常情况下应该在~/.ssh/目录下:

id_dsa
id_dsa.pub

上传公钥文件到Linux服务器

在shell中使用如下命令上传公钥文件到服务器(可以用域名代替ip):

ssh-copy-id -i ~/.ssh/id_dsa.pub <remote_user>@<ip>

该命令自动将公钥复到<remote_user>用户的~/.ssh/authorized_keys文件中,完成后即可以密钥方式登录。

为不同的服务器配置不同的密钥

出于安全性或者操作上的要求,有时候可能需要使用不同的用户名访问不同的Linux服务器,有两个方法实现这个目标。

方法一:使用ssh-add

生成密钥时指定文件名,<user>替换成你登陆Linux服务器使用的用户名。上传密钥时指定<user>_dsa.pub这个文件名。

ssh-keygen -b 1024 -t dsa -N <yourKeypasswd> -f ~/.ssh/<user>_dsa

然后执行下面的命令:

ssh-add ~/.ssh/<user>_dsa

上传密钥时指定<user>_dsa.pub这个文件名,即可以实现通过<user>用户免密登陆Liux服务器了。

方法二:在SSH config中指定keyfile

如果多个服务器使用的同样的用户名,需要在登陆不同的服务器时使用不同的密钥文件时,方法一就不适用了,方法二可以实现这个目标。方法二时在客户端机器的SSH配置文件中为不同服务器指定

编辑 ~/.ssh/config,加入如下内容:

Host myhost
HostName <ip>
User <username>
identityfile ~/.ssh/<user>_dsa

<ip>是远程服务器的IP,<username>是登陆Linux服务器使用的用户名。<user>_dsa是对应的本地私钥的文件名。

设定config后,ssh登录、scp命令可简化,不需要指定具体user@host,使用配置文件中指定的Host名称即可,如下所示:

ssh myhost
scp test.txt myhost

禁用用户名/密码登录

公共服务器基于安全考虑启用ssh key登陆后禁用用户名/密码登录。

修改ssh config:

sudo nano /etc/ssh/sshd_config

增加(或者修改原来的PasswordAuthentication yes)为下面的内容:

PasswordAuthentication no