转载链接:http://www.jb51.net/article/34005.htm

expect用于自动化地执行linux环境下的命令行交互任务,例如scp、ssh之类需要用户手动输入密码然后确认的任务。有了这个工具,定义在scp过程中可能遇到的情况,然后编写相应的处理语句,就可以自动地完成scp操作了

在部署一个任务时,其中有一项必须的过程就是将一些文件,如安装包发送到大量的服务器上去。虽然已有宇哥的脚本可用:通过paramiko模块提供的ssh和scp功能编写的python脚本。但我到现在还在对python的恐惧之中(虽然已经在空闲时间努力去学习了),所以使用了shell和expect脚本结合的方式,写了这个批量scp的脚本工具。

expect用于自动化地执行linux环境下的命令行交互任务,例如scp、ssh之类需要用户手动输入密码然后确认的任务。有了这个工具,定义在scp过程中可能遇到的情况,然后编写相应的处理语句,就可以自动地完成scp操作了。

需要expect工具的话可以在linux环境中使用apt-get或pacman这些包管理工具去获取安装,或是到expect开源项目的网站: http://expect.sourceforge.net/ 来获取。

安装expect之后,可以尝试使用以下的代码来完成对单个服务器的scp任务:

#!/usr/bin/expect
set timeout 10
set host [lindex $argv 0]
set username [lindex $argv 1]
set password [lindex $argv 2]
set src_file [lindex $argv 3]
set dest_file [lindex $argv 4]
spawn scp $src_file $username@$host:$dest_fileexpect {"(yes/no)?"{send "yes\n"expect "*assword:" { send "$password\n"}}"*assword:"
{send "$password\n"
}
}
expect "100%"
expect eof

注意代码刚开始的第一行,指定了expect的路径,与shell脚本相同,这一句指定了程序在执行时到哪里去寻找相应的启动程序。代码刚开始还设定了timeout的时间为10秒,如果在执行scp任务时遇到了代码中没有指定的异常,则在等待10秒后该脚本的执行会自动终止。

从以上代码刚开始的几行可以看出,我为这个脚本设置了5个需要手动输入的参数,分别为:目标主机的IP、用户名、密码、本地文件路径、目标主机中的文件路径。如果将以上脚本保存为expect_scp文件,则在shell下执行时需要按以下的规范来输入命令:
./expect_scp 192.168.75.130 root 123456 /root/src_file /root/dest_file

以上的命令执行后,将把本地/root目录下的src_file文件拷贝到用户名为root,密码为123456的主机192.168.75.130中的/root下,同时还将这个源文件重命名为dest_file。

spawn代表在本地终端执行的语句,在该语句开始执行后,expect开始捕获终端的输出信息,然后做出对应的操作。expect代码中的捕获的(yes/no)内容用于完成第一次访问目标主机时保存密钥的操作。有了这一句,scp的任务减少了中断的情况。代码结尾的expect eof与spawn对应,表示捕获终端输出信息的终止。

有了这段expect的代码,还只能完成对单个远程主机的scp任务。如果需要实现批量scp的任务,则需要再写一个shell脚本来调用这个expect脚本。

shell脚本:

#!/bin/sh
list_file=$1
src_file=$2
dest_file=$3
cat $list_file | while read line
dohost_ip=`echo $line | awk '{print $1}'`username=`echo $line | awk '{print $2}'`password=`echo $line | awk '{print $3}'`echo "$host_ip"./expect_scp $host_ip $username $password $src_file $dest_file
done 

指定了3个参数:列表文件的位置、本地源文件路径、远程主机目标文件路径。需要说明的是其中的列表文件指定了远程主机ip、用户名、密码,这些信息需要写成以下的格式:
IP username password

中间用空格或tab键来分隔,多台主机的信息需要写多行内容,如:
192.168.75.130 root 123456
192.168.75.131 knktc testpass

这样就指定了两台远程主机的信息。注意,如果远程主机密码中有“$”、“#”这类特殊字符的话,在编写列表文件时就需要在这些特殊字符前加上转义字符,否则expect在执行时会输入错误的密码。

对于这个shell脚本,保存为batch_scp.sh文件,与刚才保存的expect_scp文件和列表文件(就定义为hosts.list文件吧)放到同一目录下,执行时按照以下方式输入命令就可以了:
./batch_scp.sh ./hosts.list /root/src_file /root/destfile
用这两个脚本文件,就可以简单地完成批量scp的任务了。
其实批量scp的任务并不难,但是批量ssh的任务可能就会遇到麻烦了。

shell结合expect写的批量scp脚本工具相关推荐

  1. 批量scp脚本——从多台机器拷贝文件

    为了方便的从多台服务器获取日志,写了个简易脚本专门用于批量拷贝服务器日志到执行脚本的机器中.该脚本包含2个文件bscp.sh和bscp.exp. 使用方式: sh bscp.sh <userna ...

  2. Linux命令(27):shell 结合expect,多服务器批量分发数据

    shell 结合expect 写的批量scp脚本工具 except安装:http://www.cnblogs.com/lovychen/p/6525623.html expect用于自动化地执行lin ...

  3. python怎么写自己的名字_用python写一个序列图改名工具

    在工作中经常遇到辛苦渲染得到的序列图名字不对,怎么办! 求人不如求自己,用python写一个批量改名的工具,从此改名不求人.比如我想把名字为cat.01.jpg改为dog.001.jpg 写了半天,我 ...

  4. linux定时scp脚本,linux expect 实现定时scp的任务

    一,什么是expect? expect 是一种脚本语言, 在做系统管理时,我们很多时候需要输入密码,例如:连接 ssh,连接ftp, 那么如何能做到不输入密码吗? 我们需要有一个工具,能代替我们实现与 ...

  5. linux中间隔10ping一次脚本,linux批量ping脚本shell

    linux批量ping脚本shell *ping失败后的返回字符串 5 packets transmitted, 0 received, 100% packet loss, time 3999ms* ...

  6. linux shell 嵌套expect 与服务器交互脚本

    2019独角兽企业重金招聘Python工程师标准>>> 我们与服务器进行交互是该用expect 脚本的,用 "/usr/bin/expect <<-EOF&qu ...

  7. linux 批量telnet 脚本,shell脚本-批量telnet

    由于现网有时候要测试很多端口的连通性,所以就写了个小脚本,实现批量测试 将telnet成功的写入到telnet_alive.txt中,失败则写入telnet_die.txt中 #!/bin/bash ...

  8. shell 压测_shell写一个压测脚本

    ab命令 ab是apache下面的一个性能压测工具 yum install -y httpd-tools ab -n 1000 -c 10 http://xxxx # -n 请求数 -c 并发数 基于 ...

  9. linux批量执行命令脚本,2.3-命令批量执行脚本

    命令批量执行脚本,同样需要两个脚本来实现:1 exe.expect 2 exe.sh 3 ip.list    IP列表 cat exe.expect #!/usr/bin/expect set ho ...

最新文章

  1. hibernate mysql 自动建表_配置hibernate根据实体类自动建表功能
  2. 学习笔记(2)IPC机制
  3. 存储控制器_SDRAM详解
  4. 小谈@override
  5. 网络中服务器是指为网络提供资源,并对这些资源进行管理的计算机,2016年职称计算机考试Internet冲刺试题及答案3...
  6. 为什么服务器要选择 Linux,这里总结了 10 大理由
  7. 前端开发常用免费资源,显著提升工作效率
  8. Linux 给用户 赋某个文件夹操作的权限
  9. cenos各个版本下载地址
  10. AV-TEST最新Windows 10平台最佳杀毒软件测试结果
  11. php eclipse 版本_PHPEclipse官方下载
  12. 【leetCode】69. x 的平方根
  13. 2022 年 Flutter 适合我吗?Flutter VS Other 量化对比
  14. 计算机ppt密码是什么,PPT怎么设置密码 PPT密码设置教程-电脑教程
  15. 大白菜装机教程win10_大白菜U盘启动工具|大白菜超级U盘启动制作工具 V6.0_2009.25官方版下载...
  16. 小米笔试题(句子反转)
  17. 南京大学计算机专业复试面试,2014 CS复试全面回忆 上机真题 面试血泪史
  18. 【dsPIC33】振荡器与定时器
  19. WP_支持XP的Windows Phone开发环境搭建:“文字+视频”教程(五)
  20. 使用阿里的easyexcel 导入xls类型Excel文件报错问题深挖

热门文章

  1. C语言数组学完学啥,我的c语言学习-数组专题
  2. 某计算机公司的库存管理,《管理系统中计算机应用》应用题数据流程图汇总题及参考答案...
  3. matlab里符号的写法,Matlab中特殊符号的写法
  4. 电脑维修:电脑维修必备工具整理
  5. 网络知识:宽带下载网速是30MB/s,经过路由器后仅10MB/s,看完你就懂了!
  6. 给大家推荐一款高逼格的Linux磁盘信息查看工具
  7. 程序员效率:职业倦怠的理解
  8. 华为新出的鸿蒙,华为发出新计划:2021年完成3亿鸿蒙用户,你会给你手机尝试吗...
  9. 树莓派入门(树莓派登录的几种方式)
  10. springmvc请求返回一个字符_SpringMVC系列之Web利器SpringMVC