码迷,mamicode.com
首页 > 其他好文 > 详细

expect 批量拷贝key文件并且批量执行简单脚本

时间:2015-11-05 19:00:53      阅读:332      评论:0      收藏:0      [点我收藏+]

标签:expect

一、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


expect 批量拷贝key文件并且批量执行简单脚本

标签:expect

原文地址:http://linuxg.blog.51cto.com/4410110/1710110

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!