怎么使用Python遠程控制模塊Paramiko

本篇內(nèi)容主要講解“怎么使用Python遠程控制模塊Paramiko”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么使用Python遠程控制模塊Paramiko”吧!

創(chuàng)新互聯(lián)專注于豐寧網(wǎng)站建設服務及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供豐寧營銷型網(wǎng)站建設,豐寧網(wǎng)站制作、豐寧網(wǎng)頁設計、豐寧網(wǎng)站官網(wǎng)定制、小程序定制開發(fā)服務,打造豐寧網(wǎng)絡公司原創(chuàng)品牌,更為您提供豐寧網(wǎng)站排名全網(wǎng)營銷落地服務。

概述

ssh是一個協(xié)議,OpenSSH是其中一個開源實現(xiàn),paramiko是Python的一個庫,實現(xiàn)了SSHv2協(xié)議(底層使用cryptography)。

有了Paramiko以后,我們就可以在Python代碼中直接使用SSH協(xié)議對遠程服務器執(zhí)行操作,而不是通過ssh命令對遠程服務器進行操作。

Paramiko介紹

paramiko包含兩個核心組件:SSHClient和SFTPClient。

  • SSHClient的作用類似于Linux的ssh命令,是對SSH會話的封裝,該類封裝了傳輸(Transport),通道(Channel)及SFTPClient建立的方法(open_sftp),通常用于執(zhí)行遠程命令。

  • SFTPClient的作用類似與Linux的sftp命令,是對SFTP客戶端的封裝,用以實現(xiàn)遠程文件操作,如文件上傳、下載、修改文件權(quán)限等操作。

Paramiko中的幾個基礎名詞:

  • Channel:是一種類Socket,一種安全的SSH傳輸通道;

  • Transport:是一種加密的會話,使用時會同步創(chuàng)建了一個加密的Tunnels(通道),這個Tunnels叫做Channel;

  • Session:是client與Server保持連接的對象,用connect()/start_client()/start_server()開始會話。

Paramiko的基本使用

1. SSHClient常用的方法介紹

(1) connect():實現(xiàn)遠程服務器的連接與認證,對于該方法只有hostname是必傳參數(shù)。

常用參數(shù)

  • hostname 連接的目標主機

  • port=SSH_PORT 指定端口

  • username=None 驗證的用戶名

  • password=None  驗證的用戶密碼

  • pkey=None 私鑰方式用于身份驗證

  • key_filename=None 一個文件名或文件列表,指定私鑰文件

  • timeout=None  可選的tcp連接超時時間

  • allow_agent=True, 是否允許連接到ssh代理,默認為True 允許l

  • ook_for_keys=True  是否在~/.ssh中搜索私鑰文件,默認為True 允許

  • compress=False, 是否打開壓縮

(2) set_missing_host_key_policy():設置遠程服務器沒有在know_hosts文件中記錄時的應對策略。目前支持三種策略:

設置連接的遠程主機沒有本地主機密鑰或HostKeys對象時的策略,目前支持三種:

  • AutoAddPolicy  自動添加主機名及主機密鑰到本地HostKeys對象,不依賴load_system_host_key的配置。即新建立ssh連接時不需要再輸入yes或no進行確認

  • WarningPolicy  用于記錄一個未知的主機密鑰的python警告。并接受,功能上和AutoAddPolicy類似,但是會提示是新連接

  • RejectPolicy  自動拒絕未知的主機名和密鑰,依賴load_system_host_key的配置。此為默認選項

(3) exec_command():在遠程服務器執(zhí)行Linux命令的方法。

怎么使用Python遠程控制模塊Paramiko

(4) open_sftp():在當前ssh會話的基礎上創(chuàng)建一個sftp會話。該方法會返回一個SFTPClient對象。

利用SSHClient對象的open_sftp()方法,可以直接返回一個基于當前連接的sftp對象,可以進行文件的上傳等操作.

sftp = client.open_sftp() sftp.put('test.txt','text.txt')

七大案例

1. paramiko遠程密碼連接

import paramiko ##1.創(chuàng)建一個ssh對象 client = paramiko.SSHClient() #2.解決問題:如果之前沒有,連接過的ip,會出現(xiàn)選擇yes或者no的操作, ##自動選擇yes client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #3.連接服務器 client.connect(hostname='172.25.254.31',  port=22,  username='root',  password='westos') #4.執(zhí)行操作 stdin,stdout, stderr = client.exec_command('hostname') #5.獲取命令執(zhí)行的結(jié)果 result=stdout.read().decode('utf-8') print(result) #6.關閉連接 client.close()

2. 使用sftp上傳文件

import paramiko #獲取Transport實例 tran = paramiko.Transport("172.25.254.31",22) #連接SSH服務端 tran.connect(username = "root", password = "westos") #獲取SFTP實例 sftp = paramiko.SFTPClient.from_transport(tran) #設置上傳的本地/遠程文件路徑 localpath="passwd.html" ##本地文件路徑 remotepath="/home/kiosk/Desktop/fish" ##上傳對象保存的文件路徑 #執(zhí)行上傳動作 sftp.put(localpath,remotepath) tran.close()

3. 使用sftp下載文件

import paramiko #獲取SSHClient實例 client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #連接SSH服務端 client.connect("172.25.254.31",username="root",password="westos") #獲取Transport實例 tran = client.get_transport() #獲取SFTP實例 sftp = paramiko.SFTPClient.from_transport(tran) remotepath='/home/kiosk/Desktop/fish' localpath='/home/kiosk/Desktop/fish' sftp.get(remotepath, localpath) client.close()

4. 批量遠程密碼連接

from paramiko.ssh_exception import NoValidConnectionsError from paramiko.ssh_exception import AuthenticationException def connect(cmd,hostname,port=22,username='root',passwd='westos'):  import paramiko  ##1.創(chuàng)建一個ssh對象  client = paramiko.SSHClient()  #2.解決問題:如果之前沒有,連接過的ip,會出現(xiàn)選擇yes或者no的操作,  ##自動選擇yes  client.set_missing_host_key_policy(paramiko.AutoAddPolicy())  #3.連接服務器  try:  client.connect(hostnamehostname=hostname,  portport=port,  usernameusername=username,  password=passwd)  print('正在連接主機%s......'%(hostname))  except NoValidConnectionsError as e: ###用戶不存在時的報錯  print("連接失敗")  except AuthenticationException as t: ##密碼錯誤的報錯  print('密碼錯誤')  else:  #4.執(zhí)行操作  stdin,stdout, stderr = client.exec_command(cmd)  #5.獲取命令執(zhí)行的結(jié)果  result=stdout.read().decode('utf-8')  print(result)  #6.關閉連接  finally:  client.close() with open('ip.txt') as f: #ip.txt為本地局域網(wǎng)內(nèi)的一些用戶信息  for line in f:  lineline = line.strip() ##去掉換行符  hostname,port,username,passwd= line.split(':')  print(hostname.center(50,'*'))  connect('uname', hostname, port,username,passwd)

5. paramiko基于公鑰密鑰連接

import paramiko from paramiko.ssh_exception import NoValidConnectionsError, AuthenticationException def connect(cmd, hostname, port=22, user='root'):  client = paramiko.SSHClient()   private_key = paramiko.RSAKey.from_private_key_file('id_rsa')  ###id_rsa為本地局域網(wǎng)密鑰文件  client.set_missing_host_key_policy(paramiko.AutoAddPolicy())  try:  client.connect(hostnamehostname=hostname,  portport=port,  userusername=user,  pkey=private_key  )  stdin, stdout, stderr = client.exec_command(cmd)  except NoValidConnectionsError as e:  print("連接失敗")  except AuthenticationException as e:  print("密碼錯誤")  else:  result = stdout.read().decode('utf-8')  print(result)  finally:  client.close() for count in range(254):  host = '172.25.254.%s' %(count+1)  print(host.center(50, '*'))  connect('uname', host)

6. 基于密鑰的上傳和下載

import paramiko private_key = paramiko.RSAKey.from_private_key_file('id_rsa') tran = paramiko.Transport('172.25.254.31',22) tran.connect(username='root',password='westos') #獲取SFTP實例 sftp = paramiko.SFTPClient.from_transport(tran) remotepath='/home/kiosk/Desktop/fish8' localpath='/home/kiosk/Desktop/fish2' sftp.put(localpath,remotepath) sftp.get(remotepath, localpath)

7. paramiko的再封裝

import os import paramiko from paramiko.ssh_exception import NoValidConnectionsError, AuthenticationException, SSHException class SshRemoteHost(object):  def __init__(self, hostname, port, user, passwd, cmd):  self.hostname = hostname  self.port = port  self.user = user  self.passwd = passwd  self.cmd = cmd  def run(self):  """默認調(diào)用的內(nèi)容"""  # cmd hostname  # put  # get  cmd_str = self.cmd.split()[0] # cmd  # 類的反射,判斷類里面是否可以支持該操作  if hasattr(self, 'do_'+ cmd_str): # do_cmd  getattr(self, 'do_'+cmd_str)()  else:  print("目前不支持該功能")  def do_cmd(self):  client = paramiko.SSHClient()  client.set_missing_host_key_policy(paramiko.AutoAddPolicy())  try:  client.connect(hostname=self.hostname,  port=self.port,  username=self.user,  password=self.passwd)  print("正在連接%s......." % (self.hostname))  except NoValidConnectionsError as e:  print("連接失敗")  except AuthenticationException as e:  print("密碼錯誤")  else:  # 4. 執(zhí)行操作  cmd = ''.join(self.cmd.split()[1:]) ##將輸入的后面的取出,作為  stdin, stdout, stderr = client.exec_command(cmd)  # 5.獲取命令執(zhí)行的結(jié)果  result = stdout.read().decode('utf-8')  print(result)  finally:  # 6.關閉連接  client.close()  def do_put(self):  ###put /tmp/passwd ###將本地的/tmp/passwd上傳到遠端/tmp/passwd  print('正在上傳...')  try:  #獲取Transport實例  tran = paramiko.Transport(self.hostname,int(self.port)) ##由于端口為整形,而我們用split方法得到的是str  #連接SSH服務端  tran.connect(username = self.user, password = self.passwd)  except SSHException as e:  print('連接失敗')  else:  #獲取SFTP實例  sftp = paramiko.SFTPClient.from_transport(tran)  newCmd = self.cmd.split()[1:]  if len(newCmd) == 2:  #設置上傳的本地/遠程文件路徑  localpath=newCmd[0]  remotepath=newCmd[1]  #執(zhí)行上傳動作  sftp.put(localpath,remotepath)  print('%s文件上傳到%s主機的%s文件成功' %(localpath,self.hostname,remotepath))  else:  print('上傳文件信息錯誤')  tran.close()  def do_get(self):  print('正在下載...')  try:  # 獲取Transport實例  tran = paramiko.Transport(self.hostname, int(self.port)) ##由于端口為整形,而我們用split方法得到的是str  # 連接SSH服務端  tran.connect(username=self.user, password=self.passwd)  except SSHException as e:  print('連接失敗')  else:  # 獲取SFTP實例  sftp = paramiko.SFTPClient.from_transport(tran)  newCmd = self.cmd.split()[1:]  if len(newCmd) == 2:  # 設置下載的本地/遠程文件路徑  localpath = newCmd[1]  remotepath = newCmd[0]  # 執(zhí)行上傳動作  sftp.get( remotepath,localpath)  print('%s主機的%s文件下載到%s文件成功' % (self.hostname,remotepath,localpath))  else:  print('上傳文件信息錯誤')  tran.close() import paramiko import os # 1.選擇操作的主機組:eg:MySQL,web,ftp groups=[file.rstrip('.conf') for file in os.listdir('conf')] print("主機組顯示:".center(50,'*')) for group in groups:  print('\t',group) choiceGroup = input("選擇批量操作的主機組(eg:mysql):") ##2.根據(jù)選擇的主機組,顯示包含的主機IP/主機名 # 1).打開文件conf/choiceGroup.conf # 2).依次讀取文件每一行 # 3).只拿出 print("主機組包含的主機:".center(50,'*')) with open('conf/%s.conf' %(choiceGroup)) as f:  for line in f:  print(line.split(':')[0])  f.seek(0,0) ##把指針移動到文件最開始  hostinfos = [line.strip() for line in f.readlines()] ###3.讓用戶確認信息,選擇需要批量執(zhí)行的命令; ## -cmd shell 命令 ## -put 本地文件 遠程文件 ## -get 遠程文件 本地文件 print("批量執(zhí)行腳本".center(50,"*")) while True:  cmd = input('>>:').strip()  if cmd :  if cmd == 'exit' or cmd == "quit":  print("執(zhí)行完畢,正在退出")  break  for info in hostinfos:  host,port,user,passwd = info.split(':')  clientObj = SshRemoteHost(host,port,user,passwd,cmd)  clientObj.run()

到此,相信大家對“怎么使用Python遠程控制模塊Paramiko”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關內(nèi)容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

新聞標題:怎么使用Python遠程控制模塊Paramiko
鏈接地址:http://muchs.cn/article10/gpjdgo.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供建站公司、營銷型網(wǎng)站建設、外貿(mào)網(wǎng)站建設、企業(yè)建站手機網(wǎng)站建設、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運營