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

1.背景簡介

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

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

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

2.expect的介紹和使用

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

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

這里只進(jìn)行幾個(gè)核心命令的強(qiáng)調(diào)和實(shí)際示例問題的解決。


expect基本命令

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

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

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

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

3.實(shí)際使用

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

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

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

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

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

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

所以我們結(jié)合expect的自動(dòng)交互和rsync命令實(shí)現(xiàn):(麻煩的是需要先寫一個(gè)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的等待時(shí)間,這里是18min。這個(gè)特性是防止那些執(zhí)行死機(jī)的命令的。一旦到了這個(gè)timeout,還是沒有屏幕輸出的話(這里是spwan后面命令的輸出),expect腳本就會(huì)開始執(zhí)行下面其他的代碼了?;蛘呶覀冊趀xpect腳本中如果定義了timeout的響應(yīng)代碼的話,這些代碼就會(huì)被執(zhí)行。單位是秒,默認(rèn)是10秒,可以給定具體時(shí)間,給定-1就是無timeout,永不執(zhí)行下面的代碼,知道它期待的pattern出現(xiàn)為止。
spawn后面就是程序或命令,它一個(gè)spawn只識(shí)別一個(gè)程序,所以不能直接管道符,我們才需要額外去循環(huán)調(diào)用。
expect后面就是要識(shí)別的pattern,send就是自動(dòng)傳入的內(nèi)容。
expect eof結(jié)束標(biāo)識(shí),運(yùn)行到此結(jié)束,可以用前面說的interact進(jìn)行交互作為結(jié)束。
其他為變量設(shè)置set 變量名 內(nèi)容, 且exp不識(shí)別#注釋符。

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

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

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

nohup bash rsync.sh &

4. 補(bǔ)充

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

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

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

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