操作集群执行一些批量任务时,常常会从操作节点访问其他机器,这时免密配置可以减少许多不必要的时间损耗。另一方面,若是集群节点数量众多,手动配置免密时重复输入密码也是很麻烦的事情。这种重复性工作完全可以交给代码去做。而此处用到的重要工具就是 expect。
1 话不多说,代码如下
#vi /usr/tools/keyshare.sh
#generate key
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
#distribute key with corresponding user-host
while read line
do
host=`echo $line | cut -d " " -f1`
user=`echo $line | cut -d " " -f2`
pwd=`echo $line | cut -d " " -f3`
expect <<EOF
set timeout 15
spawn ssh-copy-id $user@$host
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "$pwd\n" }
}
expect "password" { send "$pwd\n" }
EOF
done < ~/.hosts
2 所用到的~/.hosts文件示例内容如下
chdp01 root password
chdp02 root password
chdp03 root password
3 在minimal安装的Centos7上并没有expect工具,执行以下代码手动安装。
yum install -y expect
4 测试如下,此时不用输入密码即可以访问到另一台节点上执行代码了