[Linux] 在 expect 程式中使用 if-else 判斷不同的登入狀況

[Linux] 在 expect 程式中使用 if-else 判斷不同的登入狀況

在 Linux 上登入遠端的 SSH 伺服器時,常常需要打帳號/密碼,

當然如果可以產生 SSH key 來免密碼登入 SSH server 是最好,

不過實務上也常常有需要連到不是自己管的 server 的狀況,

這時候 expect 就可以派上用場,自動幫忙輸入帳號/密碼,

還可以多打一些 alias 進去~

 

不過最近遇到一個問題,原本下面的 expect 程式片段運作正常,

但是後來部分的 server 有產生 SSH key 了,所以不用密碼就能登入,

反倒導致 expect 程式卡住在等 “Password” 這個字串出現:

#!/usr/bin/expect -f
set timeout 60
# Get host and password
set host [lrange $argv 0 0]
set passwd  [lrange $argv 1 1]
# Login with password
spawn ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -l root $host
expect "*?assword*:*"
send -- "$passwd\n"
expect "*?ast login*"

interact

 

找了一下,expect 裡面是可以用 if/else 的:Using if/else in expect script

因此把程式改成下面這樣,如果出現 “Password” 就自動輸入密碼,

如果直接遇到了 “Last login” 的話表示已經登入成功 (可能是因為已有 SSH key),

那就可以繼續往下輸入 alias 的部分了~

#!/usr/bin/expect -f
set timeout 60
# Get host and password
set host [lrange $argv 0 0]
set passwd  [lrange $argv 1 1]
# Provide default host
if { [string compare $host ""] == 0 } {
set host "172.22.1.1"
}
# Provide default password
if { [string compare $passwd ""] == 0 } {
set passwd "PASSWORD"
}
# Login with password
spawn ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -l root $host
expect {
"*?assword*:*" {
send -- "$passwd\n"
expect "*?ast login*"
} "*?ast login*" {
}
}
# Additional commands to run after login
send -- "export PS1='\\\[\\e\[0;32m\\\]\\u@\\h \\\[\\e\[0;33m\\\]\\w\\\[\\e\[0m\\\] \\\$ '\n"
send -- "alias ls='ls -F --color'\n"
send -- "alias ll='ls -l'\n"
send -- "alias grep='grep --color'\n"
send -- "alias egrep='egrep --color'\n"
interact

 

程式改好之後,不管是登入有無 SSH key 的 SSH server 都沒有問題囉~ ^^

 

(本頁面已被瀏覽過 3,653 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料