tcl expect 自動化登入 scp

2021-07-25 03:13:09 字數 2629 閱讀 1214

1. expect是基於tcl演變而來的,所以很多語法和tcl類似,基本的語法如下所示:

1.1 首行加上/usr/bin/expect

1.2 spawn: 後面加上需要執行的shell命令,比如說spawn sudo touch testfile

1.3 expect: 只有spawn執行的命令結果才會被expect捕捉到,因為spawn會啟動乙個程序,只有這個程序的相關資訊才會**捉到,主要包括:標準輸入的提示資訊,eof和timeout。

1.4 send和send_user:send會將expect指令碼中需要的資訊傳送給spawn啟動的那個程序,而send_user只是回顯使用者發出的資訊,類似於shell中的echo而已。

2. 乙個小例子,用於linux下賬戶的建立:

filename: account.sh,可以使用./account.sh newaccout來執行;

1 #!/usr/bin/expect

23 set passwd "mypasswd"

4 set timeout 60

56 if

1011 set user [lindex $argv [expr $argc-1]]

1213 spawn sudo useradd -s /bin/bash -g mygroup -m $user

1415 expect

21     eof

22    

25 }

2627 spawn sudo passwd $user

28 expect

33     eof

34    

37 }

3839 spawn sudo smbpasswd -a $user

40 expect

45     eof

46    

49 }

3. 注意點:

第3行: 對變數賦值的方法;

第4行: 預設情況下,timeout是10秒;

第6行: 引數的數目可以用$argc得到;

第11行:引數存在$argv當中,比如取第乙個引數就是[lindex $argv 0];並且如果需要計算的話必須用expr,如計算2-1,則必須用[expr 2-1];

第13行:用spawn來執行一條shell命令,shell命令根據具體情況可自行調整;有文章說sudo要加-s,經過實際測試,無需加-s亦可;

第15行:一般情況下,如果連續做兩個expect,那麼實際上是序列執行的,用例子中的結構則是並行執行的,主要是看匹配到了哪乙個;在這個例子中,如果你寫成序列的話,即

expect "assword"

send "$passwd\n"

expect eof

send_user "eof"

那麼第一次將會正確執行,因為第一次sudo時需要密碼;但是第二次執行時由於密碼已經輸過(預設情況下sudo密碼再次輸入時間為5分鐘),則不會提示使用者去輸入,所以第乙個expect將無法匹配到assword,而且必須注意的是如果是spawn命令出現互動式提問的但是expect匹配不上的話,那麼程式會按照timeout的設定進行等待;可是如果spawn直接發出了eof也就是本例的情況,那麼expect "assword"將不會等待,而直接去執行expect eof。

這時就會報expect: spawn id exp6 not open,因為沒有spawn在執行,後面的expect指令碼也將會因為這個原因而不再執行;所以對於類似sudo這種命令分支不定的情況,最好是使用並行的方式進行處理;

第17行:僅僅是乙個使用者提示而已,可以刪除;

第18行:向spawn程序傳送password;

第19行:使得spawn程序在匹配到乙個後再去匹配接下來的互動提示;

第21行:eof是必須去匹配的,在spawn程序結束後會向expect傳送eof;如果不去匹配,有時也能執行,比如sleep多少秒後再去spawn下乙個命令,但是不要依賴這種行為,很有可能今天還可以,明天就不能用了;

4. 其他

下面這個例子比較特殊,在整個過程中就不能expect eof了:

1  #!/usr/bin/expect

23  set timeout 30

4  spawn ssh 10.192.224.224

5  expect "password:"

6  send "mypassword\n"

7  expect "*$"

8  send "mkdir tmpdir\n"

9  expect "*$"

timeout指expect等待命令至多等30seconds

這個例子實際上是通過ssh去登入遠端機器,並且在遠端機器上創佳乙個目錄,我們看到在我們輸入密碼後並沒有去expect eof,這是因為ssh這個spawn並沒有結束,而且手動操作時ssh實際上也不會自己結束除非你exit;所以你只能expect bash的提示符,當然也可以是機器名等,這樣才可以在遠端建立乙個目錄。

注意,請不要用spawn mkdir tmpdir,這樣會使得上乙個spawn即ssh結束,那麼你的tmpdir將在本機建立。

當然實際情況下可能會要你確認ssh key,可以通過並行的expect進行處理,不多贅述。

5. 覺得bash很多情況下已經很強大,所以可能用expect只需要掌握這些就好了,其他的如果用到可以再去google了。

web自動化練習 登入

from selenium import webdriver import unittest,time class firecontroltest unittest.testcase def setup self self.driver webdriver.chrome self.driver.ma...

自動化測試模型(登入模組化)

從業務流程及用例分析,每乙個自動化測試用例的執行過程為 先執行登入操作,然後執行具體的操作 如檔案 資料夾的建立 刪除 移動 重新命名等操作 最後執行退出操作。如上面的測試用例,登入與退出操作是相對固定的,那麼我們可以把登入與退出操作進行模組化,然後呼叫,一方面不用寫重複 另一方面可以使測試用例更關...

Python介面自動化 繞過驗證登入

以登入為例,url 1.登入前後,檢視cookie差異,登入後新增 cnblogscookie 和 cnblogs.aspnetcore.cookies 將name和value複製出來,用作後續新增cookie。s requests.session 開啟乙個會話session c requests....