Photo by Sami Anas from Pexels
1. 堡壘機簡介
在日常的后端開發中,與服務器打交道是家常便飯的事情,通常生產中的開發會采用堡壘機這種設施來提供一個受控制的訪問手段。
跳板機(Jump Server、JumpBox),也稱堡壘機,是一類可作為跳板批量操作遠程設備的網絡設備,是系統管理員或運維人員常用的操作平台之一。跳板機最核心的功能是以本機作為跳板來操作遠程設備,較為普遍地是通過 ssh 協議實現遠程管理。
以上描述翻譯自Wikipedia:https://en.wikipedia.org/wiki/Jump_server
= =! 最近公司更換了使用的堡壘機產品,之前寫的腳本不能通用了,重寫后順便記錄一下。
堡壘機示意圖,圖片來源:https://medium.com/rangle-io/jumpboxes-how-to-avoid-storing-ssh-keys-59e3dc78e5e6
2. 為何需要腳本
相信實際使用過堡壘機的同學都明白,連接處於堡壘機后方的服務器時需要先進行一些選擇的操作,雖然並不是很麻煩,但是和自己搭建的Linux虛擬機相比總是少了一點方便快捷。如下圖,左邊虛擬機直接連接,而右邊的堡壘機則需要進行選擇,作為一向追求效率(懶)的程序猿怎么能浪費寶貴的時間在做這種選擇上~
3. 怎么通過腳本跳轉
如第二小節的圖示,一般的堡壘機終端連接時都提供了一些便捷選項,讓我們通過鍵盤快捷的找到目標機器,於是我們可以通過腳本來模擬從堡壘機登錄的過程。
例如以下Shell腳本就可以完成堡壘機的跳轉,雖然實現的比較簡陋,但足以幫助理解:
#!/bin/bash
# 需要先安裝expect
expect -c "
# 開啟新會話
spawn -noecho ssh abc@buzhidao-public.buzhidao.aliyuncs.com -p 12345;
# 等待屏幕上出現password,然后模擬鍵盤輸入發送密碼
expect *password:*;
send -- bu gao su ni\r;
# 等待屏幕上出現堡壘機Shell界面,然后發送跳轉符
expect *NUM*;
send :;
sleep 1
# 發送跳轉的編號和回車
send 1\r;
sleep 1
send \r;
# 交還交互式控制權給用戶
interact;
"
這里為了演示直接發送了跳轉固定ID的機器,如果確實用Shell腳本實現的話可以在這里發送正則表達式來讓腳本變得通用
4. XShell版腳本
事實上在XShell中也是一樣的實現步驟,只不過可以便捷的寫入到會話設置中,雙擊一下像是登錄虛擬機一樣方便。
右擊XShell的會話,打開屬性設置,進入登錄腳本項即可開始編寫腳本:
XShell的Expect發送規則支持正則表達式,所以用起來也是很方便的,可以先嘗試一下用發送規則,但是發送規則是無序的,如果跳轉過程依賴順序或者比較復雜就需要使用腳本語言了。如圖,可以選擇發送規則和腳本,或者兩者同時使用也是可以的。
這里以我自己的登錄腳本作為示例:
def Main():
global xsh
xsh.Screen.WaitForString("NUM")
xsh.Screen.Send("/")
xsh.Screen.WaitForString("/")
xsh.Screen.Send("*這里是匹配主機的正則表達式*")
xsh.Screen.Send("\n")
XShell腳本文檔:XShell | Script Starting and Ending