一、expect简介
expect是一种能够按照脚本内容里面设定的方式与交互式程序进行“会话”的程序。根据脚本内容,Expect可以知道程序会提示或反馈什么内容以及 什么是正确的应答。
它是一种可以提供“分支和嵌套结构”来引导程序流程的解释型脚本语言。 shell功能很强大,但是不能实现有交互功能的多机器之前的操作,例如ssh和ftp.而expect可以帮助我们来实现.
二、安装expect软件包
#yum install expect -y
注:使用expect批量拷贝id_rsa.pub前提是ssh端口必须是默认端口22 ,否则会报错,如下:
ssh: connect to host 10.0.18.95 port 22: Connection refused
如果ssh端口不是22,假如是22000,命令行拷贝如下:
#ssh-copy-id -i /root/.ssh/id_rsa.pub '-p 22000 root@10.0.18.95' --提示输入root密码,输入即可 root@10.0.18.95's password: Now try logging into the machine, with "ssh '-p 22000 root@10.0.18.95'", and check in: .ssh/authorized_keys to make sure we haven't added extra keys that you weren't expecting.
登录测试:
#ssh -p22000 root@10.0.18.95 --可以正常登录
如果是在脚本中执行,需要在root目录下创建config文件
#cd /root/.ssh #vim config Port 22000 然后再批量将id_rsa.pub传到其他ssh端口为22000的服务器就可以了!
三、ssh端口默认是22的情况下,将服务端key拷贝到所有定义的客户端脚本
#cat test.sh #!/bin/bash FILE=`cat /root/testip.txt` for i in $FILE;do ip=$(echo "$i"|cut -d":" -f1) password=$(echo "$i"|cut -d":" -f2) expect -c " spawn /usr/bin/ssh-copy-id -i /root/.ssh/id_rsa.pub root@$ip expect { \"*yes/no*\" {send \"yes\r\";exp_continue} \"*password*\" {send \"$password\r\";exp_continue} \"*password*\" {send \"$password\r\";} } " done
执行脚本:#bash test.sh
注意:其中testip.txt文件格式如下:
192.168.1.450:mima123
如果有多台服务器需要拷贝key,依次写在下面就行了。
然后就可以不需要输入密码登陆客户端服务器了,如下:
#ssh root@192.168.1.450
也可以在/etc/hosts中自定义主机名来登陆(如果客户端比较多,主机名的形式好记),比如:
#vim /etc/hosts 192.168.1.450 testserver1 测试: #ssh testserver1 --就登陆到1.450这台服务器了!!!
注意:执行此脚本会将服务端的/root/.ssh/id_rsa.pub文件追加拷贝到客户端/root/.ssh/目录下的authorized_keys文件中(第一次执行是创建authorized_keys文件)!!!
四、通过expect批量管理客户端服务器
一个简单的小脚本,批量修改dns,如下:
#!/bin/bash ###modify /etc/resolv.conf ### for i in $(cat /root/testip.txt|cut -d":" -f1);do ssh root@$i "sed -i 's/10.0.90.1/10.0.900.1/g' /etc/resolv.conf" done
网上看到的脚本
#cat ssh.sh #!/usr/bin/expect rm -rf root/.ssh/known_hosts expect -c " spawn ssh-keygen -t rsa expect { \"*id_rsa*\" {send \r;exp_continue} \"*passphrase*\" {send \r;exp_continue} \"*again*\" {send \r;exp_continue} } " for p in $(cat /script/ip.txt) do ip=$(echo "$p"|cut -f1 -d":") password=$(echo "$p"|cut -f2 -d":") expect -c " spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$ip expect { \"*yes/no*\" {send \"yes\r\"; exp_continue} \"*password*\" {send \"$password\r\"; exp_continue} \"*Password*\" {send \"$password\r\";} } " done for h in $(cat /script/ip.txt|cut -f1 -d":") do ssh root@$h "ls $dire" dire="/tmp/test" if [ $? -eq 0 ]; then ssh root@$h rm -rf "$dire" set timeout 300 ssh root@$h mkdir -p /tmp/test fi ssh root@$h touch lgl.txt scp /root/CentOS-5.3-x86_64-bin-DVD.iso root@192.168.1.56:/home set timeout 300 done