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

2021-12-30 05:35:35 字數 1555 閱讀 3909

使用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

set local_file [lindex $ar** 0]

set remote_path [lindex $ar** 1]

set passwd your_passwd

set passwderror 0

spawn scp $local_file $remote_path

expect

set timeout 1000

set passwderror 1

send "$passwd\r"

exp_continue

}"*es/no)?*"

timeout

}注意,第一行很重要,通常我們的指令碼裡第一行是#!/bin/bash,而這裡是你機器上expect程式的路徑,說明這段指令碼是由expect來解釋執行的,而不是由bash解釋執行,所以**的語法和shell指令碼也是不一樣的,其中set passwd your_passwd設定成你自己的密碼,然後執行如下命令

./scp.exp ./local_file user@host:/xx/yy/執行前確保scp.exp有執行許可權,第乙個引數為你本地檔案,第二個為遠端主機的目錄,執行指令碼如果報錯「connect is timeout」,可以把超時設長一點,第二行set timeout 20可以設定超時時間,單位是秒。指令碼執行效果如下

細心的同學一定發現了,其實expect提供的是和終端的一種互動機制,輸入密碼只是其中一種應用形式,只要是在終端阻塞需要輸入時,都可以通過expect指令碼完成自動輸入,比如前面指令碼裡配置了兩種互動場景,一種是終端提示"password:"時輸入密碼,還有一種是提示"yes/no)?"時輸入「yes」,如果和遠端主機是第一次建立連線,執行scp.exp指令碼效果是這樣的

所以我們可以根據終端的提示來配置輸入命令,這樣就能達到了自動化的效果。至於處理其它互動場景,只需要照著上面的指令碼依葫蘆畫瓢就行了

linux 自動輸入密碼指令碼避免密碼確認

有時候需要執行乙個小指令碼,就把一部分命令集合起來,我們可以使用 或者 sh 指令碼換行。而有些時候涉及許可權需要輸入密碼就出現了一些客戶端會卡在輸密碼的介面讓使用者輸入 指令碼會暫停,為了避免每次都輸入密碼 可以使用乙個寫死密碼的指令碼 當然這樣極不安全,但是如果是個人電腦或者為了方便快捷這種方法...

shell指令碼 自動輸入密碼

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

bash指令碼,自動輸入sudo的密碼

解決方法 echo 管道 開始使用 echo admin sudo service tomcat7 stop 始終提示輸入密碼 後來檢視了下sudo命令的使用 man sudo 發現有如下的解釋 s the s stdin option causes sudo to read the passwor...