设为首页 收藏本站
查看: 791|回复: 0

[经验分享] expect 批量拷贝key文件并且批量执行简单脚本

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-11-6 09:19:00 | 显示全部楼层 |阅读模式
一、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

然后就可以不需要输入密码登陆客户端服务器了,如下:
#ssh root@192.168.1.450
也可以在/etc/hosts中自定义主机名来登陆(如果客户端比较多,主机名的形式好记)
比如:
#vim /etc/hosts
192.168.1.450  testserver1
测试:
#ssh testserver1   --就登陆到1.450这台服务器了!!!

补充:我测试过客户端root密码为liguang,将id_rsa.pub拷贝到这台客户端,可以ssh hostname 登陆这台客户端,然后修改客户端的root
密码为liguang123,也可以正常ssh hostname 登陆!有点不解

注意:执行此脚本会将服务端的/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


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-135697-1-1.html 上篇帖子: Python基础(int类) 下篇帖子: python基础zongjie expect
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表