python paramiko模塊學習分享
paramiko是用python語言寫的一個模塊,遵循SSH2協(xié)議,支持以加密和認證的方式,進行遠程服務器的連接。paramiko支持Linux, Solaris, BSD, MacOS X, Windows等平臺通過SSH從一個平臺連接到另外一個平臺。利用該模塊,可以方便的進行ssh連接和sftp協(xié)議進行sftp文件傳輸。
首先讓我們理清以下幾個名詞:
SSHClient:包裝了Channel、Transport、SFTPClient
Channel:是一種類Socket,一種安全的SSH傳輸通道;
Transport:是一種加密的會話(但是這樣一個對象的Session并未建立),并且創(chuàng)建了一個加密的tunnels,這個tunnels叫做Channel;
Session:是client與Server保持連接的對象,用connect()/start_client()/start_server()開始會話.
paramiko 參考http://docs.paramiko.org/en/2.0/index.html
下載安裝
pycrypto,由于 paramiko 模塊內(nèi)部依賴pycrypto,所以先下載安裝pycrypto
pip3 install pycrypto
pip3 install paramiko
具體模塊使用
SSHClient:
遠程連接分為兩種:(1)基于用戶名密碼連接 (2)基于公鑰秘鑰連接
通過是用paramiko遠程操作,其實本質(zhì)也分為兩種:(1)只用SSHClient (2)自己創(chuàng)建一個transport
基于用戶名密碼連接
import paramiko # 創(chuàng)建SSH對象 ssh = paramiko.SSHClient() # 允許連接不在know_hosts文件中的主機 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 連接服務器 ssh.connect(hostname='host', port=22, username='root', password='123') # 執(zhí)行命令 stdout命令結(jié)果,stderr錯誤 stdin, stdout, stderr = ssh.exec_command('ls') # 獲取命令結(jié)果 result = stdout.read() # 關閉連接 ssh.close()
SSHClient 封裝 Transport
import paramiko transport = paramiko.Transport(('hostname', 22)) transport.connect(username='root', password='123') ssh = paramiko.SSHClient() ssh._transport = transport stdin, stdout, stderr = ssh.exec_command('df') print(stdout.read()) transport.close()
基于公鑰秘鑰連接
import paramiko private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa') # 創(chuàng)建SSH對象 ssh = paramiko.SSHClient() # 允許連接不在know_hosts文件中的主機 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 連接服務器 ssh.connect(hostname='host', port=22, username='root', key=private_key) # 執(zhí)行命令 stdin, stdout, stderr = ssh.exec_command('df') # 獲取命令結(jié)果 result = stdout.read() # 關閉連接 ssh.close()
SSHClient 封裝Transport
import paramiko private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa') transport = paramiko.Transport(('hostname', 22)) transport.connect(username='wupeiqi', pkey=private_key) ssh = paramiko.SSHClient() ssh._transport = transport stdin, stdout, stderr = ssh.exec_command('df') transport.close()
SFTPClient:
用于連接遠程服務器并進行上傳下載功能。
基于用戶名密碼上傳下載
import paramiko transport = paramiko.Transport(('hostname',22)) transport.connect(username='root',password='123') sftp = paramiko.SFTPClient.from_transport(transport) # 將location.py 上傳至服務器 /tmp/test.py sftp.put('/tmp/location.py', '/tmp/test.py') # 將remove_path 下載到本地 local_path sftp.get('remove_path', 'local_path') transport.close()
基于公鑰秘鑰上傳下載
import paramiko private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa') transport = paramiko.Transport(('hostname', 22)) transport.connect(username='root', pkey=private_key ) sftp = paramiko.SFTPClient.from_transport(transport) # 將location.py 上傳至服務器 /tmp/test.py sftp.put('/tmp/location.py', '/tmp/test.py') # 將remove_path 下載到本地 local_path sftp.get('remove_path', 'local_path') transport.close()
Demo: 實現(xiàn)遠程命令執(zhí)行和文件上傳
import paramiko class SSHConnection(object): def __init__(self, host='192.168.12.68', port=22, username='locojoy',pwd='123321QQ!'): self.host = host self.port = port self.username = username self.pwd = pwd self.__k = None def run(self): self.connect() # 連接遠程服務器 self.upload('db.py','/tmp/1.py') # 將本地的db.py文件上傳到遠端服務器的/tmp/目錄下并改名為1.py self.cmd('df') # 執(zhí)行df 命令 self.close() # 關閉連接 def connect(self): transport = paramiko.Transport((self.host, self.port)) transport.connect(username=self.username, password=self.pwd) self.__transport = transport def close(self): self.__transport.close() def upload(self,local_path,target_path): sftp = paramiko.SFTPClient.from_transport(self.__transport) sftp.put(local_path,target_path) def cmd(self, command): ssh = paramiko.SSHClient() ssh._transport = self.__transport # 執(zhí)行命令 stdin, stdout, stderr = ssh.exec_command(command) # 獲取命令結(jié)果 result = stdout.read() print(result) return result obj = SSHConnection() obj.run()
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
淺談SciPy中的optimize.minimize實現(xiàn)受限優(yōu)化問題
今天小編就為大家分享一篇淺談SciPy中的optimize.minimize實現(xiàn)受限優(yōu)化問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02如何解決Keras載入mnist數(shù)據(jù)集出錯的問題
這篇文章主要介紹了解決Keras載入mnist數(shù)據(jù)集出錯的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05tensorflow實現(xiàn)在函數(shù)中用tf.Print輸出中間值
今天小編就為大家分享一篇tensorflow實現(xiàn)在函數(shù)中用tf.Print輸出中間值,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01python如何將兩個數(shù)據(jù)表中的對應數(shù)據(jù)相加
這篇文章主要介紹了python如何將兩個數(shù)據(jù)表中的對應數(shù)據(jù)相加問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08python不使用for計算兩組、多個矩形兩兩間的iou方式
今天小編就為大家分享一篇python不使用for計算兩組、多個矩形兩兩間的iou方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01