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