shell结合expect写的批量scp脚本工具

转载链接: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的任务可能就会遇到麻烦了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/276554.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP记数器

这两天有好几个老的ASP网站要改,其中有要求加记数器,为图简单,就用文本文件的形式存储记数。以前用ifream的形式嵌入,不能很好的控制记数器显示的风格,现在改进了一下,可以很好的与嵌入板块风格结合了。把做…

php利用openssl实现RSA非对称加密签名

转载链接:http://liuxufei.com/weblog/jishu/376.html 1. 先用php生成一对公钥和私钥 $res openssl_pkey_new(); openssl_pkey_export($res,$pri); $d openssl_pkey_get_details($res); $pub $d[key]; var_dump($pri,$pub); 2. 保存好自己的私钥,把公…

[转] DevExpress 第三方控件汉化的全部代码和使用方法

DevExpress.XtraEditors.Controls 此控件包中包含的控件最多,包括文本框,下拉列表,按钮,等等 DevExpress.XtraGrid 网格 DevExpress.XtraBars 菜单栏 和 工具栏 DevExpress.XtraNavBar 导航条 DevExpress.XtraPr…

QPM 性能监控组件总篇

QPM (Quality Performance Monitor) 是一个质量性能监控组件,可以很方便的查看当前 App 的性能和常用数据。目前主要运行在 Android 平台上,通过集成 QPM 组件,可以在 App 中通过悬浮窗可视化相关实时数据。意在帮助广…

福音!微信个人公众号可以改名了!

微信个人公众号可以改名了!!!今年,我们学校从景德镇陶瓷学院更名为景德镇陶瓷大学,但苦于微信限制,很多微信公众号无法更名。很多组织社团就放弃了原先的关注量,重新申请注册账号。当前我们的订…

js list删除指定元素_删除js数组中的指定元素,有这两步就够了

js数组是js部分非常重要的知识,有时我们有这么个需求js数组删除指定元素,先定义一个函数来获取删除指定元素索引值,然后用js数组删除的方法,来删除指定元素即可,就两步不难,很简单。1、JS的数组对象定义一个…

sudo 安装 常见错误

运行环境Linux: 1、sudo:安装 apt-get install sudo 2、sudo: must be setuid root错误解决方法. ls -l /usr/bin/sudo chown root:root /usr/bin/sudo chmod 4755 /usr/bin/sudo reboot 3、sudo:提示用户无权限之类 在 /etc/…

慕课网高并发实战(一)-并发与高并发基本概念

课程网址 并发: 同时拥有两个或者多个线程,如果程序在单核处理器上运行,多个线程交替得换入或者换出内存,这些线程是同时“存在”的,每个线程都处于执行过程中的某个状态,如果运行在多核处理器上&#xff…

2009最经典名句

一:我的优点是:我很帅;但是我的缺点是:我帅的不明显. 二:谈钱不伤感情,谈感情最他妈伤钱。 三:我诅咒你一辈子买方便面没有调料包。 四:会计说:“你晚点来领工资吧&#…

计算机协会丨让技能得到提升,让思维受到启迪

“ 各位2016级新生,新的学期马上就要开始了,学校的各个组织和社团你真的了解了吗?在眼花缭乱的社团里如何找到自己真正喜欢的呢?或许看完计算机协会的纳新微信你就都明白啦!关键词:计算机协会景德镇陶瓷大学…

ondestroy什么时候调用_尾调用和尾递归

尾调用1. 定义尾调用是函数式编程中一个很重要的概念,当一个函数执行时的最后一个步骤是返回另一个函数的调用,这就叫做尾调用。注意这里函数的调用方式是无所谓的,以下方式均可:函数调用: func()方法调用: obj.method()call调用:…

查看/修改Linux时区和时间

转载链接:http://blog.csdn.net/colincjl/article/details/6133036 查看/修改Linux时区和时间 一、时区 1. 查看当前时区 date -R 2. 修改设置时区 方法(1) tzselect 方法(2) 仅限于RedHat Linux 和 CentOS timeconfig 方法(3) 适用于Debian dpkg-reconfigure tzdat…

dhl:使用return RedirectToAction()和 return view()

一个Action&#xff1a; Code/// <summary> /// Friend好友的地 /// </summary> /// <returns></returns> public ActionResult FriendFarm(string pid) {BLL.DTOFarm farm new AppleGrange.BLL.DTOFarm(pid); …

【更名通知】将以个人名义继续更新维护

这是我&#xff08;2013年任职计算机协会会长&#xff09;在2013年申请的公众号。由于2016年学校陶院更名为陶大&#xff0c;在当时公众号无法修改名称。后来计协的的学弟学妹申请了新的公众号"陶大计算机Association"&#xff0c;大家可以前往关注&#xff0c;所以该…

CentOS7.6 MySQL8环境搭建 配置远程登录 字符集UTF8 简单密码

一、环境准备 1、清理环境中系统自带的MySQL &#xff08;1&#xff09;删除系统自带的MySQL或Mariadb yum remove mysql-libs &#xff08;2&#xff09;查询系统中是否还有残余的依赖包 rpm -qa | grep mariadb &#xff08;3&#xff09;删除rpm依赖包 rpm -e --nodeps mar…

radio切换控制div显示_JavaScript连载31图片动态切换以及关闭图片案例

一、图标切换31.1点击那两个按钮可以做到轮番显示图片二、关闭图片案例31.2点击右上角的叉&#xff0c;图片会消失。三、源码&#xff1a;D31_iconSwitch.htmlD31_2_CloseImage.html地址:https://github.com/ruigege66/JavaScript/blob/master/D31_iconSwitch.htmlhttps://gith…

jQuery 1.9+ 移除$.browser方法

转载链接&#xff1a;http://blog.csdn.net/czplplp_900725/article/details/8704438 jQuery 从 1.9 版开始&#xff0c;移除了 $.browser 和 $.browser.version &#xff0c;取而代之的是 $.support。 在更新的 2.0 版本中&#xff0c;将不再支持 IE 6/7/8。 以后&#xff0c;…

ASP.NET跨页传值方法汇总

方法一&#xff1a;问号传值&#xff08;Response.Redirect方法&#xff09;1&#xff1a;源页&#xff1a;在按钮的点击事件程序中写入Response.Redirect方法&#xff0c;在其中使用问号传值。如&#xff1a;Response.Redirect("Default2.aspx?id"txtId.Text.Trim(…

工作一年后,我有些感悟(写于2017年)

时间拉回到2016年5月23日&#xff0c;当天拍毕业照&#xff0c;晚上是大学毕业酒会&#xff0c;那一晚整个酒店都弥漫着伤感的气息。那一晚大家为了找KTV拖延到很晚&#xff0c;最后一群人选择来到了操场&#xff0c;凌晨两点多一群人还在操场上玩着游戏。5月25日离校&#xff…

PHP基础学习之数组使用要点

一、什么是PHP数组&#xff1f;数组 array 是一组有序的变量&#xff0c;其中每个变量都被称为一个元素。每个元素由一个特殊的标识符来区分&#xff0c;这个标识符称之为键&#xff08;也可以称之为下标&#xff09;。数组中的每个元素都包含两项&#xff1a;键和值。可以通过…