expect實現命令行簡單交互

在服務器開發中,有時候須要自動同步另外一個服務器的一個文件,這時候就須要經過scp來把文件複製到當前服務器目錄下,如:linux

scp -r -P 2214:lex@192.168.120.204:/data/user/user.profile  ./

scp須要認證用戶名和密碼,能夠經過在對方服務器經過密鑰對來驗證不須要輸入密碼驗證,但除了這個還有其餘方法,可以實如今執行scp命令時,要求輸入密碼時可以自動輸入密碼嗎?程序員

linux提供了一個Expect的工具,Expect是Unix系統中用來進行自動化控制和測試的軟件工具,由DonLibes製做,做爲Tcl腳本語言的一個擴展,應用在交互式軟件中如telnet,ftp,Passwd,fsck,rlogin,tip,ssh等等。該工具利用Unix僞終端包裝其子進程,容許任意程序經過終端接入進行自動化控制;也可利用Tk工具,將交互程序包裝在X11的圖形用戶界面中。正則表達式

簡單地說,expect是一個工具,能夠根據用戶設定的規則和系統進程進行自動化交互,例如遠程登錄的密碼輸入、自動化的執行遠程命令。 expect的安裝很簡單,幾個命令就搞定,具體谷歌(不是百度,程序員不要用百度)。 這是一個ssh自動登陸的腳本:bash

#!/usr/bin/expect
spawn ssh root@192.168.22.194
expect "*password:"
send "123\r"
expect "*#"
interact

以上代碼有幾個關鍵字,服務器

  • send:用於向進程發送字符串
  • expect: 指望從進程接收到的字符串,後面也能夠跟正則表達式
  • spawn:啓動進程 第一行指定了該腳本的解釋器,代碼保存爲ssh.exp 須要運行時輸入./ssh.exp 便可。 不少時候,咱們使用expect的場景都是結合bash在使用,expect只是做爲bash腳本的部分調用,由於bash裏咱們還須要執行其餘複雜的功能:
#!/usr/bin/bash
 ...
expect<<- END 
scp -r -P 2214:lex@192.168.120.204:/data/user/user.profile  ./ 
expect "*password"
send "password"
expect eof 
END

將expect腳本嵌入expect<<- END 和END之間便可,expect eof是指等待腳本執行結束,這裏若是scp,要傳輸的文件略大,會斷掉,由於expect有個默認的超時時間,時間到了腳本會中斷,能夠經過:ssh

set timeout -1 -- 沒有timeout 
set timeout XX -- 設定具體的timeout時間(秒)

以上就是關於expect的簡單使用,至於更高級的用法,須要的時候去搜索搜索就好了,都不難。工具

相關文章
相關標籤/搜索