1. 程式人生 > >linux腳本實現自己主動輸入password

linux腳本實現自己主動輸入password

問題 center 例如 單位 運行 第一個 swd 同學 自己

使用Linux的程序猿對輸入password這個舉動一定不陌生,在Linux下對用戶有嚴格的權限限制,幹非常多事情越過了權限就得輸入password。比方使用超級用戶運行命令,又比方ftp、ssh連接遠程主機等等,例如以下圖

技術分享

那麽問題來了。在腳本自己主動化運行的時候須要輸入password怎麽辦?比方你的腳本裏有一條scp語句。總不能在腳本運行到這一句時手動輸入password吧

針對於ssh或scp命令。可能有人會回答是建立信任關系,關於建立ssh信任關系的方法請自行百度Google。僅僅須要兩行簡單的命令就可以搞定,但這並非常規的解決方式,假設是ftp連接就沒轍了,況且。你不可能為了運行某些命令去給每一個你要連接的主機都手動建立ssh信任。這已經偏離了今天主題的本意。今天要說的是在腳本裏自己主動輸入password,我們能夠想象下,更優雅的方式應該是在腳本裏自己配置password。當屏幕交互須要輸入時自己主動輸入進去,要達到這種效果就須要用到expect

安裝

CentOS下安裝命令非常easy,例如以下

sudo yum install expect

至於Mac用戶,能夠通過homebrew安裝(須要先安裝homebrew。請自行Google)

brew install expect

測試腳本

我們寫一個簡單的腳本實現scp復制文件,在腳本裏配置password。保存為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設置成你自己的password,然後運行例如以下命令

./scp.exp ./local_file [email protected]
/* */:/xx/yy/

運行前確保scp.exp有運行權限,第一個參數為你本地文件。第二個為遠程主機的文件夾,運行腳本假設報錯“connect is timeout”,能夠把超時設長一點。第二行set timeout 20能夠設置超時時間。單位是秒。腳本運行效果例如以下

技術分享

還能做什麽

細心的同學一定發現了,事實上expect提供的是和終端的一種交互機制,輸入password僅僅是當中一種應用形式,僅僅要是在終端堵塞須要輸入時,都能夠通過expect腳本完畢自己主動輸入,比方前面腳本裏配置了兩種交互場景。一種是終端提示"password:"時輸入password。另一種是提示"yes/no)?

"時輸入“yes”,假設和遠程主機是第一次建立連接。運行scp.exp腳本效果是這種

技術分享

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

linux腳本實現自己主動輸入password