簡介
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是必傳的參數。方法的具體參數如下:
- hostname,即連接的目標主機,可以是IP地址字符串;
- port,指定端口號;
- username,驗證的用戶名;
- password,驗證的用戶密碼;
- pkey,私鑰方式用於身份驗證;
- key_filename,一個文件名或者文件列表,指定私鑰文件;
- timeout,可選的tcp連接超時時間;
- 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對象。
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()