在服務器開發中,有時候須要自動同步另外一個服務器的一個文件,這時候就須要經過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
以上代碼有幾個關鍵字,服務器
#!/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的簡單使用,至於更高級的用法,須要的時候去搜索搜索就好了,都不難。工具