利用expect,提升小小的幸福感
點(diǎn)擊上方 前端瓶子君,關(guān)注公眾號(hào)
回復(fù)算法,加入前端編程面試算法每日一題群
本文首發(fā)于:github.com/bigo-fronte… 歡迎關(guān)注、轉(zhuǎn)載。
??利用expect,提升小小的幸福感
筆者經(jīng)常要使用公司跳板機(jī),登陸到目標(biāo)服務(wù)器,查看日志等操作。要重復(fù)的復(fù)制ssh命令、ip地址等。每天來(lái)回的重復(fù),是否有工具能夠讓重復(fù)的事情機(jī)器做呢?
經(jīng)過(guò)翻閱資料,找到了一個(gè)很好的解決方案,基于expect,實(shí)現(xiàn)ssh自動(dòng)交互。
使用expect后,自動(dòng)幫我們連接服務(wù)器,輸入密碼,交互輸入令牌驗(yàn)證碼,跳轉(zhuǎn)目標(biāo)ip,一鍵登錄。
如果要批量登錄機(jī)器,是不是一下子效率就提升上來(lái)了。??????
什么是expect
expect是一個(gè)用來(lái)處理交互的命令。借助expect,我們可以將交互過(guò)程寫(xiě)在一個(gè)腳本上,使之自動(dòng)化完成。譬如ssh登錄,ftp登錄等場(chǎng)景。
四個(gè)命令
expect中最關(guān)鍵的四個(gè)命令是send,expect,spawn,interact。
-
send:用于向進(jìn)程發(fā)送字符串 -
expect:從進(jìn)程接收字符串 -
spawn:?jiǎn)?dòng)新的進(jìn)程 -
interact:允許用戶交互
send命令
send命令接收一個(gè)字符串參數(shù),并將該參數(shù)發(fā)送到進(jìn)程。
expect1.1> send "hello world\n"
hello world
復(fù)制代碼
expect命令
expect命令和send命令正好相反,expect通常是用來(lái)等待一個(gè)進(jìn)程的反饋。expect可以接收一個(gè)字符串參數(shù),也可以接收正則表達(dá)式參數(shù)。和上文的send命令結(jié)合,現(xiàn)在我們可以看一個(gè)最簡(jiǎn)單的交互式的例子:
expect "hi\n"
send "hello there!\n"
這兩行代碼的意思是:從標(biāo)準(zhǔn)輸入中等到hi和換行鍵后,向標(biāo)準(zhǔn)輸出輸出hello there。
復(fù)制代碼
spawn命令
上文的所有demo都是和標(biāo)準(zhǔn)輸入輸出進(jìn)行交互,但是我們跟希望他可以和某一個(gè)進(jìn)程進(jìn)行交互。spawm命令就是用來(lái)啟動(dòng)新的進(jìn)程的。spawn后的send和expect命令都是和spawn打開(kāi)的進(jìn)程進(jìn)行交互的。結(jié)合上文的send和expect命令我們可以看一下更復(fù)雜的程序段了。
#!/usr/bin/expect -f
set password 123
set timeout -1
spawn ssh -p 26890 [email protected]
expect "*passphrase*"
send "$password\r"
interact
expect eof
這段代碼的作用是登錄到跳板機(jī),匹配到進(jìn)程返回的passphrase關(guān)鍵字,然后自動(dòng)輸入密碼。
復(fù)制代碼
interact
到現(xiàn)在為止,我們已經(jīng)可以結(jié)合spawn、expect、send自動(dòng)化的完成很多任務(wù)了。但是,如何讓人在適當(dāng)?shù)臅r(shí)候干預(yù)這個(gè)過(guò)程了。比如自動(dòng)輸入跳板機(jī)密碼后,還需要用戶手動(dòng)輸入令牌驗(yàn)證碼,才能登錄成功。interact就是等待用戶輸入,實(shí)現(xiàn)人機(jī)交互。
#!/usr/bin/expect -f
set password 123
set timeout -1
spawn ssh -p 26890 [email protected]
expect "*passphrase*"
send "$password\r"
interact
expect eof
復(fù)制代碼
實(shí)踐
好了,簡(jiǎn)單了解expect的用法后,我們就可以上手了。ssh操作,自然離不開(kāi)max終端神器:iterm2
1.新建jump.sh
vim /Users/iterm2/jump.sh
#!/usr/bin/expect -f
set password 123
set timeout -1
spawn ssh -p 26890 [email protected]
expect "*passphrase*"
send "$password\r"
interact
expect eof
復(fù)制代碼
2.新增登錄跳板機(jī)指令
路徑:iterm2 => Preferences => Profiles
3.新建文件
#!/usr/bin/expect -f
set password 123
set remoteip 127.0.0.2
set timeout -1
spawn ssh -p 26890 [email protected]
expect "*passphrase*"
send "$password\r"
expect "*20190802*"
send "go $remoteip\r"
expect "*passphrase*"
send "$password\r"
interact
expect eof
復(fù)制代碼
4.新增登錄目標(biāo)服務(wù)器指令
同上
結(jié)語(yǔ)
一鍵三連的感覺(jué)真香,是不是提升了小小的幸福感!有其他方法也歡迎留言交流,或者補(bǔ)充windows的使用方法。
歡迎大家留言討論,祝工作順利、生活愉快!
最后
