ssh实现批量免密登录

使用场景
比如我们在使用ansible批量部署大量服务器的时候,如果一台一台的服务器去分发密钥会很麻烦 所以用脚本实现批量部署免密登录就很现实了。下面的代码亲测成功
但是有一个缺点,缺点就是服务器的密码都是一致的,如果不是一致的,是不成功的。
这里用到了一个软件expect,expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。
expect 自动交互流程:
spawn启动指定进程–expect获取指定关键字–send指定程序发送指定字符 --执行完退出。
expect常用命令总结:

spawn               交互程序开始后面跟命令或者指定程序
expect              获取匹配信息匹配成功则执行expect后面的程序动作
send exp_send       用于发送指定的字符串信息
exp_continue        在expect中多次匹配就需要用到
send_user           用来打印输出 相当于shell中的echo
exit                退出expect脚本
eof                 expect执行结束 退出
set                 定义变量
puts                输出变量
set timeout         设置超时时间

ssh部署免密登录的具体脚本

#!/bin/bash
rpm -q expect
if [ $? -eq 0 ]; then
        echo "已安装"
else
        yum -y install expect
        if [ $? -eq 0 ]; then
                echo "安装成功"
        else
                echo "安装失败"
        fi
fi
#本机是否有ssh密钥 没有则生成
if [ ! -f ~/.ssh/id_rsa ]; then
	echo "请按3次enter健"
	ssh-keygen -t rsa
fi
ssh_expect() {
	expect -c "set timeout -1;
	spawn ssh-copy-id  root@$1

	expect {
		"yes/no" { send -- yes\r;exp_continue;}
		"password:" { send -- $2\r;exp_continue;}
		eof	
	}";
}

[ -f hosts.txt ] && rm -rf hosts.txt

#定义 hosts.txt
cat > hosts.txt << EOF
	10.0.0.42
	10.0.0.43
EOF

passwd=123456

for ip in `cat hosts.txt|awk '{print $1}'`
do
	ssh_expect ${ip} ${passwd}
done

发布了17 篇原创文章 · 获赞 0 · 访问量 204

猜你喜欢

转载自blog.csdn.net/weixin_46164213/article/details/103901670