# coding=utf-8 import paramiko from time import sleep transport = paramiko.Transport(('192.168.1.58',22)) print(transport) # 返回 <paramiko.Transport at 0x5745ed0 (unconnected)> #此時可以看到Transport還沒有連接 transport.connect(username='root',password='123456') print(transport) # 返回 <paramiko.Transport at 0x5745ed0 (cipher aes128-ctr, 128 bits) (active; 0 open channel(s))> #調用connect后,此時可以看到Transport連接成功,但active為0表示還沒有open的 channel channel = transport.open_session() print(channel) # 返回<paramiko.Channel 0 (open) window=0 -> <paramiko.Transport at 0x5745ed0 (cipher aes128-ctr, 128 bits) (active; 1 open channel(s))>> #調用open_session后,active為1,表示 已打開channel但是window=0表示我們這個通道還不能接收數據 channel.get_pty() # 激活終端,這樣就可以登錄到終端了,就和我們用類似於xshell登錄系統一樣.如果不使用該命令則只能獲取下發命令后的回顯,不會顯示顯示回顯以外的如“[root@localhost ~]#”等其他內容 channel.invoke_shell() print(channel) # 返回<paramiko.Channel 0 (open) window=2097152 -> <paramiko.Transport at 0x5745ed0 (cipher aes128-ctr, 128 bits) (active; 1 open channel(s))>> # 調用invoke_shell()后,window!=0表示我們通道已經可用了 sleep(2) # 是為了一次能顯示完所有回顯,如果不等待2秒,獲取的回顯可能不完整。 channelStatus1 = channel.recv_ready() # 檢查通道是否有IO數據,若沒有則返回False,可以用來判斷數據是否完全回顯 print(channelStatus1) # 此時返回Treue backMsg = channel.recv(65535).decode('utf-8') # 獲取到的是登錄信息 ####強調,只有激活了終端才能獲取 print(backMsg) channelStatus2 = channel.recv_ready() print(channelStatus2) channel.send('ls \n') # \n相當於敲下回車#此時通過print(channel)命令,返回<paramiko.Channel 0 (open) window=2097149 in-buffer=67 -> <paramiko.Transport at 0x5745ed0 (cipher aes128-ctr, 128 bits) (active; 1 open channel(s))>> print(channel) # 此時多了個in-buffer=67表示回顯了67B的內容 sleep(2) # 是為了一次能顯示完所有回顯,如果不等待2秒,獲取的回顯可能不完整。 channelStatus3 = channel.recv_ready() print(channelStatus3) a = channel.recv(65535) # 使用recv讀取in-buffer內容,65535表示預讀取內容大小,若該值小於in-buffer值,則會讀取不完全 print(a) # 獲取讀取的內容 print(a.decode('utf-8')) # recv獲取的值是以b字符類型顯示的,需要轉碼成后才能顯示成linux終端的樣式。若我們只想獲取命令返回的結果可以注釋掉channel.get_pty()代碼 print(channel) # 讀取完后,在來查看channel,發現無in-buffer值 channel.close() transport.close()