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