国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

使用paramiko遠程執行命令、下發文件的實例

2020-02-16 10:21:05
字體:
來源:轉載
供稿:網友

寫部署腳本時,難免涉及到一些遠程執行命令或者傳輸文件。

之前一直使用sh庫,調用sh.ssh遠程執行一些命令,sh.scp傳輸文件,但是實際使用中還是比較麻煩的,光是模擬用戶登陸這一點,還需要單獨定義方法模擬輸入。

感受一下:

from sh import sshPASS = 'xxxx'def ssh_interact(line, stdin):  line = line.strip()  print(line)  if line.endswith('password:'):    stdin.put(PASS)ssh('x.x.x.x', _out=ssh_interact)

來自官方文檔

后來發現paramiko庫更加優雅、便捷,所以準備用pramiko替換掉sh。

之前通過同事了解到,paramiko在遠程執行python腳本時,腳本中的輸出內容可能會通過stderr這個管道輸出出來,所以直接用paramiko的SSHClient類中的exec_command方法執行,通過讀stderr管道中有無輸出來判斷命令是否成功執行的方式是行不通的。所以用更底層一些的Channel類的recv_exit_status方法判斷執行退出碼更好一些。

安裝

可以通過使用pip install paramiko安裝,細節這里不再贅述。

封裝

首先定義幾個異常

# coding: utf-8import os.pathfrom paramiko import SSHClient, AutoAddPolicy, AuthenticationExceptionclass ConnectError(Exception):  """  連接錯誤時拋出的異常  """  passclass RemoteExecError(Exception):  """  遠程執行命令,失敗時拋出的異常  """  passclass SCPError(Exception):  """  遠程下發文件時拋出的異常  """  pass
...class Remote(object):  def __init__(self, host, username, password=None, port=22, key_filename=None):    self.host = host    self.username = username    self.password = password    self.port = port    self.key_filename = key_filename    self._ssh = None  def _connect(self):    self._ssh = SSHClient()    self._ssh.set_missing_host_key_policy(AutoAddPolicy())    try:      if self.key_filename:        self._ssh.connect(self.host, username=self.username, port=self.port, key_filename=self.key_filename)      else:        self._ssh.connect(self.host, username=self.username, password=self.password, port=self.port)    except AuthenticationException:       self._ssh = None      raise ConnectionError('連接失敗,請確認用戶名、密碼、端口或密鑰文件是否有效')    except Exception as e:      self._ssh = None      raise ConnectionError('連接時出現意料外的錯誤:%s' % e)  def get_ssh(self):    if not self._ssh:      self._connect()    return self._ssh

實例化SSHClient類,通過它的connect()方法獲取SSH連接。

需要注意的是,遠程訪問的主機若是第一次連接,屬于未知設備需要認證,通過set_missing_host_key_policy()方法設置一種策略,這里使用的是AutoAddPolicy()。

這里的_connect支持兩種方式登錄,一種是提供主機的用戶名密碼,另一種是通過密鑰文件。在連接時檢查如果指定了密鑰文件則使用這種方式登錄,否則通過用戶名密碼登錄。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 长子县| 黄山市| 祁阳县| 濉溪县| 尤溪县| 乌拉特前旗| 凯里市| 肇源县| 铜陵市| 南川市| 三台县| 日喀则市| 贵州省| 安康市| 寿阳县| 阿尔山市| 长岭县| 左权县| 扶沟县| 海伦市| 大关县| 舟山市| 都匀市| 攀枝花市| 陆丰市| 海城市| 蓬溪县| 保靖县| 新和县| 巩留县| 石家庄市| 敦化市| 射洪县| 绍兴市| 鹿泉市| 五大连池市| 罗山县| 芮城县| 社会| 芮城县| 车险|