1. 程式人生 > >【PYTHON模塊】paramiko模塊與主機SSH連接

【PYTHON模塊】paramiko模塊與主機SSH連接

SS paramik fabri

還記得前一節做的socket和socketserver嗎?寫了很多實現了一個小功能,但是今天的paramiko真讓人有種土槍換炮的感覺!

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
port
username
password
pkey
timeout
allow_agent
look_for_keys
compress

參數類型:作用

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連接