简单使用!使用shell脚本实现ssh免密登录

目录

1.expect命令:可以在外输入,某些命令执行后弹出的输入提示

2.使用expect命令来创建本地的公钥文件

3.复制ssh的公钥文件到各个主机上:

4.完整的shell脚本:


1.expect命令:可以在外输入,某些命令执行后弹出的输入提示

spawn   shell 命令程序 
expect   "捕获到shell 命令程序执行之后输出的字符串"  
send  "发送给 shell 命令程序的字符串"
[root@localhost .ssh]# ssh-keygen -t rsa -b 1024
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
/root/.ssh/id_rsa already exists.
Overwrite (y/n)? 
/usr/bin/expect << eof

spawn ssh-keygen -t rsa -b 1024

# 开始进连续捕获
# 获取“Overwrite (y/n)?”的提示行,输入“y”表示同意(其中\n是换行符)
expect	{
        ".ssh/id_rsa)"      { send "\n";  }
        "Overwrite (y/n)?"  { send "y\n"; }
}
# 结束捕获
eof

2.完整脚本

#! /bin/bash

host_address=(192.168.174.151 192.168.174.152)           # 客户端们的IP地址
host_hostname=(client1 client2)     # 客户端们的域名
host_username=root                  # ssh连接的用户,控制端的用户为root
host_passwd=110119                  # ssh连接的用户密码

# 安装expect命令
expect -v &> /dev/null
if [ `echo $?` -ne 0 ];then
	echo "没有expect,安装expect命令"
	yum install -y expect
fi

# 配置免密登录
echo "";echo ""
echo "########################## 本地开始配置ssh ##########################"
if [ `test -a ~/.ssh/id_rsa.pub;echo $?` == 0 ];then
	echo "ssh公钥已创建"
else
	echo "ssh公钥未创建,开始创建"
/usr/bin/expect << eof
# 设置捕获字符串后,期待回复的超时时间
set timeout 10

spawn ssh-keygen -t rsa -b 1024

## 开始进连续捕获
expect	{
        "connecting (yes/no)?" { send "yes\n";  exp_continue }
        "s password:"          { send "${host_passwd}\n"; exp_continue }
        ".ssh/id_rsa)"         { send "\n";  exp_continue }
        "Overwrite (y/n)?"     { send "y\n"; exp_continue }
        "no passphrase):"      { send "\n";  exp_continue }
        "passphrase again:"    { send "\n";  exp_continue }
}
eof
fi


# 本地的密钥开始加入被控制主机
for ((j=0;j<2;j++));do
	echo "########################## ${host_address[j]}正在被添加公钥 ##########################"
/usr/bin/expect << eof
# 设置捕获字符串后,期待回复的超时时间
set timeout 10

spawn ssh-copy-id -i /root/.ssh/id_rsa.pub ${host_username}@${host_address[j]}

## 开始进连续捕获
expect	{
        "connecting (yes/no)?" { send "yes\n";  exp_continue }
        "s password:"          { send "${host_passwd}\n"; exp_continue }
}
eof
	echo "############# ${host_address[j]}配置完毕 #############"
	echo "";echo "";echo ""
done


flag_ssh=0
# 测试ssh配置是否成功
for ((j=0;j<2;j++));do
	if [ `ssh ${host_username}@${host_address[j]} -o ConnectTimeout=5 "exit";echo $?` == 0 ];then
		echo "Success: ${host_address[j]}连接成功"
	else
		echo "Failed:  ${host_address[j]}的ssh连接失败,请检查!"
		flag_ssh=1
	fi
done
echo "";echo "";echo ""
if [ ${flag_ssh} == 1 ];then
	echo "############# 已退出 #############"
	exit
fi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值