Windows XP Windows 7 Windows 2003 Windows Vista Windows教程綜合 Linux 系統教程
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟件教程
 Windows教程網 >> Linux系統教程 >> Linux系統常見問題解答 >> linux腳本實現自動輸入密碼

linux腳本實現自動輸入密碼

日期:2017/1/20 17:37:53      編輯:Linux系統常見問題解答

使用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 {
        puts "connect is timeout"
        exit 3
    }
}

注意,第一行很重要,通常我們的腳本裡第一行是#!/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腳本效果是這樣的

 

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

Copyright © Windows教程網 All Rights Reserved