Linux 客户端使用 rsa-key 不输入密码登录远程 SSH

1. 首先在客户端本机创建一对 rsa 密钥:

ssh-keygen -t rsa

于是,在 ~/.ssh 目录下面,就可以找到刚刚生成的公钥文件 id_rsa.pub,当然还有宝贵的私钥 id_rsa

简单说一下原理,只要将公钥放到被链接的机器对应的目录下,然后拥有私钥的客户机就可以免密码自动登录对方的机器。

所以私钥是需要跟密码一样好好保密的文件,打死不能拷给别人。

2. 将公钥加入服务器的信任列表

刚才生成的 id_rsa.key 文件内容就是一个字符串,只需要将这个字符串放到服务器 ~/.ssh/authorized_keys 这个文件中,服务器就信任这个公钥了。

如果多个公钥,可以一行一个,使用 >> 简单追加即可。

我们可以用远程的操作来完成这一系列动作,现在用一个 shell 脚本来解决战斗:

ssh_login() {
mkdir -p ~/.ssh;
[ ! -f ~/.ssh/id_rsa.pub ] && ssh-keygen -t rsa -f ~/.ssh/id_rsa -N ''; 
pub_key=$(cat ~/.ssh/id_rsa.pub)
ssh $@ -T <<EOF
mkdir -m 700 -p ~/.ssh
echo "${pub_key}" >> ~/.ssh/authorized_keys
EOF
}
Updates: 20151203

后来发现这个其实放在 ~/.bashrc 里面更加靠谱,简化成这个函数,放在 ~/.bashrc 里即可:


将这个内容写到文件 ssh_login.sh 中,授予执行权限,然后通过下面的办法使用:

./ssh_login -p [port] root@www.example.com

参数可以完全参照 ssh 的参数。

按照这样执行这个脚本,第一次输入一次密码,就会自动生成一个公钥到服务器和本机,下次 ssh 的时候就不需要再次输入密码了。

3. 错误排查

注意:/etc/ssh/sshd_config 这个配置文件里面,确保下面的这些配置正常:

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys

注意:服务器端的 .ssh 文件夹权限必须为 700,authorized_keys 的文件权限必须为 600,否则会不生效

如果还是不行,可能需要重启一下终端,可以使用其他 tty 进行尝试,我曾经一直卡住,但是重启之后问题就解决了。

更多的调试信息可以参考这个问题:http://stackoverflow.com/a/6377073/2544762

关于 SELinux 的问题

SELinux 可能会挡住不让 authorized_keys 产生作用。

具体需要执行以下如下这句:

restorecon -R -v /root/.ssh

参见:http://stackoverflow.com/a/21636460/2544762http://www.linuxidc.com/Linux/2013-07/87267.htm

实在还有问题的话,可以自己开一个另外端口的 sshd 进程:

/usr/sbin/sshd -d -p 1234

然后再远程 ssh 上去这个端口就可以看到错误调试信息了。


【转载请附】愿以此功德,回向 >>

原文链接:https://www.huangwenchao.com.cn/2015/11/linux-rsa-ssh.html【Linux 客户端使用 rsa-key 不输入密码登录远程 SSH】

发表评论

电子邮件地址不会被公开。 必填项已用*标注