linux腳本實現自己主動輸入password
使用Linux的程序猿對輸入password這個舉動一定不陌生,在Linux下對用戶有嚴格的權限限制,幹非常多事情越過了權限就得輸入password。比方使用超級用戶運行命令,又比方ftp、ssh連接遠程主機等等,例如以下圖
那麽問題來了。在腳本自己主動化運行的時候須要輸入password怎麽辦?比方你的腳本裏有一條scp語句。總不能在腳本運行到這一句時手動輸入password吧
針對於ssh或scp命令。可能有人會回答是建立信任關系,關於建立ssh信任關系的方法請自行百度Google。僅僅須要兩行簡單的命令就可以搞定,但這並非常規的解決方式,假設是ftp連接就沒轍了,況且。你不可能為了運行某些命令去給每一個你要連接的主機都手動建立ssh信任。這已經偏離了今天主題的本意。今天要說的是在腳本裏自己主動輸入password,我們能夠想象下,更優雅的方式應該是在腳本裏自己配置password。當屏幕交互須要輸入時自己主動輸入進去,要達到這種效果就須要用到expect
安裝
CentOS下安裝命令非常easy,例如以下
sudo yum install expect
至於Mac用戶,能夠通過homebrew安裝(須要先安裝homebrew。請自行Google)
brew install expect
測試腳本
我們寫一個簡單的腳本實現scp復制文件,在腳本裏配置password。保存為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 { puts "connect is timeout" exit 3 } }
註意,第一行非常重要,通常我們的腳本裏第一行是#!/bin/bash
,而這裏是你機器上expect程序的路徑,說明這段腳本是由expect來解釋運行的,而不是由bash解釋運行。所以代碼的語法和shell腳本也是不一樣的,當中set passwd your_passwd
設置成你自己的password,然後運行例如以下命令
./scp.exp ./local_file [email protected]
運行前確保scp.exp有運行權限,第一個參數為你本地文件。第二個為遠程主機的文件夾,運行腳本假設報錯“connect is timeout”,能夠把超時設長一點。第二行set timeout 20
能夠設置超時時間。單位是秒。腳本運行效果例如以下
還能做什麽
細心的同學一定發現了,事實上expect提供的是和終端的一種交互機制,輸入password僅僅是當中一種應用形式,僅僅要是在終端堵塞須要輸入時,都能夠通過expect腳本完畢自己主動輸入,比方前面腳本裏配置了兩種交互場景。一種是終端提示"password:"時輸入password。另一種是提示"yes/no)?
"時輸入“yes”,假設和遠程主機是第一次建立連接。運行scp.exp腳本效果是這種
所以我們能夠依據終端的提示來配置輸入命令。這樣就能達到了自己主動化的效果。至於處理其他交互場景,僅僅須要照著上面的腳本依葫蘆畫瓢即可了
linux腳本實現自己主動輸入password