使用Linux的程序員對輸入密碼這個舉動一定不陌生,在Linux下對用戶有嚴格的權限限制,干很多事情越過了權限就得輸入密碼,比如使用超級用戶執行命令,又比如ftp、ssh連接遠程主機等等,如下圖:

那么問題來了,在腳本自動化執行的時候需要輸入密碼怎么辦?比如你的腳本里有一條scp語句,總不能在腳本執行到這一句時手動輸入密碼吧。
針對于ssh或scp命令,可能有人會回答是建立信任關系,關于建立ssh信任關系的方法請自行百度Google,只需要兩行簡單的命令即可搞定,但這并不是常規的解決方案,如果是ftp連接就沒轍了,況且,你不可能為了執行某些命令去給每個你要連接的主機都手動建立ssh信任,這已經偏離了今天主題的本意,今天要說的是在腳本里自動輸入密碼,我們可以想象下,更優雅的方式應該是在腳本里自己配置密碼,當屏幕交互需要輸入時自動輸入進去,要達到這樣的效果就需要用到expect。
安裝
CentOS下安裝命令很簡單,如下
代碼如下:
sudo yum install expect
至于Mac用戶,可以通過homebrew安裝(需要先安裝homebrew,請自行Google)
代碼如下:
brew install expect
測試腳本
我們寫一個簡單的腳本實現scp拷貝文件,在腳本里配置密碼,保存為scp.exp如下
代碼如下:
#!/usr/bin/expect
set timeout 20
if { [llength $argv] < 2} {
puts "Usage:"
puts "$argv0 local_file remote_path"
exit 1
}
set local_file [lindex $argv 0]
set remote_path [lindex $argv 1]
set passwd your_passwd
set passwderror 0
spawn scp $local_file $remote_path
expect {
"*assword:*" {
if { $passwderror == 1 } {
puts "passwd is error"
exit 2
}
set timeout 1000
set passwderror 1
send "$passwd/r"
exp_continue
}
"*es/no)?*" {
send "yes/r"
exp_continue
}
timeout {
新聞熱點
疑難解答