Linux 利用 expect 進行 scp 自動同步檔案
阿新 • • 發佈:2022-05-24
現在有一個這樣的需求:
執行一個指令碼,自動從指定伺服器上全量拉取指定目錄的檔案,遠端伺服器的使用者名稱、埠、密碼、目錄配置在執行的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