偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

詳解Python遠(yuǎn)程控制模塊:Paramiko概念、方法及七大案例

開(kāi)發(fā) 后端
ssh是一個(gè)協(xié)議,OpenSSH是其中一個(gè)開(kāi)源實(shí)現(xiàn),paramiko是Python的一個(gè)庫(kù),實(shí)現(xiàn)了SSHv2協(xié)議(底層使用cryptography)。

概述

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

有了Paramiko以后,我們就可以在Python代碼中直接使用SSH協(xié)議對(duì)遠(yuǎn)程服務(wù)器執(zhí)行操作,而不是通過(guò)ssh命令對(duì)遠(yuǎn)程服務(wù)器進(jìn)行操作。今天主要介紹一下Paramiko的一些相關(guān)概念。

詳解python遠(yuǎn)程控制模塊--Paramiko概念、方法及七大案例

Paramiko介紹

paramiko包含兩個(gè)核心組件:SSHClient和SFTPClient。

詳解python遠(yuǎn)程控制模塊--Paramiko概念、方法及七大案例

  • SSHClient的作用類(lèi)似于Linux的ssh命令,是對(duì)SSH會(huì)話的封裝,該類(lèi)封裝了傳輸(Transport),通道(Channel)及SFTPClient建立的方法(open_sftp),通常用于執(zhí)行遠(yuǎn)程命令。
  • SFTPClient的作用類(lèi)似與Linux的sftp命令,是對(duì)SFTP客戶端的封裝,用以實(shí)現(xiàn)遠(yuǎn)程文件操作,如文件上傳、下載、修改文件權(quán)限等操作。

Paramiko中的幾個(gè)基礎(chǔ)名詞:

  • Channel:是一種類(lèi)Socket,一種安全的SSH傳輸通道;
  • Transport:是一種加密的會(huì)話,使用時(shí)會(huì)同步創(chuàng)建了一個(gè)加密的Tunnels(通道),這個(gè)Tunnels叫做Channel;
  • Session:是client與Server保持連接的對(duì)象,用connect()/start_client()/start_server()開(kāi)始會(huì)話。

Paramiko的基本使用

1. SSHClient常用的方法介紹

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

常用參數(shù)

  • hostname 連接的目標(biāo)主機(jī)
  • port=SSH_PORT 指定端口
  • username=None 驗(yàn)證的用戶名
  • password=None 驗(yàn)證的用戶密碼
  • pkey=None 私鑰方式用于身份驗(yàn)證
  • key_filename=None 一個(gè)文件名或文件列表,指定私鑰文件
  • timeout=None 可選的tcp連接超時(shí)時(shí)間
  • allow_agent=True, 是否允許連接到ssh代理,默認(rèn)為T(mén)rue 允許l
  • ook_for_keys=True 是否在~/.ssh中搜索私鑰文件,默認(rèn)為T(mén)rue 允許
  • compress=False, 是否打開(kāi)壓縮

(2) set_missing_host_key_policy():設(shè)置遠(yuǎn)程服務(wù)器沒(méi)有在know_hosts文件中記錄時(shí)的應(yīng)對(duì)策略。目前支持三種策略:

設(shè)置連接的遠(yuǎn)程主機(jī)沒(méi)有本地主機(jī)密鑰或HostKeys對(duì)象時(shí)的策略,目前支持三種:

  • AutoAddPolicy 自動(dòng)添加主機(jī)名及主機(jī)密鑰到本地HostKeys對(duì)象,不依賴load_system_host_key的配置。即新建立ssh連接時(shí)不需要再輸入yes或no進(jìn)行確認(rèn)
  • WarningPolicy 用于記錄一個(gè)未知的主機(jī)密鑰的python警告。并接受,功能上和AutoAddPolicy類(lèi)似,但是會(huì)提示是新連接
  • RejectPolicy 自動(dòng)拒絕未知的主機(jī)名和密鑰,依賴load_system_host_key的配置。此為默認(rèn)選項(xiàng)

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

詳解python遠(yuǎn)程控制模塊--Paramiko概念、方法及七大案例

(4) open_sftp():在當(dāng)前ssh會(huì)話的基礎(chǔ)上創(chuàng)建一個(gè)sftp會(huì)話。該方法會(huì)返回一個(gè)SFTPClient對(duì)象。

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

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

七大案例

1. paramiko遠(yuǎn)程密碼連接

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

2. 使用sftp上傳文件

  1. import paramiko 
  2. #獲取Transport實(shí)例 
  3. tran = paramiko.Transport("172.25.254.31",22) 
  4. #連接SSH服務(wù)端 
  5. tran.connect(username = "root"password = "westos"
  6. #獲取SFTP實(shí)例 
  7. sftp = paramiko.SFTPClient.from_transport(tran) 
  8. #設(shè)置上傳的本地/遠(yuǎn)程文件路徑 
  9. localpath="passwd.html" ##本地文件路徑 
  10. remotepath="/home/kiosk/Desktop/fish" ##上傳對(duì)象保存的文件路徑 
  11. #執(zhí)行上傳動(dòng)作 
  12. sftp.put(localpath,remotepath) 
  13. tran.close() 

3. 使用sftp下載文件

  1. import paramiko 
  2. #獲取SSHClient實(shí)例 
  3. client = paramiko.SSHClient() 
  4. client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
  5. #連接SSH服務(wù)端 
  6. client.connect("172.25.254.31",username="root",password="westos"
  7. #獲取Transport實(shí)例 
  8. tran = client.get_transport() 
  9. #獲取SFTP實(shí)例 
  10. sftp = paramiko.SFTPClient.from_transport(tran) 
  11. remotepath='/home/kiosk/Desktop/fish' 
  12. localpath='/home/kiosk/Desktop/fish' 
  13. sftp.get(remotepath, localpath) 
  14. client.close() 

4. 批量遠(yuǎn)程密碼連接

  1. from paramiko.ssh_exception import NoValidConnectionsError 
  2. from paramiko.ssh_exception import AuthenticationException 
  3. def connect(cmd,hostname,port=22,username='root',passwd='westos'): 
  4.  import paramiko 
  5.  ##1.創(chuàng)建一個(gè)ssh對(duì)象 
  6.  client = paramiko.SSHClient() 
  7.  #2.解決問(wèn)題:如果之前沒(méi)有,連接過(guò)的ip,會(huì)出現(xiàn)選擇yes或者no的操作, 
  8.  ##自動(dòng)選擇yes 
  9.  client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
  10.  #3.連接服務(wù)器 
  11.  try: 
  12.  client.connect(hostnamehostname=hostname, 
  13.  portport=port, 
  14.  usernameusername=username, 
  15.  password=passwd
  16.  print('正在連接主機(jī)%s......'%(hostname)) 
  17.  except NoValidConnectionsError as e: ###用戶不存在時(shí)的報(bào)錯(cuò) 
  18.  print("連接失敗") 
  19.  except AuthenticationException as t: ##密碼錯(cuò)誤的報(bào)錯(cuò) 
  20.  print('密碼錯(cuò)誤') 
  21.  else: 
  22.  #4.執(zhí)行操作 
  23.  stdin,stdout, stderr = client.exec_command(cmd) 
  24.  #5.獲取命令執(zhí)行的結(jié)果 
  25.  result=stdout.read().decode('utf-8') 
  26.  print(result) 
  27.  #6.關(guān)閉連接 
  28.  finally: 
  29.  client.close() 
  30. with open('ip.txt') as f: #ip.txt為本地局域網(wǎng)內(nèi)的一些用戶信息 
  31.  for line in f: 
  32.  lineline = line.strip() ##去掉換行符 
  33.  hostname,port,username,passwdline.split(':') 
  34.  print(hostname.center(50,'*')) 
  35.  connect('uname', hostname, port,username,passwd) 

5. paramiko基于公鑰密鑰連接

  1. import paramiko 
  2. from paramiko.ssh_exception import NoValidConnectionsError, AuthenticationException 
  3. def connect(cmd, hostname, port=22user='root'): 
  4.  client = paramiko.SSHClient()  
  5.  private_key = paramiko.RSAKey.from_private_key_file('id_rsa') 
  6.  ###id_rsa為本地局域網(wǎng)密鑰文件 
  7.  client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
  8.  try: 
  9.  client.connect(hostnamehostname=hostname, 
  10.  portport=port, 
  11.  userusername=user, 
  12.  pkey=private_key 
  13.  ) 
  14.  stdin, stdout, stderr = client.exec_command(cmd) 
  15.  except NoValidConnectionsError as e: 
  16.  print("連接失敗") 
  17.  except AuthenticationException as e: 
  18.  print("密碼錯(cuò)誤") 
  19.  else: 
  20.  result = stdout.read().decode('utf-8') 
  21.  print(result) 
  22.  finally: 
  23.  client.close() 
  24. for count in range(254): 
  25.  host = '172.25.254.%s' %(count+1) 
  26.  print(host.center(50, '*')) 
  27.  connect('uname', host) 

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

  1. import paramiko 
  2. private_key = paramiko.RSAKey.from_private_key_file('id_rsa') 
  3. tran = paramiko.Transport('172.25.254.31',22) 
  4. tran.connect(username='root',password='westos'
  5. #獲取SFTP實(shí)例 
  6. sftp = paramiko.SFTPClient.from_transport(tran) 
  7. remotepath='/home/kiosk/Desktop/fish8' 
  8. localpath='/home/kiosk/Desktop/fish1' 
  9. sftp.put(localpath,remotepath) 
  10. sftp.get(remotepath, localpath) 

7. paramiko的再封裝

  1. import os 
  2. import paramiko 
  3. from paramiko.ssh_exception import NoValidConnectionsError, AuthenticationException, SSHException 
  4. class SshRemoteHost(object): 
  5.  def __init__(self, hostname, port, user, passwd, cmd): 
  6.  self.hostname = hostname 
  7.  self.port = port 
  8.  self.user = user 
  9.  self.passwd = passwd 
  10.  self.cmd = cmd 
  11.  def run(self): 
  12.  """默認(rèn)調(diào)用的內(nèi)容""" 
  13.  # cmd hostname 
  14.  # put 
  15.  # get 
  16.  cmd_str = self.cmd.split()[0] # cmd 
  17.  # 類(lèi)的反射,判斷類(lèi)里面是否可以支持該操作 
  18.  if hasattr(self, 'do_'+ cmd_str): # do_cmd 
  19.  getattr(self, 'do_'+cmd_str)() 
  20.  else: 
  21.  print("目前不支持該功能") 
  22.  def do_cmd(self): 
  23.  client = paramiko.SSHClient() 
  24.  client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
  25.  try: 
  26.  client.connect(hostname=self.hostname, 
  27.  port=self.port, 
  28.  username=self.user, 
  29.  password=self.passwd) 
  30.  print("正在連接%s......." % (self.hostname)) 
  31.  except NoValidConnectionsError as e: 
  32.  print("連接失敗") 
  33.  except AuthenticationException as e: 
  34.  print("密碼錯(cuò)誤") 
  35.  else: 
  36.  # 4. 執(zhí)行操作 
  37.  cmd = ''.join(self.cmd.split()[1:]) ##將輸入的后面的取出,作為 
  38.  stdin, stdout, stderr = client.exec_command(cmd) 
  39.  # 5.獲取命令執(zhí)行的結(jié)果 
  40.  result = stdout.read().decode('utf-8') 
  41.  print(result) 
  42.  finally: 
  43.  # 6.關(guān)閉連接 
  44.  client.close() 
  45.  def do_put(self): 
  46.  ###put /tmp/passwd ###將本地的/tmp/passwd上傳到遠(yuǎn)端/tmp/passwd 
  47.  print('正在上傳...') 
  48.  try: 
  49.  #獲取Transport實(shí)例 
  50.  tran = paramiko.Transport(self.hostname,int(self.port)) ##由于端口為整形,而我們用split方法得到的是str 
  51.  #連接SSH服務(wù)端 
  52.  tran.connect(username = self.user, password = self.passwd) 
  53.  except SSHException as e: 
  54.  print('連接失敗') 
  55.  else: 
  56.  #獲取SFTP實(shí)例 
  57.  sftp = paramiko.SFTPClient.from_transport(tran) 
  58.  newCmd = self.cmd.split()[1:] 
  59.  if len(newCmd) == 2: 
  60.  #設(shè)置上傳的本地/遠(yuǎn)程文件路徑 
  61.  localpath=newCmd[0] 
  62.  remotepath=newCmd[1] 
  63.  #執(zhí)行上傳動(dòng)作 
  64.  sftp.put(localpath,remotepath) 
  65.  print('%s文件上傳到%s主機(jī)的%s文件成功' %(localpath,self.hostname,remotepath)) 
  66.  else: 
  67.  print('上傳文件信息錯(cuò)誤') 
  68.  tran.close() 
  69.  def do_get(self): 
  70.  print('正在下載...') 
  71.  try: 
  72.  # 獲取Transport實(shí)例 
  73.  tran = paramiko.Transport(self.hostname, int(self.port)) ##由于端口為整形,而我們用split方法得到的是str 
  74.  # 連接SSH服務(wù)端 
  75.  tran.connect(username=self.user, password=self.passwd) 
  76.  except SSHException as e: 
  77.  print('連接失敗') 
  78.  else: 
  79.  # 獲取SFTP實(shí)例 
  80.  sftp = paramiko.SFTPClient.from_transport(tran) 
  81.  newCmd = self.cmd.split()[1:] 
  82.  if len(newCmd) == 2: 
  83.  # 設(shè)置下載的本地/遠(yuǎn)程文件路徑 
  84.  localpath = newCmd[1] 
  85.  remotepath = newCmd[0] 
  86.  # 執(zhí)行上傳動(dòng)作 
  87.  sftp.get( remotepath,localpath) 
  88.  print('%s主機(jī)的%s文件下載到%s文件成功' % (self.hostname,remotepath,localpath)) 
  89.  else: 
  90.  print('上傳文件信息錯(cuò)誤') 
  91.  tran.close() 
  92. import paramiko 
  93. import os 
  94. # 1.選擇操作的主機(jī)組:eg:mysql,web,ftp 
  95. groups=[file.rstrip('.conf') for file in os.listdir('conf')] 
  96. print("主機(jī)組顯示:".center(50,'*')) 
  97. for group in groups: 
  98.  print('\t',group) 
  99. choiceGroup = input("選擇批量操作的主機(jī)組(eg:mysql):") 
  100. ##2.根據(jù)選擇的主機(jī)組,顯示包含的主機(jī)IP/主機(jī)名 
  101. # 1).打開(kāi)文件conf/choiceGroup.conf 
  102. # 2).依次讀取文件每一行 
  103. # 3).只拿出 
  104. print("主機(jī)組包含的主機(jī):".center(50,'*')) 
  105. with open('conf/%s.conf' %(choiceGroup)) as f: 
  106.  for line in f: 
  107.  print(line.split(':')[0]) 
  108.  f.seek(0,0) ##把指針移動(dòng)到文件最開(kāi)始 
  109.  hostinfos = [line.strip() for line in f.readlines()] 
  110. ###3.讓用戶確認(rèn)信息,選擇需要批量執(zhí)行的命令; 
  111. ## -cmd shell 命令 
  112. ## -put 本地文件 遠(yuǎn)程文件 
  113. ## -get 遠(yuǎn)程文件 本地文件 
  114. print("批量執(zhí)行腳本".center(50,"*")) 
  115. while True: 
  116.  cmd = input('>>:').strip() 
  117.  if cmd : 
  118.  if cmd == 'exit' or cmd == "quit": 
  119.  print("執(zhí)行完畢,正在退出") 
  120.  break 
  121.  for info in hostinfos: 
  122.  host,port,user,passwd = info.split(':') 
  123.  clientObj = SshRemoteHost(host,port,user,passwd,cmd) 
  124.  clientObj.run() 

 

 

責(zé)任編輯:趙寧寧 來(lái)源: 今日頭條
相關(guān)推薦

2018-04-05 23:29:35

2009-08-19 11:26:09

2010-05-26 17:26:36

SVN提交更新

2013-12-20 16:43:33

遠(yuǎn)程開(kāi)機(jī)關(guān)機(jī)

2010-07-06 15:08:46

UML圖詳解

2012-01-11 15:33:40

2017-08-16 16:30:01

CMQ消息實(shí)踐

2014-01-17 17:33:32

遠(yuǎn)程開(kāi)機(jī)

2010-09-06 16:37:58

2011-09-08 09:33:08

Ubuntu 11.1

2011-09-19 13:43:19

2022-04-24 13:54:23

元宇宙虛擬土地VR

2024-11-20 16:56:38

Python云服務(wù)集成代碼

2022-06-21 10:29:09

CIO首席信息官

2021-09-17 13:17:56

Spring 模塊開(kāi)發(fā)

2014-04-18 09:06:25

2022-06-23 12:33:35

大數(shù)據(jù)數(shù)據(jù)分析

2024-09-04 08:31:01

語(yǔ)言模型設(shè)計(jì)

2009-12-01 14:35:06

Linux忠告

2015-07-21 10:49:11

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)