Linux expect 實現(xiàn)自動人機交互 | 跨計算機scp/rsync進行文件傳輸,避免用戶密碼重復(fù)輸入

1.背景簡介

shell腳本在處理自動循環(huán)或大的任務(wù)方面可節(jié)省大量的時間,通過創(chuàng)建一個處理任務(wù)的命令清單,使用變量、條件、算術(shù)和循環(huán)等方法快速創(chuàng)建腳本以完成相應(yīng)工作,這比在命令行下一個個敲入命令要省時省力得多。

但是有時候我們可能會需要實現(xiàn)和交互程序如ftp, telnet服務(wù)器等進行交互的功能,需要我們?nèi)ポ斎朊艽a等進行人機交互,如果任務(wù)量非常大時,需要反復(fù)的檢測和手動輸入密碼,就會很麻煩,這時候我們需要用到shell的自動交互功能。

這里我們以跨計算機進行大量文件備份為例子,介紹軟件expect的使用。

2.expect的介紹和使用

expect是一個免費的編程工具,用來實現(xiàn)自動的交互式任務(wù),且無需人為干預(yù)。expect非常的簡單小巧,在自動化部署等諸多項目上面非常好用。

expect的詳細(xì)安裝和介紹可以參照官網(wǎng)或者如下鏈接,介紹得比較詳細(xì):https://blog.csdn.net/wangtaoking1/article/details/78268574
whereis expect去判斷你的計算機有沒有安裝expect

這里只進行幾個核心命令的強調(diào)和實際示例問題的解決。


expect基本命令

expect命令通常用來等待一個進程的反饋,我們根據(jù)進程的反饋,再發(fā)送對應(yīng)的交互命令。它會根據(jù)你提供的pattern等你運行的程序反饋,當(dāng)遇到你執(zhí)行的程序或命令輸出了指定的pattern,expect就會識別到。(識別

send命令接收一個字符串參數(shù)(你指定的,例如你的用戶名或密碼),并將該參數(shù)發(fā)送到進程。這個就是在expect識別了后,然后自動將內(nèi)容輸入給你的程序和命令。(自動交互

spawn命令用來啟動新的進程(命令/程序),spawn后的send和expect命令都是和使用spawn打開的進程進行交互。(核心任務(wù)

interact命令用的其實不是很多,一般情況下使用spawn、send和expect命令就可以很好的完成我們的任務(wù);但在一些特殊場合下還是需要使用interact命令的,interact命令主要用于退出自動化,進入人工交互。如果你執(zhí)行程序不需要最后個性化去指定,那就不要它,運行完停止就好。(指定交互

3.實際使用

下面以將本算機的文件傳輸?shù)絼e的計算機上進行文件備份為例子。

大文件常用的傳輸方式有scp, rsync等,不了解的話可以事先簡單去了解一下,反正可以理解成就是cp復(fù)制命令的高階、高速、穩(wěn)定版。

補充rsync的基本用法:主要就三種方式

#在同一臺計算機上進行從source路徑到destination路徑
rsync [OPTION] SRC DEST
#將本機文件傳輸?shù)搅硪慌_,USR用戶名,HOST是ssh地址
rsync [OPTION] SRC [USER@]HOST:DEST
#將另一臺計算機文件傳輸?shù)奖緳C上,USR用戶名,HOST是ssh地址
rsync [OPTION] [USER@]HOST:SRC DEST
#第四種和第三種是相對的,同樣第五種和第二種是相對的,它們各自之間的區(qū)別在于登陸認(rèn)證時使用的驗證方式不同。
rsync [OPTION] [USER@]HOST::SRC DEST
rsync [OPTION] SRC [USER@]HOST::DEST

至于options就基本的幾個,記住最常用的幾個即可,比如 -a、-r、-v、-z、--delete 和 --exclude等。詳見:http://c.biancheng.net/view/6121.html

跨計算機運行的最大障礙在于密碼的輸入,每一次進行訪問都會需要人為地輸入登錄密碼。當(dāng)然,rsync支持免密碼傳輸,那前提是你輸入的計算機ssh設(shè)置為免密碼登錄。但是,對于生產(chǎn)的計算器,或者服務(wù)器,而非私人的,這個免密操作是不被允許的。

所以我們結(jié)合expect的自動交互和rsync命令實現(xiàn):(麻煩的是需要先寫一個expect的程序,然后循環(huán)去調(diào)用它)

expect程序:rsync.exp

#!/usr/bin/expect
set timeout 1080
set file [lindex $argv 0]
set password 123456
spawn rsync -avrp $file 10.0.015:/pakpobox/pobox7d2/atac1-130
expect "*password*" {send "$password\r"}
expect eof

#!/usr/bin/expect為expect的編譯器,就是whereis expect的返回路徑
set timeout 1080為expect的等待時間,這里是18min。這個特性是防止那些執(zhí)行死機的命令的。一旦到了這個timeout,還是沒有屏幕輸出的話(這里是spwan后面命令的輸出),expect腳本就會開始執(zhí)行下面其他的代碼了。或者我們在expect腳本中如果定義了timeout的響應(yīng)代碼的話,這些代碼就會被執(zhí)行。單位是秒,默認(rèn)是10秒,可以給定具體時間,給定-1就是無timeout,永不執(zhí)行下面的代碼,知道它期待的pattern出現(xiàn)為止。
spawn后面就是程序或命令,它一個spawn只識別一個程序,所以不能直接管道符,我們才需要額外去循環(huán)調(diào)用。
expect后面就是要識別的pattern,send就是自動傳入的內(nèi)容。
expect eof結(jié)束標(biāo)識,運行到此結(jié)束,可以用前面說的interact進行交互作為結(jié)束。
其他為變量設(shè)置set 變量名 內(nèi)容, 且exp不識別#注釋符。

自動執(zhí)行的腳本:rsync.sh

#!/bin/bash
filelist=`cat sample1.txt` #filelist獲取
for i in $filelist
do expect ./rsync.exp $i
done

推薦后臺執(zhí)行,就可以徹底set free了現(xiàn)在。

nohup bash rsync.sh &

4. 補充

其實除了expect小工具的學(xué)習(xí)和使用 還用更加直接的方法,就是使用rsync自帶的密碼識別參數(shù)--password-file,通過這個把密碼文件(把密碼先寫到本地的隨便一個可訪問文件里面,內(nèi)容只要密碼就行,別的都不需要)自動讀入就行。
具體格式就是:

rsync -aVz --progress --password-file=passwd.txt [本地文件路徑] [遠(yuǎn)端計算機路徑]
# passwd.txt 就是本地的存儲了密碼的文本文件
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容