shell批量推送公钥脚本

写一个脚本,将跳板机上yunwei用户的公钥推送到局域网内可以ping通的所有机器上

说明:主机和密码文件已经提供

#!/bin/env bash
#判断公钥是否存在
[ ! -f /home/yunwei/.ssh/id_rsa ] && ssh-keygen -P '' -f ~/.ssh/id_rsa
#循环判断主机是否ping通,如果ping通推送公钥
ip=/home/yunwei/ip.txt
for i in `cat $ip`
do
    ip=`echo $i|cut -d: -f1`
    pass=`echo $i|cut -d: -f2`
    ping -c1 $ip &>/dev/null
    if [ $? -eq 0 ];then
        echo $ip >> /home/yunwei/ipup.txt
	expect <<-EOF &>/dev/null
	spawn ssh-copy-id root@$ip
        expect {
               "yes/no" { send "yes
";exp_continue }
 	       "password" { send "${pass}
" }
           }
	expect eof
	EOF
    else 
        echo $ip >> /home/yunwei/ipdown.txt
fi
done
wait
echo "公钥已经推送完毕,正在测试...."
remote_ip=`tail -1 /home/yunwei/ipup.txt`
ssh root@$remote_ip hostname &>/dev/null
test $? -eq 0 && echo "公钥成功推送完毕"

写法二,支持并发

#!/bin/bash
#判断公钥是否存在
[ ! -f /home/yunwei/.ssh/id_rsa ] && ssh-keygen -P '' -f ~/.ssh/id_rsa

#循环判断主机是否ping通,如果ping通推送公钥
tr ':' ' ' < /home/yunwei/ip.txt|while read ip pass
do
{
        ping -c1 $ip &>/dev/null
        if [ $? -eq 0 ];then
        echo $ip >> ~/ip_up.txt
        /usr/bin/expect <<-END &>/dev/null
         spawn ssh-copy-id root@$ip
         expect {
                "yes/no" { send "yes
";exp_continue }
                "password:" { send "$pass
" }
                }
        expect eof
        END
        fi
}&
done
wait
echo "公钥已经推送完毕,正在测试...."
#测试验证
remote_ip=`tail -1 ~/ip_up.txt`
ssh root@$remote_ip hostname &>/dev/null
test $? -eq 0 && echo "公钥成功推送完毕"
原文地址:https://www.cnblogs.com/caidingyu/p/14053874.html