Python學習:SSH協議實現模塊paramiko的使用

簡介

SSH是一個數據交互通信協議,而OpenSSH是SSH協議的一個開源實現。

而在Python的第三方庫中,paramiko是實現SSH協議v2版本的通信模塊。通過使用paramiko模塊,可以在Python代碼中直接使用SSH協議,對遠程服務器進行操作、類似於通過Linux命令ssh對遠程服務器進行操作。

由於paramiko屬於Python第三方庫,在使用之前需通過pip安裝:

pip install paramiko -i http://mirrors.zte.com.cn/pypi/simple/ --trusted-host mirrors.zte.com.cn

介紹

paramiko庫包含了兩個核心的組件,分別是SSHClient與SFTPClient。

類SSHClient是對SSH會話的封裝,該類封裝了傳輸(Transport)、通道(Channel),以及SFTPClient的創建方法(open_sftp),通常用於執行遠程命令。

類SFTPClient是對SFTP客戶端的封裝,用以實現對遠程服務器上的文件的操作,如文件上傳,文件下載,文件權限修改等操作。

在paramiko中,Channel是一種類socket,即一種安全的SSH傳輸通道。

Transport是一種加密的會話,使用時會同步創建一個加密的通道,即Channel。

而Session是client與server保持連接的對象。

SSHClient常用方法介紹

一、connect

connect方法實現遠程服務器的連接與認證,對於該方法,hostname是必傳的參數。方法的具體參數如下:

  1. hostname,即連接的目標主機,可以是IP地址字符串;
  2. port,指定端口號;
  3. username,驗證的用戶名;
  4. password,驗證的用戶密碼;
  5. pkey,私鑰方式用於身份驗證;
  6. key_filename,一個文件名或者文件列表,指定私鑰文件;
  7. timeout,可選的tcp連接超時時間;
  8. allow_agent,是否允許連接到ssh代理,默認爲True,表示允許;
  9. look_for_keys,是否在~/.ssh/中搜索私鑰文件,默認爲True,表示允許;
  10. compress,是否打開壓縮,默認爲False,表示不打開。

二、set_missing_host_key_policy

設置遠程服務器沒有在know_hosts文件中記錄時的應對策略,目前支持三種策略,具體如下:

  1. AutoAddPolicy,自動添加主機名及主機密鑰到本地HostKeys對象,不依賴load_system_host_key的配置。即新建立ssh連接時不需要再輸入yes或no進行確認;
  2. WarningPolicy,用於記錄一個未知的主機密鑰的python警告。並接受,功能上和AutoAddPolicy類似,但是會提示是新連接;
  3. RejectPolicy,自動拒絕未知的主機名和密鑰,依賴load_system_host_key的配置。此爲默認選項。

三、exec_command

在遠程服務器執行linux命令的方法。

四、open_sftp

在當前ssh會話的基礎上創建一個sftp會話,該方法會返回一個SFTPClient對象。

SSHClient常用方法範例

通過paramiko使得遠程服務器執行Linux命令的代碼範例如下:

import paramiko

client = paramiko.SSHClient()

client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname='10.46.75.9', port=22, username='root', password='ZTEzte123$%^')
stdin, stdout, stderr = client.exec_command('df -lh')
print(stdout.read().decode('utf-8'))

client.close()

使用SSHClient封裝的Transport實現遠程服務器執行Linux命令的代碼範例如下:

import paramiko
 
transport = paramiko.Transport(('10.46.75.9', 22))
transport.connect(username='root', password='ZTEzte123$%^')

ssh = paramiko.SSHClient()
ssh._transport = transport

stdin, stdout, stderr = ssh.exec_command('df -h')
print(stdout.read().decode('utf-8'))

transport.close()

SFTPClient常用方法介紹

SFTPClient作爲一個SFTP的客戶端對象,根據ssh傳輸協議的sftp會話,實現遠程服務器上的文件操作,具體方法如下:

一、from_transport

創建一個已連通的SFTP客戶端通道

二、put

方法原型:put(localpath, remotepath, callback=None, confirm=True)

將本地文件上傳到服務器 參數confirm表示是否調用stat()方法檢查文件狀態,返回ls -l的結果

三、get

方法原型:get(remotepath, localpath, callback=None)

從服務器下載文件到本地

四、mkdir

在服務器上創建目錄

五、remove

在服務器上刪除目錄

六、rename

在服務器上重命名目錄

七、stat

查看服務器文件狀態

八、listdir

列出服務器目錄下的文件

SFTPClient常用方法範例

範例代碼如下:

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

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