先簡單的介紹一下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就沒問題了