shell如何結(jié)合expect寫批量scp腳本工具-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關(guān)shell如何結(jié)合expect寫批量scp腳本工具的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

創(chuàng)新互聯(lián)建站長期為成百上千客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為淇縣企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、成都做網(wǎng)站,淇縣網(wǎng)站改版等技術(shù)服務(wù)。擁有10余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

在部署一個任務(wù)時(shí),其中有一項(xiàng)必須的過程就是將一些文件,如安裝包發(fā)送到大量的服務(wù)器上去。雖然已有宇哥的腳本可用:通過paramiko模塊提供的ssh和scp功能編寫的python腳本。但我到現(xiàn)在還在對python的恐懼之中(雖然已經(jīng)在空閑時(shí)間努力去學(xué)習(xí)了),所以使用了shell和expect腳本結(jié)合的方式,寫了這個批量scp的腳本工具。

expect用于自動化地執(zhí)行l(wèi)inux環(huán)境下的命令行交互任務(wù),例如scp、ssh之類需要用戶手動輸入密碼然后確認(rèn)的任務(wù)。有了這個工具,定義在scp過程中可能遇到的情況,然后編寫相應(yīng)的處理語句,就可以自動地完成scp操作了。

需要expect工具的話可以在linux環(huán)境中使用apt-get或pacman這些包管理工具去獲取安裝,或是到expect開源項(xiàng)目的網(wǎng)站:/tupian/20230522/ 來獲取。

安裝expect之后,可以嘗試使用以下的代碼來完成對單個服務(wù)器的scp任務(wù):



#!/usr/bin/expect
set timeout 10
set host [lindex $argv 0]
set username [lindex $argv 1]
set password [lindex $argv 2]
set src_file [lindex $argv 3]
set dest_file [lindex $argv 4]
spawn scp $src_file $username@$host:$dest_file
 expect {
 "(yes/no)?"
  {
  send "yes\n"
  expect "*assword:" { send "$password\n"}
 }
 "*assword:"
{
 send "$password\n"
}
}
expect "100%"
expect eof

注意代碼剛開始的第一行,指定了expect的路徑,與shell腳本相同,這一句指定了程序在執(zhí)行時(shí)到哪里去尋找相應(yīng)的啟動程序。代碼剛開始還設(shè)定了timeout的時(shí)間為10秒,如果在執(zhí)行scp任務(wù)時(shí)遇到了代碼中沒有指定的異常,則在等待10秒后該腳本的執(zhí)行會自動終止。

從以上代碼剛開始的幾行可以看出,我為這個腳本設(shè)置了5個需要手動輸入的參數(shù),分別為:目標(biāo)主機(jī)的IP、用戶名、密碼、本地文件路徑、目標(biāo)主機(jī)中的文件路徑。如果將以上腳本保存為expect_scp文件,則在shell下執(zhí)行時(shí)需要按以下的規(guī)范來輸入命令:
./expect_scp 192.168.75.130 root 123456 /root/src_file /root/dest_file

以上的命令執(zhí)行后,將把本地/root目錄下的src_file文件拷貝到用戶名為root,密碼為123456的主機(jī)192.168.75.130中的/root下,同時(shí)還將這個源文件重命名為dest_file。

spawn代表在本地終端執(zhí)行的語句,在該語句開始執(zhí)行后,expect開始捕獲終端的輸出信息,然后做出對應(yīng)的操作。expect代碼中的捕獲的(yes/no)內(nèi)容用于完成第一次訪問目標(biāo)主機(jī)時(shí)保存密鑰的操作。有了這一句,scp的任務(wù)減少了中斷的情況。代碼結(jié)尾的expect eof與spawn對應(yīng),表示捕獲終端輸出信息的終止。

有了這段expect的代碼,還只能完成對單個遠(yuǎn)程主機(jī)的scp任務(wù)。如果需要實(shí)現(xiàn)批量scp的任務(wù),則需要再寫一個shell腳本來調(diào)用這個expect腳本。

shell腳本:

代碼如下:


#!/bin/sh
list_file=$1
src_file=$2
dest_file=$3
cat $list_file | while read line
do
   host_ip=`echo $line | awk '{print $1}'`
   username=`echo $line | awk '{print $2}'`
   password=`echo $line | awk '{print $3}'`
   echo "$host_ip"
   ./expect_scp $host_ip $username $password $src_file $dest_file
done


指定了3個參數(shù):列表文件的位置、本地源文件路徑、遠(yuǎn)程主機(jī)目標(biāo)文件路徑。需要說明的是其中的列表文件指定了遠(yuǎn)程主機(jī)ip、用戶名、密碼,這些信息需要寫成以下的格式:
IP username password

中間用空格或tab鍵來分隔,多臺主機(jī)的信息需要寫多行內(nèi)容,如:
192.168.75.130 root 123456
192.168.75.131 knktc testpass

這樣就指定了兩臺遠(yuǎn)程主機(jī)的信息。注意,如果遠(yuǎn)程主機(jī)密碼中有“$”、“#”這類特殊字符的話,在編寫列表文件時(shí)就需要在這些特殊字符前加上轉(zhuǎn)義字符,否則expect在執(zhí)行時(shí)會輸入錯誤的密碼。

對于這個shell腳本,保存為batch_scp.sh文件,與剛才保存的expect_scp文件和列表文件(就定義為hosts.list文件吧)放到同一目錄下,執(zhí)行時(shí)按照以下方式輸入命令就可以了:
./batch_scp.sh ./hosts.list /root/src_file /root/destfile
用這兩個腳本文件,就可以簡單地完成批量scp的任務(wù)了。
其實(shí)批量scp的任務(wù)并不難,但是批量ssh的任務(wù)可能就會遇到麻煩了。

感謝各位的閱讀!關(guān)于“shell如何結(jié)合expect寫批量scp腳本工具”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

分享文章:shell如何結(jié)合expect寫批量scp腳本工具-創(chuàng)新互聯(lián)
轉(zhuǎn)載源于:http://muchs.cn/article6/cedcog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、App設(shè)計(jì)、做網(wǎng)站、域名注冊動態(tài)網(wǎng)站、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化