ma_be.sh
#!/bin/bash #nmap -sP 192.168.30.0/24 |grep 192|awk '{print $5}' >ip_list #扫描一个网段,将Ip地址或者主机名保存到ip_list文件中 user="watson" password="watson@123" root_passwd="*********" pwd_dir=`pwd` #获取当前执行路径 network=$1 #获取脚本执行参数 #root_passwd="**********" ################################################################################## # # root用户执行nmap命令,扫描主机 # 使用nmap -sP ################################################################################### function Root_nmap(){ if [[ $network == '' ]] then echo "请输入一个网络参数!"&& exit 1 fi /usr/bin/expect <<-EOF set time 60 spawn su - root expect { "*yes/no" { send "yes "; exp_continue } "*Password:" { send "$root_passwd " } } expect "*#" { send "cd $pwd_dir && bash get_ip.sh $network " } expect "*#" { send "exit " } interact expect eof EOF } ################################################################################ # # 对ip_list里面的文件进行处理,查看那些IP可以使用 # ################################################################################ function Believe_hosts(){ rm -rf $hosts && touch $hosts rm -rf $hosts_windows && touch $hosts_windows rm -rf $hosts_password_errors &&touch $hosts_password_errors rm -rf $hosts_others&& touch $hosts_others ip_num=`cat $ip_list|wc -l` #echo $ip_num&&exit for i in `seq 1 $ip_num` do #读取ip_list里面的ip地址 ip=`cat $ip_list |sed -n $i'p'|awk '{print $1}'` #sshpass -p $password scp believe.sh $user@$ip:/tmp/ >/dev/null sshpass -p $password scp saomiao $user@$ip:/tmp/ >/dev/null re=$? #上一条命令的执行结果 if [ $re -eq 0 ] #执行结果为0,表示可以建立信任关系 then # sshpass -p $password ssh $user@$ip -o StrictHostKeyChecking=no "bash /tmp/believe.sh" echo $ip >> $hosts elif [ $re -eq 1 ] #执行结果为1,表示可能为windows机器 then echo $ip >>$hosts_windows elif [ $re -eq 5 ] #执行结果为5,表示watson密码错误 then echo $ip >>$hosts_password_errors else echo "IP:$ip-----------------错误:$re" >>$hosts_others fi done } function Believe_make(){ ip_list=dev_host belog=belog ip_num=`cat $ip_list|wc -l` rm -rf $belog &&touch $belog for i in `seq 1 $ip_num` do #读取iplist里面的ip地址和密码 ip=`cat $ip_list |sed -n $i'p'|awk '{print $1}'` sshpass -p $password scp believe.sh $user@$ip:/tmp/ >/dev/null # sshpass -p $password scp saomiao $user@$ip:/tmp/ >/dev/null # echo $ip---------------------执行结果-------------$? if [ $? -eq 0 ] then sshpass -p $password ssh $user@$ip -o StrictHostKeyChecking=no "bash /tmp/believe.sh" echo $ip 成功 >> belog # echo $ip >>hosts else echo $ip 失败 >>belog fi done } function main(){ if [ ! -d $network ] then mkdir $network fi ip_all="$network/ip_all_$network" #文件里面保存网段中所有可以ping的IP地址 ip_list="$network/ip_list_$network" #文件里面保存nmap扫描的原始数据 hosts="$network/hosts_$network" #保存Linux主机地址 hosts_windows="$network/hosts_windows_$network" #Windows主机 hosts_password_errors="$network/hosts_password_errors_$network" #保存密码错误主机 hosts_others="$network/hosts_others_$network" #其他类型主机 Root_nmap #切换root用户,并且扫描主机 Believe_hosts #得到Linux主机地址,生成host+网段文件 # Believe_make } main $1;
get_ip.sh
#!/bin/bash network=$1 ########################################################################## # 使用nmap命令扫描获取在线IP地址 # 必须root执行 ########################################################################## function Get_IP(){ rm -rf $ip_all && touch $ip_all rm -rf $ip_list && touch $ip_list nmap -sP 192.168.$network.0/24 |grep 192 > $ip_all #获取所有可以ping的地址 #对获取得到的信息加工,得到单独的IP地址 ip_num=`cat $ip_all|wc -l` for i in `seq 1 $ip_num` do lie_ip=`cat $ip_all |sed -n $i'p'` lie_nf=`echo $lie_ip |awk '{print NF}'` if [ $lie_nf -eq 5 ] then ip=`echo $lie_ip|awk '{print $5}'` echo $ip >> $ip_list elif [ $lie_nf -eq 6 ] then ip=`echo $lie_ip|awk -F"(" '{print $2}'|awk -F")" '{print $1}'` echo $ip >> $ip_list else echo "$lie_ip------------------Error!!!!!!!!" fi done chown watson:watson $network -R } function main(){ ip_all="$network/ip_all_$network" #文件里面保存网段中所有可以ping的IP地址 ip_list="$network/ip_list_$network" #文件里面保存nmap扫描的原始数据 Get_IP } main $1;
脚本运行:
在ma_be.sh输入整个网段的统一root密码
chmod +x ma_be.sh
./ma_be.sh 19 #扫描19网段
-----------------------------------------------------------------------------分割线-----------------------------------------------------------------------------
获取用户脚本
#!/bin/bash if [ $# -eq 2 ] then hosts=$1 hostname=$2 tmpfile=user1 filename=user$hostname rm -rf $tmpfile && touch $tmpfile rm -rf $filename && touch $filename ansible -i $hosts $hostname -m shell -a "cat /etc/passwd |grep bash " >$tmpfile cat $tmpfile |awk -F: '{print $1}' |awk '{print $1}' >$filename rm -rf $tmpfile else echo "脚本必须传入参数两个,第一个为主机文件,第二个为主机群的名称,例如:'bash getsuer.sh hosts dev'" exit 1 fi