簡單分析實現運維利器 webssh終端

2022-07-15 06:51:10 字數 3949 閱讀 8936

背景

現在幾乎所有東西都嚮往著自動化,在運維界更是如此,運維人員都嚮往自動化代替人工操作、解決人工操作大量重複性工作的問題、故障主動恢復:及時發現;流程;解決。運維規範化:角色定義和責任劃分、流程化等。但這些種種的目的,都離不開非常細小的技術支援,下面我們就來討論如何搭建乙個自動化運維平台,本文先講一講運維平台較重要的技術之一的webssh。

一、技術選型&實現思路

1.後端邏輯,選用:django框架

2.模擬web終端,選用:xterm

3.實現遠端主機連線,建立ssh通道,python庫:paramiko

4.實現web遠端連線必須需要實時保持前後端通訊,使用技術:websocket

5.技術流程圖

二、實現

2.1.建立webssh頁面

xterm.js是乙個開源模擬終端,利用它我們可以建立乙個比較正規好看的終端介面。

其中 ssh.js:

新建乙個xtrem例項,並且發起websocket連線,建立websocket通道。建立起通道前端就能與後端進行通訊,保證資料傳輸。

var window_width = $(window).width();

var window_height = $(window).height();

var term = new terminal(

);$(function () ");

// 開啟webssh頁面就開啟web終端,並且開啟websocket通道

sock.addeventlistener("open",function () );

//獲取從ssh通道獲取的outdata

sock.addeventlistener("message",function (recv) );

//輸入shelldata併發送到後台

term.on("data",function (data) );

window.sock=sock;

});

2.2後台邏輯後台是前端與伺服器之間的橋梁,可以理解成中轉站。具體實現思路在**注釋中有講解。

from dwebsocket.decorators import accept_websocket

@accept_websocket #用於websocket連線的修飾器

def webssh(request):

global ip, port, user, passwd #定義全域性變數連線資訊.

if request.session.get('login')==none: #判斷是否登陸系統,如果沒有就去登陸!

return redirect('/sys/login/')

if not request.is_websocket():#判斷websocket連線,如果是普通的http連線就獲取傳送進來的登陸資訊。

ip = request.post.get('conip')

port = request.post.get('conport')

user = request.post.get('conuser')

passwd = request.post.get('conpass')

print(ip,str(port),user,passwd)

return render(request, 'html/webssh.html', locals())

else: #如果是websocket連線就建立ssh連線,使用paramiko模組建立

client = paramiko.sshclient() #建立連線物件

client.set_missing_host_key_policy(paramiko.autoaddpolicy) #設定自動新增主機名及主機金鑰到本地hostkeys物件,不依賴load_system_host_key的配置。即新建立ssh連線時不需要再輸入yes或no進行確認

try: #用異常丟擲判定主機是否成功連線ssh

client.connect(hostname=ip,port=port,username=user,password=passwd) #connetc為連線函式

print(f'主機連線成功!')

mess = f'主機連線成功!'

except:

print(f'主機連線失敗,請確認輸入資訊!')

mess = f'主機連線失敗!'

sshsession = client.get_transport().open_session() #成功連線後獲取ssh通道

sshsession.get_pty() #獲取乙個終端

sshsession.invoke_shell() #啟用終端

for i in range(2): #啟用終端後會有資訊流,一般都是lastlogin與bath目錄,並獲取其資料

messa = sshsession.recv(1024)

request.websocket.send(messa)

print(request.websocket)

def srecv(): #從ssh通道獲取輸出data,併發送到前端

while true:

sshmess = sshsession.recv(2048)

if not len(sshmess):

print('退出監聽傳送迴圈')

return

request.websocket.send(sshmess)

print('ssh回覆的資訊:' + sshmess.decode('utf-8'))

print(len(sshmess))

for shell in request.websocket: #獲取前端的shelldata並且傳送到伺服器執行

deshell = shell.decode('utf-8')

print('deshell:'+deshell)

# stdin,stdout,stderr = client.exec_command(deshell)

# request.websocket.send(stdout.read())

# request.websocket.send(stderr.read())

sshsession.send(deshell)

# while true:

# sshmess = sshsession.recv(2048)

# request.websocket.send(sshmess)

# print('ssh回覆的資訊:'+sshmess.decode('utf-8'))

# print(len(sshmess))

sshrecvthre = thread(target=srecv, args=()).start() #啟用執行緒監聽ssh通道獲取輸出data,併發送到前端

2.3效果

結束

webssh的應用十分的廣泛,並且在網路的複雜環境中很難確保它的通訊安全,但是針對自己網路所自己編寫的webssh往往安全性會有提公升,以上只是對功能實現上進行了說明,若要對安全上進行防範,還需要對以上**進行改造。

乙個web遠端連線與主機的正刪改查只是乙個運維系統的基礎功能,下次我們來說一下webssh終端如何實現錄影回放~

運維利器screen

1 2 3 4 5 6 7 8 9 預設是沒有screen,需要用yum安裝 screen s name 建立乙個新的screenscreen ls列出有哪些screen在執行 screen rscreenpid或者pid 進入之前埠的screen會話視窗 screen x 進入之前沒斷開的scre...

運維監控利器nagios

nagios的概念和功能 nagios是一款開源的免費網路監視工具,其功能強大,靈活性強。能有效監控windows linux和unix的主機狀態,交換機 路由器等網路設定,印表機等,在系統或服務狀態異常時發出郵件或簡訊報警第一時間通知 運維人員,在狀態恢復後發出正常的郵件或簡訊通知。nagios可...

自動化運維利器(Ansible)二

root lwq.com ssh keygen t rsa f ssh id rsa n 非互動式建立金鑰將本地的公鑰傳輸到被管理節點 root lwq.com ssh copy id root 192.66.66.102 root lwq.com ssh copy id root 192.66.6...