完美解决使用expect实现ssh免交互推送公钥过程不显示

我的解决方案是将expect的执行代码放在一个函数中,之后通过bash的方式,将函数的执行过程放到垃圾桶去(/dev/null),具体代码如下:

#!/usr/bin/bash
# 判断expect是否安装,没有安装则自动安装
rpm -q expect &>/dev/null
if [ $? -ne 0 ];then
	echo "installing expect ..."
	yum install -y expect &>/dev/null
	echo "installed ..."
fi
# 判断ssh秘钥文件是否存在,不存在则自动创建
if [ ! -f ~/.ssh/id_rsa ];then
	echo "create id_rsa and id_rsa.pub file..."
	ssh-keygen  -t rsa -P "" -f ~/.ssh/id_rsa &>/dev/null
	echo "created successful!"
fi
>ip.txt  # 用于保存可以ping通的ip地址,此处先清空文件内容
# 定义相关变量
password=1   # 定义ssh登录密码
thread=10	 # 定义执行的进程数量
fifodir=/tmp/fifo.txt  # 定义管道文件
mkfifo $fifodir   # 创建管道文件
exec 8<>$fifodir  # 开启fd
rm -f $fifodir	  # 删除管道文件
# 为管道文件赋值
for i in `seq $thread`
do
	echo >&8
done
# 执行expect代码的函数
function f_pk(){
# 小括号表示在子shell中执行代码,即在执行这个函数时,重新打开一个shell去执行
(
	expect -c "   # -c选项表示在命令行中执行
	spawn ssh-copy-id $1   # 开启一个会话,推送公钥文件
	set timeout 10  # 定义超时时间
	expect {
	# 如果匹配找到"yes/no"字符串,选yes
		\"yes/no\" { send \"yes\n\";exp_continue }
	# 如果匹配到"password"字符串,填之前定义好的密码
		\"password:\" { send \"$password\r\"};
	}
	# 结束expect
	expect eof
"
)
}
# 公钥推送
echo "pushing ..."
for i in {1..10}
do
	# 读取fifo文件中的一个进程
	read -u 8
	{
	ip=10.0.0.$i  # 定义要推送的ip地址
	# 判断那些ip能ping通
	ping -c1 -W1 $ip &>/dev/null
	if [ $? -eq 0 ];then
		# 将ping通的代码房在ip.txt文件中
		echo "$ip" >> ip.txt
		# 此处就是实现不显示执行过程的关键代码
		f_pk $ip &>/dev/null # 向能ping通的主机通过f_pk函数推送公钥
	fi
	# 进程读一个少一个,因此需要重新读取一个
	echo >&8
	}&
done
# 等待后台执行完成
wait
# 关闭fd
exec 8<&-
echo "push successful.."
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值