python 與linux交互


# 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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM