Linux 利用 expect 進行 scp 自動同步文件

如今有一個這樣的需求: 執行一個腳本,自動從指定服務器上全量拉取指定目錄的文件,遠程服務器的用戶名、端口、密碼、目錄配置在執行的shell腳本中。shell

expect安裝服務器

# yum install expect
(1/2): tcl-8.5.13-8.el7.x86_64.rpm
(2/2): expect-5.45-14.el7_1.x86_64.rpm

要實現這樣的需求,咱們使用scp 來實現,可是scp 在執行的過程當中須要輸入密碼,因此咱們就須要用到一個工具 「expect」 來實現自動化腳本。工具

關於 expect 的使用能夠參考:http://blog.csdn.NET/catoop/article/details/48289991 下面附上2個腳本:oop

一、進行文件同步的腳本,文件名 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

二、執行本機操做的 shell 腳本,文件名 deploy.shui

#!/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 爲專門用來拉取遠程服務器上文件的腳本。spa

PS:本例的原來用意是作自動化部署用的,測試環境的代碼在測試服務器上,該deploy.sh 腳本爲正式環境,當測試環境測試經過後,正式環境經過執行 deploy.sh 就能夠進行相關內容的同步並進行自動中止和重啓服務,完成正式環境的自動化部署。這個腳本,咱們能夠在別的服務器上或者經過部署平臺進行調用執行。code

相關文章
相關標籤/搜索