欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Python3之paramiko模塊

系統(tǒng) 2891 0
原文鏈接: https://www.cnblogs.com/wang-yc/p/5628114.html

Python3之paramiko模塊

一. 簡介

  paramiko是一個(gè)基于SSH用于連接遠(yuǎn)程服務(wù)器并執(zhí)行相關(guān)操作(SSHClient和SFTPClinet,即一個(gè)是遠(yuǎn)程連接,一個(gè)是上傳下載服務(wù)),使用該模塊可以對遠(yuǎn)程服務(wù)器進(jìn)行命令或文件操作,值得一說的是,fabric和ansible內(nèi)部的遠(yuǎn)程管理就是使用的paramiko來現(xiàn)實(shí)。

二. 使用

1. 下載安裝

            
              pycrypto,由于 paramiko 模塊內(nèi)部依賴pycrypto,所以先下載安裝pycrypto
pip3 install pycrypto    
pip3 install paramiko
            
          

2. 模塊使用

SSHClient:

遠(yuǎn)程連接分為兩種:(1)基于用戶名密碼連接 (2)基于公鑰秘鑰連接

通過是用paramiko遠(yuǎn)程操作,其實(shí)本質(zhì)也分為兩種:(1)只用SSHClient (2)自己創(chuàng)建一個(gè)transport

?

(1)基于用戶名和密碼的連接

            
              import paramiko
 
# 創(chuàng)建SSH對象
ssh = paramiko.SSHClient()
# 允許連接不在know_hosts文件中的主機(jī)
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 連接服務(wù)器
ssh.connect(hostname='c1.salt.com', port=22, username='GSuser', password='123')
# 執(zhí)行命令
stdin, stdout, stderr = ssh.exec_command('ls')
# 獲取命令結(jié)果
result = stdout.read()
# 關(guān)閉連接
ssh.close()

            
          

  SSHClient 封裝 Transport

            
              
import paramiko
 
transport = paramiko.Transport(('hostname', 22))
transport.connect(username='GSuser', 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文件中的主機(jī)
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 連接服務(wù)器
ssh.connect(hostname='c1.salt.com', port=22, username='wupeiqi', key=private_key)
# 執(zhí)行命令
stdin, stdout, stderr = ssh.exec_command('df')
# 獲取命令結(jié)果
result = stdout.read()
# 關(guān)閉連接
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:

  用于連接遠(yuǎn)程服務(wù)器并進(jìn)行上傳下載功能。

(1)基于用戶名密碼上傳下載

            
              import paramiko
 
transport = paramiko.Transport(('hostname',22))
transport.connect(username='GSuser',password='123')
 
sftp = paramiko.SFTPClient.from_transport(transport)
# 將location.py 上傳至服務(wù)器 /tmp/test.py
sftp.put('/tmp/location.py', '/tmp/test.py')
# 將remove_path 下載到本地 local_path
sftp.get('remove_path', 'local_path')
 
transport.close()
            
          

(2)基于公鑰秘鑰上傳下載

            
              import paramiko
 
private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')
 
transport = paramiko.Transport(('hostname', 22))
transport.connect(username='GSuser', pkey=private_key )
 
sftp = paramiko.SFTPClient.from_transport(transport)
# 將location.py 上傳至服務(wù)器 /tmp/test.py
sftp.put('/tmp/location.py', '/tmp/test.py')
# 將remove_path 下載到本地 local_path
sftp.get('remove_path', 'local_path')
 
transport.close()
            
          

  Demo: 實(shí)現(xiàn)遠(yuǎn)程命令執(zhí)行和文件上傳

            
              
#!/usr/bin/env python
# -*- coding:utf-8 -*-
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()  # 連接遠(yuǎn)程服務(wù)器
        self.upload('db.py','/tmp/1.py')  # 將本地的db.py文件上傳到遠(yuǎn)端服務(wù)器的/tmp/目錄下并改名為1.py
        self.cmd('df')  # 執(zhí)行df 命令
        self.close()    # 關(guān)閉連接
 
    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()
            
          

  paramiko在堡壘機(jī)中的應(yīng)用

(1)簡單實(shí)例:遠(yuǎn)程連接一臺主機(jī),操作命令,linux版本,輸入終端為回車則發(fā)送命令。不支持tab補(bǔ)全功能。

            
              
import paramiko, sys, os, socket, select, getpass
from paramiko.py3compat import u   # 在python3中是這樣使用的,如果在Python2中則注釋這行
 
# 這個(gè)程序依賴于終端,只能在Liunx下運(yùn)行,windows用其他的方式
 
tran = paramiko.Transport(('192.168.12.68', 22,))
tran.start_client()
tran.auth_password('locojoy', '123321QQ!')
 
# 打開一個(gè)通道
chan = tran.open_session()
# 獲取一個(gè)終端
chan.get_pty()
# 激活器
chan.invoke_shell()
 
# 原始的方法利用終端進(jìn)行收發(fā)消息
# 利用sys.stdin,肆意妄為執(zhí)行操作
# 用戶在終端輸入內(nèi)容,并將內(nèi)容發(fā)送至遠(yuǎn)程服務(wù)器
# 遠(yuǎn)程服務(wù)器執(zhí)行命令,并將結(jié)果返回
# 用戶終端顯示內(nèi)容
 
while True:
    # 監(jiān)視用戶輸入和服務(wù)器返回?cái)?shù)據(jù)
    # sys.stdin 處理用戶輸入
    # chan 是之前創(chuàng)建的通道,用于接收服務(wù)器返回信息
    # 通過select監(jiān)聽終端(輸入輸出),一旦變化,就將拿到的數(shù)據(jù)發(fā)送給服務(wù)器
    # 通過監(jiān)聽socket句柄,如果有變化表示服務(wù)器要給我發(fā)消息
    readable, writeable, error = select.select([chan, sys.stdin, ],[],[],1)
    # 通過select.select 監(jiān)聽chan(打開的通道(和遠(yuǎn)程服務(wù)器連接的狀態(tài))), sys.stdin(輸入),一旦變化就寫入readable
    # 當(dāng)chan變化時(shí),加入到readable,遠(yuǎn)程服務(wù)器發(fā)送內(nèi)容過來
    if chan in readable:
        try:
            x = u(chan.recv(1024))  # Python3用這個(gè)
            # x = chan.recv(1024)  Python2使用這個(gè)
            if len(x) == 0:
                print('\r\n*** EOF\r\n')
                break
            sys.stdout.write(x)   # 寫入緩沖區(qū)
            sys.stdout.flush()    # 刷新,將緩沖區(qū)內(nèi)容顯示出來
        except socket.timeout:
            pass
    # 當(dāng)sys.stdin 放入readable中時(shí),將獲取到的內(nèi)容發(fā)送到遠(yuǎn)程服務(wù)器
    if sys.stdin in readable:
        inp = sys.stdin.readline()
        chan.sendall(inp)
 
chan.close()
tran.close()

            
          

(2)每按一個(gè)鍵就發(fā)送記錄,并支持tab自動(dòng)補(bǔ)全

            
              
import paramiko, sys, os, socket, select, getpass, termios, tty
from paramiko.py3compat import u
 
tran = paramiko.Transport(('10.211.55.4', 22,))
tran.start_client()
tran.auth_password('wupeiqi', '123')
# 打開一個(gè)通道
chan = tran.open_session()
# 獲取一個(gè)終端
chan.get_pty()
# 激活器
chan.invoke_shell()
 
# 獲取原tty屬性
oldtty = termios.tcgetattr(sys.stdin)
try:
    # 為tty設(shè)置新屬性
    # 默認(rèn)當(dāng)前tty設(shè)備屬性:
    #   輸入一行回車,執(zhí)行
    #   CTRL+C 進(jìn)程退出,遇到特殊字符,特殊處理。
    # 這是為原始模式,不認(rèn)識所有特殊符號
    # 放置特殊字符應(yīng)用在當(dāng)前終端,如此設(shè)置,將所有的用戶輸入均發(fā)送到遠(yuǎn)程服務(wù)器
    tty.setraw(sys.stdin.fileno())  # 恢復(fù)終端原始狀態(tài),每按一個(gè)鍵就發(fā)送
    chan.settimeout(0.0)
 
    while True:
        # 監(jiān)視 用戶輸入 和 遠(yuǎn)程服務(wù)器返回?cái)?shù)據(jù)(socket)
        # 阻塞,直到句柄可讀
        r, w, e = select.select([chan, sys.stdin], [], [], 1)
        if chan in r:  # 獲取服務(wù)返回的內(nèi)容
            try:
                x = u(chan.recv(1024))
                if len(x) == 0:
                    print('\r\n*** EOF\r\n')
                    break
                sys.stdout.write(x)
                sys.stdout.flush()
            except socket.timeout:
                pass
        if sys.stdin in r: # 發(fā)送命令
            x = sys.stdin.read(1) # 讀取一個(gè)字符
            if len(x) == 0:
                break
            chan.send(x) # 發(fā)送一個(gè)字符
 
finally:
    # 重新設(shè)置終端屬性,將終端狀態(tài)還原
    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)
 
chan.close()
tran.close()
            
          

?

?

?

?

?


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 成人一级视频 | 亚洲 欧美 另类 综合 偷拍 | 亚洲欧美中文字幕 | 国产精品亚洲一区二区三区在线 | 99精品国产在热久久 | 9191色| 九九热线精品视频6一 | 久久久久久国产精品免费免费 | 亚洲成人久久久 | 日韩黄色视屏 | 国产麻豆一区二区三区 | 国产成人精品美女在线 | 九色网址 | 国产欧美日韩不卡一区二区三区 | 久久一本久综合久久爱 | 天天影视免费在线观看入口 | 亚洲精品视频久久 | 一区二区国产在线播放 | 成人免费看黄网站yyy456 | 超级成人97碰碰碰免费 | 午夜影院在线免费观看视频 | 国产亚洲一区二区三区在线观看 | 久久国产精品一区二区 | 无码免费一区二区三区免费播放 | 天天色综合影视 | 国产97色在线 | 亚洲 | 中文字幕国产日韩 | 日本一区视频在线播放 | 538亚洲欧美国产日韩在线精品 | 欧美成人四级hd版 | 久久95| 成人欧美网站免费 | 99精品免费久久久久久久久日本 | 四影虎影ww4hu55.com | 一区二区三区不卡免费视频97 | 91精品国产91久久久久久吃药 | 色综合色综合 | 天天操天天操天天干 | 欧美日韩国产网站 | 波多野结衣亚洲一区二区三区 | 国产午夜福利视频一区二区32页 |