1. 程式人生 > 其它 >Linux 利用 expect 進行 scp 自動同步檔案

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