[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 次)