【Python】Paramiko模塊實現Linux服務器遠程文件操作

ssh是一個協議,OpenSSH是其中一個開源實現,paramiko是Python的一個庫,實現了SSHv2協議(底層使用cryptography)。
有了Paramiko以後,我們就可以在Python代碼中直接使用SSH協議對遠程服務器執行操作,而不是通過ssh命令對遠程服務器進行操作。
由於paramiko屬於第三方庫,所以需要使用如下命令先行安裝
pip install paramiko

底層cryptography:加密解密模塊,cryptography 的目標是成爲“人類易於使用的密碼學包cryptography for humans”,這個想法使你能夠創建簡單安全、易於使用的加密方案。需要先安裝:
pip install cryptography
如果已經安裝過,可以通過pip install --user -I cryptography

paramiko包含兩個核心組件:SSHClient和SFTPClient。
SSHClient的作用類似於Linux的ssh命令,是對SSH會話的封裝,該類封裝了傳輸(Transport),通道(Channel)及SFTPClient建立的方法(open_sftp),通常用於執行遠程命令。
SFTPClient的作用類似與Linux的sftp命令,是對SFTP客戶端的封裝,用以實現遠程文件操作,如文件上傳、下載、修改文件權限等操作。

# Paramiko中的幾個基礎名詞:
1、Channel:是一種類Socket,一種安全的SSH傳輸通道;
2、Transport:是一種加密的會話,使用時會同步創建了一個加密的Tunnels(通道),這個Tunnels叫做Channel;
3、Session:是client與Server保持連接的對象,用connect()/start_client()/start_server()開始會話。

SFTPCLient作爲一個sftp的客戶端對象,根據ssh傳輸協議的sftp會話,實現遠程文件操作,如上傳、下載、權限、狀態
put(self, localpath, remotepath, callback=None, confirm=True)   上傳文件到服務器
get(self, remotepath, localpath, callback=None)    下載服務器的文件
remove(self, path)   刪除服務器文件
rename(self, oldpath, newpath)  重命名服務器上的文件
mkdir(self, path, mode=o777)    在服務器創建文件夾

from datetime import datetime
import paramiko
import os

class SftpDeal():
    def __init__(self):
        self.hostname = 'ip'
        self.username = 'username '
        self.password = 'password '
        self.port = 22
        try:
            self.conn = paramiko.Transport((self.hostname, self.port))            # 獲取Transport實例
            self.conn.connect(username=self.username, password=self.password)     # 連接SSH服務端,使用password
            self.sftp_ob = paramiko.SFTPClient.from_transport(self.conn)          # 獲取SFTP實例
        except Exception as e:
            print(e)

    # 上傳文件,local_file-本地目錄;remote_path-遠程目錄
    def upload(self,local_file,remote_path):
        try:
            self.sftp_ob.put(local_file, remote_path)
        except Exception as e:
            self.sftp_ob.mkdir(os.path.split(remote_path)[0])
            self.sftp_ob.put(local_file, remote_path)
            print("從本地: %s 上傳到: %s" % (local_file, remote_path))
        print(remote_path + ' 文件上傳成功 %s ' % datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
        #self.conn.close()

    def download(self,remote_path,local_file):
        try:
            self.sftp_ob.get(remote_path,local_file)
        except Exception as e:
            self.sftp_ob.mkdir(os.path.split(local_file)[0])
            self.sftp_ob.get(remote_path, local_file)
            print("從服務器: %s 下載到: %s" % (remote_path,local_file ))
        print(remote_path,'文件下載成功 %s ' % datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
        self.conn.close()

    def remove(self,remote_path):
        try:
            self.sftp_ob.remove(remote_path)
            print(remote_path + ' 文件刪除成功 %s ' % datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
        except:
            print('服務器上面無文件:%s'% (remote_path))
        #self.conn.close()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章