paramiko模塊使用


一、paramiko 安裝

  paramiko是Python的一個第三方庫,所以我們要使用pip安裝

pip install paramiko 

二、什么是paramiko

  SSH是一個協議,paramiko是使用SSHv2協議(底層使用的是cryptography)的一個第三方的庫

2.1:paramiko包括兩個核心的組件

  SSHClient:它的作用類似於Linux的SSH命令,是對SSH會話的一個類的封裝,這個類封裝了傳輸(Transport),通道(Channel)及SFTPClient建立的方法(open_sftp),通過用於執行遠程命令。

  SFTPClient:它的作用類似Linux的SFTP命令,是對SFTP客戶端的一個類的封裝。主要是實現對遠程文件的操作,上傳,下載,修改文件權限等操作。

2.2:paramiko有幾個基礎的名詞

  Transport:是一種加密的會話,使用時會同步創建一個加密的Tunnels(通道),這個Tunnels叫Channel

  Channel:是一種類的Socket,一種安全的SSH通道

  Session:是client和server保持連接的對象。實現方式是connect ---> start_client ---> start_server 開始會話。

三、SSHClient使用

3.1:常用方法

connect()方法:
實現遠程服務器的連接認證,對於該方法自由一個hostname是必須傳的參數
常用參數:
hostname:連接的目標主機
port:目標主機的端口
username:驗證的用戶可以為None
password:驗證的密碼可以為None
pkey:私鑰的驗證方式可以為None
key_filename:一個文件名或者一個文件列表,指定私鑰文件
timeout:TCP連接的超時時間,可以為None
allow_agent:是否允許連接到ssh代理,默認為True 
look_for_keys:是否在~/.ssh中搜索秘鑰文件,默認為True
compress:是否打開壓縮,默認False


set_missing_host_key_policy()方法:
設置遠程服務器沒有在know_hosts文件中記錄時的應對策略,目前支持三種策略
AutoAddPolicy 自動添加主機名及主機密鑰到本地HostKeys對象,不依賴load_system_host_key的配置。即新建立ssh連接時不需要再輸入yes或no進行確認
WarningPolicy 用於記錄一個未知的主機密鑰的python警告。並接受,功能上和AutoAddPolicy類似,但是會提示是新連接
RejectPolicy 自動拒絕未知的主機名和密鑰,依賴load_system_host_key的配置。此為默認選項



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

open_sftp()方法:
在當前ssh會話的基礎上建立一個sftp會話,該方法會返回一個SFTPClient對象
通過這個對象可以實現上傳下載的功能

3.2:使用密碼連接(一)

import paramiko

# 實例化SSHClient
client = paramiko.SSHClient()

# 自動添加策略,保存服務器的主機名和密鑰信息,如果不添加,那么不再本地know_hosts文件中記錄的主機將無法連接
client.set_missing.host_key_policy(paramiko.AutoAddPolicy())

# 連接SSH服務器,用戶名密碼認證
client.connect(hostname='192.168.163.129',port=22,username='root',password='zhujingzhi')

# 打開一個Chanent並執行命令
stdin,stdout,stderr = client.exec_command('df -h')
# stdout 為正確輸出,stderr為錯誤輸出,同時是有1個變量有值


# 打印結果
print(stdout.read().decode('utf8'))


# 關閉連接
client.close()

3.3:使用密碼連接(二)transport封裝推薦使用

import paramiko

# 創建一個通道
transport = paramiko.transport(('192.168.163.129', 22))
transport.connect(username='root', password='zhujingzhi')


# 實例化SSHClient
client = paramiko.SSHClient()
client._transport = transport


# 打開一個Chanent並執行命令
stdin,stdout,stderr = client.exec_command('df -h')
# stdout 為正確輸出,stderr為錯誤輸出,同時是有1個變量有值


# 打印結果
print(stdout.read().decode('utf8'))


# 關閉連接
transport.close()

3.4:使用秘鑰連接(一)

import paramiko

# 配置私人密鑰文件位置
private = paramiko.RSAKey.from_private_key_file('/Users/zjz/.ssh/id_rsa')
 
#實例化SSHClient
client = paramiko.SSHClient()
 
#自動添加策略,保存服務器的主機名和密鑰信息,如果不添加,那么不再本地know_hosts文件中記錄的主機將無法連接
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
 
#連接SSH服務端,以用戶名和密碼進行認證
client.connect(hostname='192.168.163.129',port=22,username='root',pkey=private)

# 打開一個Channel並執行命令
stdin, stdout, stderr = client.exec_command('df -h ')
# stdout 為正確輸出,stderr為錯誤輸出,同時是有1個變量有值
 
# 打印執行結果
print(stdout.read().decode('utf-8'))
 
# 關閉SSHClient
client.close()

3.5:使用秘鑰連接(二)transport封裝推薦使用

import paramiko

# 配置私人密鑰文件位置
private = paramiko.RSAKey.from_private_key_file('/Users/zjz/.ssh/id_rsa')
 
# 創建一個通道
transport = paramiko.Transport(('192.168.163.129', 22))
transport.connect(username='root', pkey=private_key)

#實例化SSHClient
client = paramiko.SSHClient()
client._transport = transport
 
# 打開一個Channel並執行命令
stdin, stdout, stderr = client.exec_command('df -h ')
# stdout 為正確輸出,stderr為錯誤輸出,同時是有1個變量有值
 
# 打印執行結果
print(stdout.read().decode('utf-8'))
 
# 關閉SSHClient
transport.close()

四、SFTPClient使用

4.1:常用方法

SFTPCLient作為一個sftp的客戶端對象,根據ssh傳輸協議的sftp會話,實現遠程文件操作,如上傳、下載、權限、狀態
 
from_transport(cls,t) 創建一個已連通的SFTP客戶端通道
put(localpath, remotepath, callback=None, confirm=True) 將本地文件上傳到服務器 參數confirm:是否調用stat()方法檢查文件狀態,返回ls -l的結果
get(remotepath, localpath, callback=None) 從服務器下載文件到本地
mkdir() 在服務器上創建目錄
remove() 在服務器上刪除目錄
rename() 在服務器上重命名目錄
stat() 查看服務器文件狀態
listdir() 列出服務器目錄下的文件

4.2:上傳功能

import paramiko
 
# 獲取Transport實例
tran = paramiko.Transport(('192.168.163.129', 22))
 
# 連接SSH服務端,使用password
tran.connect(username="root", password='zhujingzhi')
# 或使用
# 配置私人密鑰文件位置
private = paramiko.RSAKey.from_private_key_file('/Users/zjz/.ssh/id_rsa')
# 連接SSH服務端,使用pkey指定私鑰
tran.connect(username="root", pkey=private)
 
# 獲取SFTP實例
sftp = paramiko.SFTPClient.from_transport(tran)
 
# 設置上傳的本地/遠程文件路徑
localpath = "/Users/zjz/Downloads/1.txt"
remotepath = "/tmp/1.txt"
 
# 執行上傳動作
sftp.put(localpath, remotepath)
 
# 關閉連接
tran.close()

4.3:下載功能

import paramiko
 
# 獲取Transport實例
tran = paramiko.Transport(('192.168.163.129', 22))
 
# 連接SSH服務端,使用password
tran.connect(username="root", password='zhujingzhi')
# 或使用
# 配置私人密鑰文件位置
private = paramiko.RSAKey.from_private_key_file('/Users/zjz/.ssh/id_rsa')
# 連接SSH服務端,使用pkey指定私鑰
tran.connect(username="root", pkey=private)
 
# 獲取SFTP實例
sftp = paramiko.SFTPClient.from_transport(tran)
 
# 設置上傳的本地/遠程文件路徑
localpath = "/Users/zjz/Downloads/1.txt"
remotepath = "/tmp/1.txt"
 
# 執行下載動作
sftp.get(remotepath, localpath)
 
# 關閉連接
tran.close() 

五、綜合函數實現(復制粘貼即可使用)

 5.1:transport封裝函數(推薦使用)

import paramiko

class ssh(object):
    def __init__(self,hostdata):
        """
        初始化連接信息和ftp方法
        :param hostdata: 連接信息字段
        """
        self.ip = hostdata['ip']
        self.port = hostdata['port']
        self.user = hostdata['user']
        self.passwd = hostdata['passwd']
        self.transport = paramiko.Transport((self.ip, self.port))
        self.transport.connect (username=self.user, password=self.passwd)
        self.obj = paramiko.SSHClient()
        self.obj._transport = self.transport
        self.objsftp = self.obj.open_sftp ()

    def run_cmd(self, cmd):
        """
        執行命令方法
        :param cmd: 需要執行的命令
        :return:
        """
        stdin, stdout, stderr = self.obj.exec_command (cmd)
        return stdout.read ()

    def run_cmdlist(self, cmdlist):
        """
        執行命令方法列表
        :param cmdlist: 命令列表
        :return:
        """
        self.resultList = []
        for cmd in cmdlist:
            stdin, stdout, stderr = self.obj.exec_command (cmd)
            self.resultList.append (stdout.read ())
        return self.resultList

    def get(self,remotepath,localpath):
        """
        下載文件方法(兩個路徑都要指定文件名)
        :param remotepath: 服務器路徑
        :param localpath:  本地路徑
        :return:
        """
        self.objsftp.get(remotepath,localpath)

    def put(self,localpath,remotepath):
        """
        上傳文件方法(兩個路徑都要指定文件名)
        :param localpath: 本地路徑
        :param remotepath: 服務器路徑
        :return:
        """
        self.objsftp.put(localpath,remotepath)

    def close(self):
        """
        關閉方法
        :return:
        """
        self.objsftp.close ()
        self.transport.close ()

# 函數的使用
if __name__ == '__main__':
    hostdata = {
        'ip':'192.168.163.129',
        'port':22,
        'user':'root',
        'passwd':'zhujingzhi',
    }
    host = ssh (hostdata)                                      # 實例化遠程函數給數據庫里面的IP 端口 用戶名 密碼信息
    v = host.run_cmd ('df -h')                                 # 執行單個命令
    vstr = v.decode (encoding='utf-8', errors='strict')        # bytes轉字符串
    v1 = host.run_cmdlist (['ls', 'df'])                       # 執行命令列表
    print(hostdata['ip'])
    print(vstr)
    v = host.get('/root/anaconda-ks.cfg','D:\\采集\\a.cfg')     # 下載文件
    v = host.put('D:\\采集\\a.cfg','/opt/a.cfg')                # 上傳文件
    host.close() 

5.1:普通方式

import paramiko

class ssh(object):
    def __init__(self,hostdata):
        """
        初始化連接信息和ftp方法
        :param hostdata: 連接信息字段
        """
        self.ip = hostdata['ip']
        self.port = hostdata['port']
        self.user = hostdata['user']
        self.passwd = hostdata['passwd']
        self.obj = paramiko.SSHClient()
        self.obj.set_missing_host_key_policy(paramiko.AutoAddPolicy ())
        self.obj.connect (self.ip, self.port, self.user, self.passwd)
        self.objsftp = self.obj.open_sftp ()

    def run_cmd(self, cmd):
        """
        執行命令方法
        :param cmd: 需要執行的命令
        :return:
        """
        stdin, stdout, stderr = self.obj.exec_command (cmd)
        return stdout.read ()

    def run_cmdlist(self, cmdlist):
        """
        執行命令方法列表
        :param cmdlist: 命令列表
        :return:
        """
        self.resultList = []
        for cmd in cmdlist:
            stdin, stdout, stderr = self.obj.exec_command (cmd)
            self.resultList.append (stdout.read ())
        return self.resultList

    def get(self,remotepath,localpath):
        """
        下載文件方法(兩個路徑都要指定文件名)
        :param remotepath: 服務器路徑
        :param localpath:  本地路徑
        :return:
        """
        self.objsftp.get(remotepath,localpath)

    def put(self,localpath,remotepath):
        """
        上傳文件方法(兩個路徑都要指定文件名)
        :param localpath: 本地路徑
        :param remotepath: 服務器路徑
        :return:
        """
        self.objsftp.put(localpath,remotepath)

    def close(self):
        """
        關閉方法
        :return:
        """
        self.objsftp.close ()
        self.obj.close ()

# 函數的使用
if __name__ == '__main__':
    hostdata = {
        'ip':'192.168.163.129',
        'port':22,
        'user':'root',
        'passwd':'zhujingzhi',
    }
    host = ssh (hostdata)                                      # 實例化遠程函數給數據庫里面的IP 端口 用戶名 密碼信息
    v = host.run_cmd ('df -h')                                 # 執行單個命令
    vstr = v.decode (encoding='utf-8', errors='strict')        # bytes轉字符串
    v1 = host.run_cmdlist (['ls', 'df'])                       # 執行命令列表
    print(hostdata['ip'])
    print(vstr)
    v = host.get('/root/anaconda-ks.cfg','D:\\采集\\a.cfg')     # 下載文件
    v = host.put('D:\\采集\\a.cfg','/opt/a.cfg')                # 上傳文件
    host.close()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM