Shell指令碼實現自動輸入密碼登入伺服器

2021-08-14 18:14:59 字數 2931 閱讀 1839

這裡我們主要講使用expect實現自動輸入功能:

安裝:centos下安裝命令,如下:

yum install  expect

開始之前的乙個簡單例項:

[plain]

view plain

copy

#!/usr/bin/expect  

spawn ssh [email protected]  

expect "*password:"  

send "123\r"  

expect "*#"  

interact  

expect是乙個用來處理互動的命令。我們可以使用expect完成ftp和scp登陸的時候密碼的自動輸入。

expect基礎

expect常用的四個命令:

spawn

啟動新的程序

expect

從程序接收字串

send用於向程序傳送字串

interact允許使用者互動

詳細解釋:

spawn命令用來啟動新的程序,spawn後的sendexpect命令都是和使用spawn開啟的程序進行互動。

send命令接收乙個字串引數,並將該引數傳送到程序。

expect命令和send命令相反,expect通常用來等待乙個程序的反饋,我們根據程序的反饋,再傳送對應的互動命令。

interact命令用的其實不是很多,一般情況下使用spawnsendexpect命令就可以很好的完成我們的任務;但在一些特殊場合下還是需要使用interact命令的,interact命令主要用於退出自動化,進入人工互動。比如我們使用spawnsendexpectinteract命令就可以很好的完成這個任務。

栗子:[plain]

view plain

copy

#!/bin/expect  

set timeout 30  

set host "101.200.241.109"  

set username "root"  

set password "123456"  

spawn ssh $username@$host  

expect "*password*"   

interact  

這是一段非常簡單的expect示例**,演示了expect的基本使用方法。

#!/usr/tcl/bin/expect:使用expect來解釋該指令碼;

set timeout 30:設定超時時間,單位為秒,預設情況下是10秒;

set host "101.200.241.109":設定變數;

spawn ssh $username@$host:spawn是進入expect環境後才可以執行的expect內部命令,如果沒有裝expect或者直接在預設的shell下執行是找不到spawn命令的。它主要的功能是給ssh執行程序加個殼,用來傳遞互動指令;

expect "*password*":這裡的expect也是expect的乙個內部命令,這個命令的意思是判斷上次輸出結果裡是否包含「password」的字串,如果有則立即返回;否則就等待一段時間後返回,這裡等待時長就是前面設定的30秒;

send "$password\r":當匹配到對應的輸出結果時,就傳送密碼到開啟的ssh程序,執行互動動作;

interact:執行完成後保持互動狀態,把控制權交給控制台,這個時候就可以手工操作了。如果沒有這一句登入完成後會退出,而不是留在遠端終端上。

這就是對上述這段簡單簡單指令碼的分析,在上述的示例中,涉及到expect中乙個非常重要的概念——模式-動作;即上述expect "*password*"這句**表達出來的含義。

模式-動作

結合著expect "*password*"這句**來說說「模式-動作」。簡單的說就是匹配到乙個模式,就執行對應的動作;匹配到password字串,就輸入密碼。你可能也會看到這樣的**:

expect 

eof

}

其中exp_continue表示迴圈式匹配,通常匹配之後都會退出語句,但如果有exp_continue則可以不斷迴圈匹配,輸入多條命令,簡化寫法。

傳參很多時候,我們需要傳遞引數到指令碼中,現在通過下面這段**來看看如何在expect中使用引數:

#!/usr/tcl/bin/expect

ifset

timeout -1

sethost

[lindex $argv 0]

setusername

[lindex $argv 1]

setpassword

[lindex $argv 2]

spawn ssh $username@$host

expect

"*password*"

interact

在expect中,$argc表示引數個數,而引數值存放在$argv中,比如取第乙個引數就是[lindex $argv 0],以此類推。

shell指令碼 自動輸入密碼

平時在控制台輸入指令如 sudo ssh ftp或者修改admin許可權的檔案時候都會要求輸入password,但是在she ll指令碼執行過程中該如何互動實現自動輸入密碼呢?下面總結三種實現方法。shell用重定向作為標準輸入的用法是 cmd 實現ftp自動登入並執行ls指令的用法如下 其中pet...

linux指令碼實現自動輸入密碼

使用linux的程式設計師對輸入密碼這個舉動一定不陌生,在linux下對使用者有嚴格的許可權限制,幹很多事情越過了許可權就得輸入密碼,比如使用超級使用者執行命令,又比如ftp ssh連線遠端主機等等,如下圖 那麼問題來了,在指令碼自動化執行的時候需要輸入密碼怎麼辦?比如你的指令碼裡有一條scp語句,...

shell實現的密碼輸入指令碼,可將輸入字元轉換為

bin ksh 該段指令碼實現輸入密碼並且用 號顯示輸入字元,輸入回車鍵終止輸入密碼。該 在sco 5.05上 ksh下已經除錯通過。河南 平頂山 王向宇 2005.05.11 該函式實現無緩衝輸入乙個字元,並傳給位置引數 getchar clear 將游標定位到15行10列 tput cup 15...