expect无shell中特殊函数
整合两个环境在shell中实现expert批量应答模式
1、使用脚本ssh连接
要求:
命令行执行脚本名称后跟ip,实现自动连接并输出主机名
vim auth_ssh.sh
测试:
2、检测60-80台主机能否连接通,登陆能连通的主机,将其主机名输入文件/mnt/host_list
vim ssh.sh
测试:
此时我的真机ip为172.25.254.76主机名为foundation76.ilt.example.com
此时我的另一台虚拟机ip为172.25.254.67主机名为foundation67.ilt.example.com
此试验在172.25.254.176虚拟机上进行:
解放输出中出现^M的问题:
此时正常输出:
注意:
替换时的^M是在键盘上敲ctrl+v ctrl+M出现的
3、检测60-80台主机是否正常运行,自动登陆每台主机,判断主机中是否有用户,没有就创建
vim auto_ssh.sh
#!/bin/bash
Auto_Connect()
{
/usr/bin/expect <<EOF
spawn ssh root@$1 $2
expect {
"yes/no" { send "yes\r";exp_continue }
"password:" { send "westos\r"}
}
expect eof
EOF
}
Max_Line=`awk 'BEGIN{N=0}{N++}END{print N}' $1`
for NUM in {60..80}
do
ping -c1 -w1 172.25.254.$NUM &> /dev/null
if [ "$?" = "0" ]
then
for Line_Num in `seq 1 $Max_Line`
do
USERNAME=`sed -n ${Line_Num}p $1`
PASSWORD=`sed -n ${Line_NUm}p $2`
User_State=`Auto_Connect 172.25.254.$NUM "getent passwd $USERNAME" | grep - E "spawn|authenticity|ECDSA|yes|Warning:|password:" -v` #登陆从未登陆过的主机时会显示提示行,需屏蔽显示
[ -z "$User_State" ] && { #如果有内容输出
Auto_Connect 172.25.254.$NUM "useradd $USERNAME && echo $PASSWORD | passwd --stdin $USERNAME" &> /dev/null #建立用户并且设置密码
}
done
fi
done
此时真机76上建立好了用户strudent
注意:
在给User_State赋student的id值时过滤掉的内容为登陆时会出现的提示行
getent passwd student相当于cat /etc/passwd | grep student