linux expect 簡介與使用

先簡單的介紹一下expect的使用實例
通常是用來ftp或者ssh交互時必須要人工操作的
但是、有的時候需要批量操作多臺機器的時候、也不能一臺一臺的處理
那麼expect的腳本就可以用的上了、
但是expect有一個比較大的弊端、就是它是一個腳本的語言
所有的代碼全世界都可以看懂
那麼安全問題就是一個很大的問題、
首先不的不說的就是權限的問題、一定要給的就是700
其它用戶一定不要有讀權限

接下來貼一段expect的代碼,這也是我測試用的ssh

#!/usr/bin/expect -f
spawn ssh ll@localhost
expect "*password:"
send "123456\r"
expect "*$*"
send "echo 'hello world'\r"
send "sleep 1\r"
send "exit\r"
expect eof


第一行是一個魔法串、用來告訴解釋器本腳本是expect
spawn 之後加上的就是你打算的操作、可以全部替換成變量的那種操作如果
是爲了方便的話
expect 加上的就是你想要期待的字符、一般用的是 *關鍵字* 如果你確定
你的匹配不會出錯、那麼怎麼匹配都沒問題
匹配以後的send就是相當於手打的一樣、最後加上一個\r代表回車
這就是最簡單的一個流程
還有一種就是用花括號的方法來做,一會有機會介紹一下

expect {
"*yes/no*" { send "yes\n"}
"*password*" {send "123456\r"}
}

這裏需要注意的就是、expect 與花括號之間需要一個空格間隔
或者就是加一個tab都沒問題
還有就是 expect “*$” 或者 “*#” 後面一般匹配PS1後面加個空格
要不就加個 * 通配符,省的半天不知道錯哪

接下來介紹一下另一種匹配的問題,
按照正常的來說、一般expect會用的匹配就是linux的正則、
跟sed等的正則不一樣、*是一個通配符、但是
某些時候需要匹配的東西用通配符搞不定
那麼就可以使用正則表達式
就是通常sed、awk用到的正則
接下來貼一下代碼
就是上一個的改進版

#!/usr/bin/expect -f
spawn ssh ll@localhost
expect -re "^.*password.*$"
send "123456\r"
expect "*$*"
send "echo 'hello world'\r"
send "sleep 5\r"
send "exit\r"
expect eof

僅僅是第四行有了一些改變、畢竟是爲了實驗
加了一個 -re  參數、re就是正則regular的縮寫
之後的“”之間就可以利用正則來寫了、個人感覺用處不大
一般通配符就搞定了、爲了文章的完整性、就寫一下把

Expect中最關鍵的四個命令是send,expect,spawn,interact。

send:用於向進程發送字符串
expect:從進程接收字符串
spawn:啓動新的進程
interact:允許用戶交互


接下來介紹一下interact表示允許用戶交互、也是一個比較雞肋的用途把
貼一下代碼

root@lp:~/pwb/tmp# cat ssh3.exp 
#!/usr/bin/expect -f
spawn ssh ll@localhost
expect -re "^.*password.*$"
send "123456\r"
expect "*$*"
send "echo 'hello world'\r"
send "sleep 5\r"
interact
root@lp:~/pwb/tmp# ./ssh3.exp 
spawn ssh ll@localhost
ll@localhost's password: 
Last login: Sun Mar  6 10:50:06 2016 from localhost
Could not chdir to home directory /home/ll: No such file or directory
$ echo 'hello world'
sleep 5
hello world
$ $

最後的exit讓我去掉了、那麼最終不會退出
將把交互交給用戶、就是這樣、不過基本用不上

還有一件事、就是我是做測試用、並沒有寫太多
最好就是加上timeout

set timeout 60
這個寫在開頭就可以
timeout的時間單位事秒

這就是今天所有的總結了、就這樣
一般瞭解這麼多就夠了、其他的總結也沒啥用,用bash就沒問題了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章