ssh服务器修复和免密码登录

起因

周六的时候,科学院停电,所以把服务器给停止了。今天上午重新启动机器,结果很奇怪出了两个问题。

  1. 无法登录部分节点
  2. 修复之后发现每次都要 ssh 输入密码(当然这个是我在前一步排查的时候删除.ssh文件夹导致的)

这里记录下怎么修复故障的。

修复不能登录节点问题

重启机器还是挺简单的,但是需要注意的是顺序问题,先启动home node 然后是其他节点。

但是我没有注意启动home节点的时间问题。事实上,home节点的启动不是机器启动就OK的,而是需要等home节点彻底启动所有的服务,比如 sshd, ftp,PBS这些服务。今天启动的时候出现的问题就是,部分节点早于home节点的所有服务就位启动所以出现了非常严重的故障。机器找不到用户目录也就没办法验证用户的个人设置。

我排查了好久但是始终没有朝这个方向思考问题,所以基本上都没有起到好的效果。很多措施其实没必要。甚至为了确定错误,我在home节点删除了自己的.ssh文件夹。结果导致了下面的第二个问题。当然好在都做到了每次只改动一处地方同时没有效果就回滚,所以也没出大问题。

ssh公钥登录

其实不能说是免密码登录,你在第一次登录进账户的时候还是需要密码的。但是再用该受信任用户身份访问其他节点的时候可以让你不用输入密码。也就是一次验证,处处通行。真正的术语叫做公钥登录。

所谓”公钥登录”,原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。这种方法要求用户必须提供自己的公钥。如果没有现成的,可以直接用ssh-keygen生成一个。

具体的原理相对来说就比较复杂了。参见阮一峰的这篇博客SSH原理与运用(一):远程登录

最后的解决方案很简单就是生成本用户的秘钥,在把公钥存成authorized_keys文件。

简单来说,我们使用如下的命令:

ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub

过程是

  1. ssh user@host,表示登录远程主机,当然远程用户名和本地一致的时候可以省略,直接使用ssh host
  2. mkdir -p .ssh的作用是,如果用户主目录中的.ssh目录不存在,就创建一个。
  3. 'cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub的作用是将本地的公钥文件~/.ssh/id_rsa.pub,重定向追加到远程文件authorized_keys的末尾。

写入authorized_keys文件后,公钥登录的设置就完成了。

Written on March 21, 2016