paramiko建立可互動的ssh會話

realzhangsan發表於2024-06-12

paramiko建立可互動的ssh會話

python使用paramiko的SSHClient建立的ssh會話可以輕鬆的執行shell命令並獲取結果,但是也存在一些不足,我想要執行history命令,卻發現得不到預期的history的輸出,然後我瞭解到可以使用SSHClient的invoke_shell()函式獲取一個可互動的會話,透過簡單的包裝,可以實現一個使用可互動式會話執行shell命令並獲取執行結果的函式

import time
import paramiko

def invoke_shell_exec(cmd) :
    hostname = '192.168.1.1'
    username = 'root'
    ssh = paramiko.SSHClient()
    ssh.load_system_host_keys()
    ssh.connect(hostname=hostname, username=username)
    channel = ssh.invoke_shell() #獲取可互動式會話
    channel.settimeout(10)  #設定超時丟擲異常
    buff = ''
    msg = ''
    #會話連線後先獲取一下遠端伺服器返回的登入資訊
    while not (buff.endswith('# ') or buff.endswith('$ ')) :
        resp = channel.recv(1024)
        buff += resp.decode()
    msg += buff
    #獲取完登入資訊後再傳送shell命令
    while True :
        if channel.send_ready() :
            channel.send(cmd.encode())
            break
        time.sleep(0.1)
    #再獲取一下shell命令的執行結果
    buff = ''
    while not (buff.endswith('# ') or buff.endswith('$ ')) :
        resp = channel.recv(1024)
        buff += resp.decode()
    msg += buff
    channel.close()
    result = msg.split('\n')
    return result

相關文章