1)SSH无密码原理
Master(NameNode | JobTracker)作为客户端,要实现无密码公钥认证,连接到服务器Salve(DataNode | Tasktracker)上时,需要在Master上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到所有的Slave上。当Master通过SSH连接Salve时,Salve就会生成一个随机数并用Master的公钥对随机数进行加密,并发送给Master。Master收到加密数之后再用私钥解密,并将解密数回传给Slave,Slave确认解密数无误之后就允许Master进行连接了。这就是一个公钥认证过程,其间不需要用户手工输入密码。
2)Master机器上设置无密码登录
a. Master节点利用ssh-keygen命令生成一个无密码密钥对。
在Master节点上执行以下命令:
ssh-keygen -t rsa -P ''
运行后询问其保存路径时直接回车采用默认路径。生成的密钥对:id_rsa(私钥)和id_rsa.pub(公钥),默认存储在"/home/用户名/.ssh"目录下。
查看"/home/用户名/"下是否有".ssh"文件夹,且".ssh"文件下是否有两个刚生产的无密码密钥对。
b. 接着在Master节点上做如下配置,把id_rsa.pub追加到授权的key里面去。
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
查看下authorized_keys的权限,如果权限不对则利用如下命令设置该文件的权限:
chmod 600 authorized_keys
c. 用root用户登录修改SSH配置文件"/etc/ssh/sshd_config"的下列内容。
检查下面几行前面”#”注释是否取消掉:
RSAAuthentication yes # 启用 RSA 认证
PubkeyAuthentication yes # 启用公钥私钥配对认证方式
AuthorizedKeysFile %h/.ssh/authorized_keys # 公钥文件路径
设置完之后记得重启SSH服务,才能使刚才设置有效。
退出root登录,使用普通用户验证是否设置成功。
从上图中得知无密码登录本级已经设置完毕,接下来的事儿是把公钥复制所
有的Slave机器上。
注意:有时候在测试时可能会出现错误: Agent admitted failure to sign using the key.解决办法是:ssh-add ~/.ssh/id_rsa ,如下所示:
d.使用ssh-copy-id命令将公钥传送到远程主机上(这里以Slave1.Hadoop为例)。
e. 测试是否无密码登录其它机器成功。
到此为止,我们经过5步已经实现了从"Master.Hadoop"到"Slave1.Hadoop"SSH无密码登录,下面就是重复上面的步骤把剩余的两台(Slave2.Hadoop和Slave3.Hadoop)Slave服务器进行配置。这样,我们就完成了"配置Master无密码登录所有的Slave服务器"。
接下来配置所有Slave无密码登录Master,其和Master无密码登录所有Slave原理一样,就是把Slave的公钥追加到Master的".ssh"文件夹下的"authorized_keys"中,记得是追加(>>)。
注意:期间可能会出现一些问题如下:
(1)如果在ssh连接时出现错误“ssh:connect to host port 22: Connection refused”,如下图所示:
则可能是因为远程登录的那台机器没有安装ssh服务或安装了没有开启ssh服务,下面到Slave3.Hadoop主机进行测试:
为了一劳永逸,设置系统启动时开启服务:# systemctl enable sshd.service
(2)如果在用命令ssh-copy-id时发现找不到该命令“ssh-copy-id:Command not found”,则可能是ssh服务的版本太低的原因,比如若你的机器是RedHat系统就可能该问题,解决办法是:手动复制本地的pubkey内容到远程服务器,命令如下:
cat ~/.ssh/id_rsa.pub | ssh hadoop@Master.Hadoop 'cat >> ~/.ssh/authorized_keys'
该命令等价于下面两个命令:
①在本地机器上执行:scp ~/.ssh/id_rsa.pub hadoop@Master.Hadoop:/~
②到远程机器上执行:cat ~/id_rsa.pub >> ~/.ssh/authorized_keys