前言: SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working
Group)所制定;SSH 为建立在 应用层和传输层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的
协议。在Hadoop集群或其他集群中广泛应用用,可用于机器之间免密码登录和执行脚本,如的Hadoop集群中
NameNode启动的时候会远程执行脚本把集群中DataNode的也一起启动起来。
首先应该安装ssh服务,一般CentOS和fedora等发行版系统默认安装好了ssh服务,如果没有安装那么可 以使用yum
如果是Ubuntu可以使用
install openssh-serverapt-get install openssh-server
安装
对于集群间免密的设置也很简单,只要知道原理就好做了,分别在每台机器上按照上面配置本地免密登录,然后将其余每台机器生成的~/.ssh/id_dsa.pub公钥内容追加到其中一台主机的authorized_keys中,然后将这台机器中包括每台机器公钥的authorized_keys文件发送到集群中所有的服务器;这样集群中每台服务器都拥有所有服务器的公钥,这样集群间任意两台机器都可以实现免密登录了。
免密的核心思想就是:如果B服务器authorized_keys有A服务器的公钥(锁),那么A服务器可以免密登录B服务器。
首先保证主机名、hosts、防火墙正确设置
一、A服务器免密登录集群下任意一台服务器(集群中服务器都有A服务器公钥【锁】)
1、配置A服务器本身公钥和免密
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
现在每台节点本身实现免密
2、实现免密登录(复制锁)
方法一:将A服务器的公钥注册到其他集群服务器上(手动配置)
ssh-copy-id -i ~/.ssh/id_dsa.pub 192.168.100.12(IP地址) # 在集群其他服务器上执行
yes
输入其他服务器密码
方法二:编写Shell脚本自动注册到其他集群服务器上
编写shell脚本自动执行
vi nopass.sh #分发脚本
#!/bin/bash
SERVERS="192.168.100.13 192.168.100.14 192.168.100.15 192.168.100.16 192.168.100.17"
PASSWORD=root
auto_ssh_copy_id() {
expect -c "set timeout -1;
spawn ssh-copy-id $1;
expect {
*(yes/no)* {send -- yes\r;exp_continue;}
*assword:* {send -- $2\r;exp_continue;}
eof {exit 0;}
}";
}
ssh_copy_id_to_all() {
for SERVER in $SERVERS
do
auto_ssh_copy_id $SERVER $PASSWORD
done
}
ssh_copy_id_to_all
3)修改文件执行权限
chmod +700 nopass.sh
4)运行,进入脚本目录下
./nopass.sh
若显示:
./nopass.sh:行4: expect: 未找到命令
需要安装expect,可以:yum install expect
二、集群所有节点互相免密(集群中任意服务器都有其他服务器公钥【锁】)
1、配置所有各自服务器本身公钥和免密
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
现在每台节点本身实现免密
2、将除A服务器之外所有节点的公钥复制到A上,这里是将hadoop2,hadoop3的公钥拷贝到A的authorized_keys,目的是实现hadoop2,hadoop3登录A实现免密,而反过来不行
ssh-copy-id -i ~/.ssh/id_dsa.pub 192.168.100.11 # 在hadoop2上执行
ssh-copy-id -i ~/.ssh/id_dsa.pub 192.168.100.11 # 在hadoop3上执行
...
3、实现最终集群所有节点互相免密
方法一:手动
现在hadoop1(A)保存了所有节点的公钥,那么这个时候应该发送hadoop1上的authorized_keys到其他节点
scp ~/.ssh/authorized_keys 192.168.100.12:~/.ssh/
scp ~/.ssh/authorized_keys 192.168.100.13:~/.ssh/
方法一:自动
编写shell脚本自动执行
vi nopass.sh #分发脚本
#!/bin/bash
SERVERS="192.168.100.13 192.168.100.14 192.168.100.15 192.168.100.16 192.168.100.17"
PASSWORD=root
auto_ssh_copy_id() {
expect -c "set timeout -1;
spawn ssh-copy-id $1;
expect {
*(yes/no)* {send -- yes\r;exp_continue;}
*assword:* {send -- $2\r;exp_continue;}
eof {exit 0;}
}";
}
ssh_copy_id_to_all() {
for SERVER in $SERVERS
do
auto_ssh_copy_id $SERVER $PASSWORD
done
}
ssh_copy_id_to_all
for SERVER in $SERVERS
do
scp ~/.ssh/authorized_keys root@$SERVER:~/.ssh/
done
3)修改文件执行权限
chmod +700 nopass.sh
4)运行,进入脚本目录下
./nopass.sh