1. 程式人生 > >指令碼連結 ssh 自動輸入密碼

指令碼連結 ssh 自動輸入密碼

上週工作中,遇見一些重複性的工作,為了方便,於是寫起了指令碼。

在這個指令碼中,需要通過 s s h ssh 連結到遠端伺服器,然後執行特定的操作,但是連結伺服器的時候, s s

h ssh 需要驗證是否信任機器(第一次連結的話需要輸入 y e s yes )以及密碼,如果每次都要自己手動去操作,就失去了指令碼的意義。此時, e
x p e c t expect
指令碼就派上了用場。

首先安裝 e x

p e c t expect ,因為預設是沒有安裝這個的, U b u n t u Ubuntu 系統可以直接通過 s u d o   a p t g e t   i n s t a l l   e x p e c t sudo\ apt-get\ install\ expect 來安裝,然後寫好 e x p e c t expect 指令碼,假如說叫做 l o g i n v i a s s h login-via-ssh ,如果指令碼沒有引數的話,直接 e x p e c t   l o g i n v i a s s h expect\ login-via-ssh 就可以了,注意必須用 e x p e c t expect 來執行這個指令碼,其他 s h e l l shell 工具是無法解析這個指令碼的。

不過我這裡寫的 l o g i n v i a s s h login-via-ssh 指令碼有一些引數:

Usage: expect login-via-ssh username password hostname realip script

主要功能是通過 s s h ssh 連結到使用者名稱為 u s e r n a m e username ,密碼為 p a s s w o r d password 的伺服器,伺服器的主機名叫做 h o s t n a m e hostname ,真實的 I P IP 地址為 r e a l i p realip ,連結到這個伺服器後執行 s c r i p t script 指令碼。

#!/usr/bin/expect -f

set timeout 10
set username [lindex $argv 0]
set password [lindex $argv 1]
set hostname [lindex $argv 2]
set realip   [lindex $argv 3]
set script   [lindex $argv 4]

spawn ssh -l $username $realip "echo '$password' | sudo -S ~/$script $hostname"

expect {
    "(yes/no)?" {
        send "yes\n"
        expect "password:"
        send "$password\n"
    }
    "password:" {
        send "$password\n"
    }
}

interact

這裡用來實現自動輸入的是 e x p e c t expect 部分,當檢測到 ( y e s / n o ) ? (yes/no)? 的時候,會自動輸入 y e s yes ,檢測到 p a s s w o r d : password: 時會自動輸入 p a s s w o r d password

另外, s p a w n spawn 後雙引號裡的內容,是要在 s s h ssh 遠端連結到的伺服器上執行的,因為 s u d o sudo 許可權需要鍵入密碼,所以通過 e c h o echo 的方式來進行自動輸入密碼。

說到這裡,就不得不說的是,常見的自動輸入密碼的方法有三種,但是對於 s s h ssh s c p scp 這種命令只能通過 e x p e c t expect 來進行自動輸入密碼的操作。

x s c p xscp 指令碼:

#!/usr/bin/expect -f
# Usage: expect xscp a b c

set timeout 10
set source [lindex $argv 0]
set target [lindex $argv 1]
set passwd [lindex $argv 2]

spawn scp $source $target

expect {
    "(yes/no)?" {
        send "yes\n"
        expect "password:"
        send "$passwd\n"
    }
    "password:" {
        send "$passwd\n"
    }
}

interact

更多有趣的指令碼歡迎大佬們指點。