【PYTHON模塊】paramiko模塊與主機SSH連接
paramiko是用python語言寫的一個模塊,遵循SSH2協議,支持以加密和認證的方式,進行遠程服務器的連接。paramiko支持Linux, Solaris, BSD, MacOS X, Windows等平臺通過SSH從一個平臺連接到另外一個平臺。利用該模塊,可以方便的進行ssh連接和sftp協議進行sftp文件傳輸。
本文只演示paramiko連接linux操作系統。
-----------------------------------------------------
paramiko包裏一共有種連接方式(兩個類):SSHClient和Transport,每種連接方式都支持口令認證和證書認證。
paramiko也有一些其它的方法和屬性。本文只介紹簡單、常用的。
paramiko不是python基本模塊,需是基於pycrypto模塊,所以需要安裝pycrypto,再安裝paramiko
pip3 install pycrypto # windows下多半是會報錯的,原因是因為需要安裝c++,並且設置變量。 pip3 install paramiko # 實際上直接安裝paramiko,自動安裝依賴的包。我使用的pip版本是pip 9.0.3 # 成功的時候會提示安裝了下面這些包:pycparser, cffi, pynacl, bcrypt, pyasn1, asn1crypto, cryptography, paramiko
一、SSHClient:用來遠程執行命令。
方法/屬性名 | 參數: | 說明 |
connect() | 實現SSH的加密連接 hostname | 參數類型:作用 str :主機ip # 必須參數 int :端口 # 必須參數 str:用戶名 # 用戶名和pkey密鑰連接方式必須存在一個 str :密碼 pkey: 秘鑰 float: 超時時間 # 可選 boool :當為flase時,禁用連到ssh代理 # 可選 bool : flase時,禁用在~/.ssh中搜索秘鑰文件 # 可選 bool : true時打開壓縮。 # 可選 |
exec_command() | 遠程執行命令,popen的遠程版。。。 "command" bufsize | 參數類型:作用 str:遠程執行的命令,如果有多個命令需要操作時,需要通過分號進行分割 int:緩沖區的大小,默認-1,無限制 |
load_system_host_keys() | 加載本地公秘鑰校驗文件,默認為~/.ssh/known_hosts filename | 參數類型:作用 str : 遠程主機公鑰記錄文件,linux系統下默認路徑~/.ssh/known_hosts |
set_missing_host_key_policy() | 連接主機沒有本地主機秘鑰或者HostKeys對象時策略,目前支持三種:AutoAddPolicy,RejectPolicy,WarningPolicy | AutoAddPolicy:自動添加主機名以及主機密鑰 RejectPolicy(默認):自動拒絕未知的主機名和秘鑰 WarningPolicy: 用於記錄一個未知主機秘鑰的Python警告 |
示例: ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(.................) | ||
stdin.wirte(str) | str | 輸入str型的字符確認繼續。應該類似bat 中的pause |
示例一:使用用戶名和密碼進行SSHClient連接
import paramiko paramiko.util.log_to_file('/tmp/ssh_log') # 記錄連接信息 # 使用用戶名密碼連接遠程 def Myssh(): cmd = input("要執行的命令->>:").strip() return cmd ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 在connect前,設置參數,自動添加主機到linux的 host_knows文件裏 ssh.connect(hostname = '192.168.1.100', port = 9999, username = 'david',password = 'wonianqing') #也可以傳形參:ssh.connect('192.168.1.100', 9999, 'david','wonianqing') cmd = Myssh() stdin,stdout,stderr = ssh.exec_command(cmd) if stdout.read(): print (stdout.read()) # stdout和stderr兩者只能有一個有數據,stdout正常返回,stderr返回的錯誤。 else: print (stderr.read()) ssh.close()
示例二:使用證書認證進行SSHClient連接。
import paramiko ssh = paramiko.SSHClient() ssh.connect("localhost",9999,pkey="") # 需要在linux下創建個密鑰,pkey就是客戶機上的私鑰地址,服務端地址默認
二、SFTPClient:用來上傳下載遠程主機的文件
方法/屬性名 | 作用 | 參數 | 示例 |
Transport((主機名,端口號)) | 建立遠程主機加密碼管道對象 | 主機名:ip或者主機名,str型 端口號:指定端口,int型 | sf = paramiko.Transport(("192.168.1.1",22)) |
connect(username,password) | 建立遠程連接 | username:用戶名 password:密碼 | sf.connect(username = "root",password="areyouok1") |
SFTPClient.from_transport(加密管道) | 建立一個客戶端對象,通過ssh transport操作遠程文件 | 加密管道:之前創建的sf對象 | sftp = paramiko.SFTPClient.from_transport(sf) |
get(遠程文件,本地文件) | 從遠程下載指定文件存到本地 | 遠程文件名 本地文件名 | sftp.get(remotepath,localpath) |
put(本地文件,遠程文件) | 從本地上傳指定文件到遠程路徑 | 本地文件名 遠程文件名 | sftp.put(localpath,remotepath) |
listdir(遠程路徑) | 列出遠程指定路徑的文件夾 | 遠程路徑名 | sftp.listdir("..") |
import paramiko """SFTPClient""" sftp_transport_obj = paramiko.Transport(("192.168.1.106", 22)) sftp_transport_obj.connect(username="root",password="a2266351z") sftp = paramiko.SFTPClient.from_transport(sftp_transport_obj) # sftp.get() # sftp.put() ss=sftp.listdir("..") print(ss) print(ss.read()) '''paramiko也可以使用socket對象連接''' import socket,paramiko addr = "192.168.1.106" port = 22 socket_obj = socket.socket() socket_obj.connect((addr,port)) sftp_transport_obj = paramiko.Transport(socket_obj) sftp_obj = paramiko.SFTPClient.from_transport(sftp_transport_obj) cmd_result = sftp_obj.listdir('..') print(cmd_result) sftp_transport_obj.close()
參考資料:
http://python.jobbole.com/87088/
【PYTHON模塊】paramiko模塊與主機SSH連接