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
執行一個腳本,自動從指定服務器上全量拉取指定目錄的文件,遠程服務器的用戶名、端口、密碼、目錄配置在執行的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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.