指令碼連結 ssh 自動輸入密碼
阿新 • • 發佈:2019-01-06
上週工作中,遇見一些重複性的工作,為了方便,於是寫起了指令碼。
在這個指令碼中,需要通過 連結到遠端伺服器,然後執行特定的操作,但是連結伺服器的時候, 需要驗證是否信任機器(第一次連結的話需要輸入 )以及密碼,如果每次都要自己手動去操作,就失去了指令碼的意義。此時, 指令碼就派上了用場。
首先安裝 ,因為預設是沒有安裝這個的, 系統可以直接通過 來安裝,然後寫好 指令碼,假如說叫做 ,如果指令碼沒有引數的話,直接 就可以了,注意必須用 來執行這個指令碼,其他 工具是無法解析這個指令碼的。
不過我這裡寫的 指令碼有一些引數:
Usage: expect login-via-ssh username password hostname realip 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
這裡用來實現自動輸入的是 部分,當檢測到 的時候,會自動輸入 ,檢測到 時會自動輸入 。
另外, 後雙引號裡的內容,是要在 遠端連結到的伺服器上執行的,因為 許可權需要鍵入密碼,所以通過 的方式來進行自動輸入密碼。
說到這裡,就不得不說的是,常見的自動輸入密碼的方法有三種,但是對於 和 這種命令只能通過 來進行自動輸入密碼的操作。
指令碼:
#!/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
更多有趣的指令碼歡迎大佬們指點。