Linux使用expect实现远程拷贝文件

原创 2015年11月18日 11:35:55

1.背景

公司有个项目打算用Nginx集群的方式部署在三台服务器共 7个tomcat里,这样更新的时候如果一个一个去更新显然会很麻烦,现在打算用执行命令的方式把要需要更新的文件直接拷贝覆盖到那7个tomcat里去(不知道有没有比这种更简便的更新方式,如果有还望赐教)。一开始打算先把要更新的文件拷贝在其中一个主服务器的目录下,然后执行shell脚本用cp和scp的命令把文件拷贝到当前服务器和另外两个服务器的tomcat里,但是在执行到scp命令的时候会提示需要输入系统用户的密码,最后发现使用expect可以避免这个麻烦。

2.安装

安装的方式有很多,这里使用比较简便的rpm方式来安装,安装之前需要先检查一下系统是否已经安装过expect:

#查看是否有安装过tcl(expect需要依赖tcl)

rpm -qa | grep tcl

#查看是否有安装过expect

rpm -qa | grep expect

如果有输出显示已经安装过了,那就不用安装了。

安装需要准备的工具:

先安装tcl:

rpm -ivh tcl-*

再安装expect:

rpm -ivh expect-5.44.1.11-1.240.x86_64.rpm 

3.脚本

dealrsync.sh:把本机项目拷贝到本机的tomcat,循环执行远程拷贝的expect脚本

#/bin/sh
#同步各服务器的项目

#源文件
src_file=testproject

#把项目复制到本主机服务器的tomcat
cp -pr $src_file /home/was/webtest/tom1
cp -pr $src_file /home/was/webtest/tom2
cp -pr $src_file /home/was/webtest/tom3

#把项目复制到其他主机服务器的tomcat

#格式:ip 用户名 密码 目标文件地址
remoteserver_list="remoteserver_list.conf"
cat $remoteserver_list | while read line

do
  host_ip=`echo $line|awk '{print $1}'`
  username=`echo $line|awk '{print $2}'`
  password=`echo $line|awk '{print $3}'`
  dest_file=`echo $line|awk '{print $4}'`
  ./remotescp.sh $src_file $username $host_ip $dest_file $password
done

rsyncfiles.sh:把本地文件拷贝到远程服务器

#!/usr/bin/expect
if {$argc < 2} {
    send_user "usage: $argv0 src_file username ip dest_file password\n"
    exit
}
set src_file [lindex $argv 0]
set username [lindex $argv 1]
set host_ip [lindex $argv 2]
set dest_file [lindex $argv 3]
set password [lindex $argv 4]

spawn scp -pr $src_file $username@$host_ip:$dest_file
expect {
        "(yes/no)?"
        {
                send "yes\n"
                expect "*assword:" {send "$password\n"}
        }
        "*assword:"
        {
                send "$password\n"
        }
}
expect "100%"
expect eof

remoteserver_list.conf:远程主机服务器地址列表(如果密码里有特殊字符则需要转义)

192.168.1.11 root ****** /home/was/webtest/tom4
192.168.1.11 root ****** /home/was/webtest/tom5
192.168.1.12 root ****** /home/was/webtest/tom6
192.168.1.12 root ****** /home/was/webtest/tom7


版权声明:本文为博主原创文章,未经博主允许不得转载。

利用expect在linux shell脚本中交互(scp远程传输文件示例)

看代码: #!bin/sh expect
  • shan165310175
  • shan165310175
  • 2014年03月06日 17:44
  • 2113

Linux 利用 expect 进行 scp 自动同步文件

现在有一个这样的需求:执行一个脚本,自动从指定服务器上全量拉取指定目录的文件,远程服务器的用户名、端口、密码、目录配置在执行的shell脚本中。要实现这样的需求,我们使用scp 来实现,但是scp 在...
  • catoop
  • catoop
  • 2015年09月08日 23:57
  • 5905

通过expect scp 命令分发文件到其它机器

1. expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的语法如下所示: 1.1 首行加上/usr/bin/expect 1.2 spawn: 后面加上需要执行的shell命令,比如说...
  • vfgbv
  • vfgbv
  • 2016年10月08日 11:40
  • 868

ssh,expect脚本实现远程登录,拷贝命令scp,rsync服务器的搭建

两台主从机之间的自动登录 在主机一中使用ssh-keygen产生公钥id.rsa.pub和私钥id.rsa 然后把公钥内容复制到主机2的.ssh/id.rsa.pub中(若没有就创建该目录) 注意,主...
  • daixiangzi
  • daixiangzi
  • 2017年02月03日 20:25
  • 420

expect的简单使用,linux交互性shell

expect的学习使用触发自一个项目,项目平台是树莓派三代,要求是要在root用户下面执行一个名为61850Svr的程序。 目前的状态是树莓派开机启动后会自动进入普通用户,于是需要自动切换到root下...
  • aazhoukeaa
  • aazhoukeaa
  • 2016年09月16日 16:27
  • 536

linux下ssh远程登录/scp远程复制文件/rsync远程同步命令的自动登录

最近需要写一个脚本备份各个服务器上的程序到一个指定服务器上,本来以为查查rsync命令的使用321就能搞定,结果rsync命令要支持自动登录还是要配置服务和参数,又不确定网上说的配置的行不行,因为都是...
  • five3
  • five3
  • 2013年03月07日 22:26
  • 24024

ssh,expect脚本实现远程登录,拷贝命令scp,rsync服务器的搭建

两台主从机之间的自动登录 在主机一中使用ssh-keygen产生公钥id.rsa.pub和私钥id.rsa 然后把公钥内容复制到主机2的.ssh/id.rsa.pub中(若没有就创建该目录) 注意,主...
  • daixiangzi
  • daixiangzi
  • 2017年02月03日 20:25
  • 420

用python实现远程复制 (scp + expect )

scp 功能很强大,但需要人工输入 password, 当然可以通过把 公钥保存在远程主机的 ~/.ssh 目录中,而后就不用输入password,但这需要配置. 用 sshpass 可能在命令输入...
  • u010229420
  • u010229420
  • 2015年09月29日 14:46
  • 1464

Linux 利用 expect 进行 scp 自动同步文件

现在有一个这样的需求:执行一个脚本,自动从指定服务器上全量拉取指定目录的文件,远程服务器的用户名、端口、密码、目录配置在执行的shell脚本中。要实现这样的需求,我们使用scp 来实现,但是scp 在...
  • catoop
  • catoop
  • 2015年09月08日 23:57
  • 5905

expect转义符及远程主机执行命令

expect介绍expect-send对:expect等待输出并判定特定的字符,通常是提示符,当字符匹配,则send下一步的操作;若字符与expect期望的输出不一只时,往往会报错退出。 expec...
  • comprel
  • comprel
  • 2016年12月12日 01:14
  • 8472
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux使用expect实现远程拷贝文件
举报原因:
原因补充:

(最多只允许输入30个字)