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

现在有一个这样的需求:

执行一个脚本,自动从指定服务器上全量拉取指定目录的文件,远程服务器的用户名、端口、密码、目录配置在执行的shell脚本中。


要实现这样的需求,我们使用scp 来实现,但是scp 在执行的过程中需要输入密码,所以我们就需要用到一个工具 “expect” 来实现自动化脚本。

关于 expect 的使用可以参考:http://blog.csdn.net/catoop/article/details/48289991


下面附上2个脚本:

1、进行文件同步的脚本,文件名 expect_scp

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


2、执行本机操作的 shell 脚本,文件名 deploy.sh

    #!/bin/sh
     
    src_dir=/data/huiyzl/runtime/
    dest_dir=/data/huiyzl/
    host=219.135.214.146
    port=60203
    username=root
    password=LENOVOap123
     
    # 目录不存在,则创建,如果存在先删除再创建
    if [ ! -d $src_dir ]; then
      mkdir -p $src_dir
    else
      rm -rf $src_dir
      mkdir -p $src_dir
    fi
     
    # 将远程服务器上的文件拷贝到本机
    ./expect_scp $host $port $username $password $src_dir $dest_dir
     
    echo "end"


deploy.sh 为什么可以直接执行的脚本,内部调用 expect_scp 为专门用来拉取远程服务器上文件的脚本。

脚本比较简单,就不逐行介绍了。

----------------------------------------------

PS:本例的原来用意是做自动化部署用的,测试环境的代码在测试服务器上,该deploy.sh 脚本为正式环境,当测试环境测试通过后,正式环境通过执行 deploy.sh 就可以进行相关内容的同步并进行自动停止和重启服务,完成正式环境的自动化部署。

这个脚本,我们可以在别的服务器上或者通过部署平台进行调用执行。
————————————————
版权声明:本文为CSDN博主「catoop」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/catoop/article/details/48301251
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章