paramiko是基于Python實現(xiàn)的SSH2遠程安全連接,支持認(rèn)證及密鑰方式??梢詫崿F(xiàn)遠程命令執(zhí)行、文件傳輸、中間SSH代理等功能,相對于Pexpect,封裝的層次更高,更貼近SSH協(xié)議的功能,官網(wǎng)地址:http://www.paramiko.org
創(chuàng)新互聯(lián)建站堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:做網(wǎng)站、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的雙遼網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
一:核心組件
SSHClient類:
SSHClient類是SSH服務(wù)會話的高級表示,該類封裝了傳輸(transport)、通道(channel)及SFTPClient的校驗、建立的方法,通常用于執(zhí)行遠程命令
1 connect方法connect方法實現(xiàn)了遠程SSH連接并校驗。方法定義:connect(self, hostname, port=22, username=None, password=None, pkey=None, key_filename=None, timeout=None, allow_agent=True, look_for_keys=True, compress=False)
參數(shù)說明:
hostname(str類型),連接的目標(biāo)主機地址;
port(int類型),連接目標(biāo)主機的端口,默認(rèn)為22;
username(str類型),校驗的用戶名(默認(rèn)為當(dāng)前的本地用戶名);
password(str類型),密碼用于身份校驗或解鎖私鑰;
pkey(PKey類型),私鑰方式用于身份驗證;
key_filename(str or list(str)類型),一個文件名或文件名的列表,用于私鑰的身份驗證;
timeout(float類型),一個可選的超時時間(以秒為單位)的TCP連接;
allow_agent(bool類型),設(shè)置為False時用于禁用連接到SSH代理;
look_for_keys(bool類型),設(shè)置為False時用來禁用在~/.ssh中搜索私鑰文件;
compress(bool類型),設(shè)置為True時打開壓縮。
2 exec_command方法遠程命令執(zhí)行方法,該命令的輸入與輸出流為標(biāo)準(zhǔn)輸入(stdin)、輸出(stdout)、錯誤(stderr)的Python文件對象
遠程命令執(zhí)行方法,該命令的輸入與輸出流為標(biāo)準(zhǔn)輸入(stdin)、輸出(stdout)、錯誤(stderr)的Python文件對象
參數(shù)說明:
command(str類型),執(zhí)行的命令串;
bufsize(int類型),文件緩沖區(qū)大小,默認(rèn)為-1(不限制)
3. load_system_host_keys方法
加載本地公鑰校驗文件,默認(rèn)為~/.ssh/known_hosts,非默認(rèn)路徑需要手工指定,方法定義:load_system_host_keys(self,filename=None)參數(shù)說明:filename(str類型),指定遠程主機公鑰記錄文件。
4. set_missing_host_key_policy方法設(shè)置連接的遠程主機沒有本地主機密鑰或HostKeys對象時的策略,目前支持三種,分別是AutoAddPolicy、RejectPolicy(默認(rèn))、Warning-Policy,僅限用于SSHClient類,分別代表的含義如下:
AutoAddPolicy,自動添加主機名及主機密鑰到本地HostKeys對象,并將其保存,不依賴load_system_host_keys()的配置,即使~/.ssh/known_hosts不存在也不產(chǎn)生影響;
RejectPolicy,自動拒絕未知的主機名和密鑰,依賴load_system_host_keys()的配置;
WarningPolicy,用于記錄一個未知的主機密鑰的Python警告,并接受它,功能上與Au-toAddPolicy相似,但未知主機會有告警。
下面介紹一個簡單實現(xiàn)遠程SSH運行命令的示例。該示例使用密碼認(rèn)證方式,通過exec_com-mand()方法執(zhí)行命令,詳細(xì)源碼如下:
#!/usr/bin/env python # -*- coding: utf-8 -*- import paramiko hostname="18.16.200.191" username="root" password="shitouit@2017" paramiko.util.log_to_file('syslogin.log') ssh = paramiko.SSHClient() #ssh.load_system_host_keys() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #設(shè)置連接的遠程主機沒有本地主機密鑰或HostKeys對象時的策略,AutoAddPolicy,自動添加主機名及主機密鑰到本地HostKeys對象,并將其保存,不依賴load_system_host_keys()的配置,即使~/.ssh/known_hosts不存在也不產(chǎn)生影響 ssh.connect(hostname=hostname,username=username,password=password) stdin,stdout,stderr=ssh.exec_command('free -m') print stdout.read() ssh.close()
程序執(zhí)行結(jié)果截圖如下:
SFTPClient類:
SFTPClient作為一個SFTP客戶端對象,根據(jù)SSH傳輸協(xié)議的sftp會話,實現(xiàn)遠程文件操作,比如文件上傳、下載、權(quán)限、狀態(tài)等操作
1. from_transport方法
創(chuàng)建一個已連通的SFTP客戶端通道,方法定義:from_transport(cls, t)
參數(shù)說明:t(Transport),一個已通過驗證的傳輸對象
2. put方法
上傳本地文件到遠程SFTP服務(wù)端,方法定義:put(self, localpath, remotepath, callback=None, confirm=True)
參數(shù)說明:
localpath(str類型),需上傳的本地文件(源);
remotepath(str類型),遠程路徑(目標(biāo));
callback(function(int, int)),獲取已接收的字節(jié)數(shù)及總傳輸字節(jié)數(shù),以便回調(diào)函數(shù)調(diào)用,默認(rèn)為None; confirm(bool類型),文件上傳完畢后是否調(diào)用stat()方法,以便確認(rèn)文件的大小。
3. get方法
從遠程SFTP服務(wù)端下載文件到本地,方法定義:get(self, remotepath, localpath, callback=None)
參數(shù)說明:
remotepath(str類型),需下載的遠程文件(源);
localpath(str類型),本地路徑(目標(biāo));
callback(function(int, int)),獲取已接收的字節(jié)數(shù)及總傳輸字節(jié)數(shù),以便回調(diào)函數(shù)調(diào)用,默認(rèn)為None。
4. 其他方法
SFTPClient類其他常用方法說明:
Mkdir,在SFTP remove,刪除SFTP服務(wù)器端指定目錄,如sftp.remove("/home/userdir")。 rename,重命名SFTP服務(wù)器端文件或目錄,如sftp.rename("/home/test.sh","/home/testfile.sh")。 stat,獲取遠程SFTP服務(wù)器端指定文件信息,如sftp.stat("/home/testfile.sh")。 listdir,獲取遠程SFTP服務(wù)器端指定目錄列表,以Python的列表(List)形式返回,如sftp.listdir("/home")。 下面為SFTPClient類的一個完整示例,實現(xiàn)了文件上傳、下載、創(chuàng)建與刪除目錄等,需要注意的是,put和get方法需要指定文件名:#!/usr/bin/env python
# -*- coding: utf-8 -*-
import paramiko
hostname="18.16.200.191"
username="root"
password="shitouit@2017"
port=22
try:
t=paramiko.Transport((hostname, port))
t.connect(username=username,password=password)
sftp = paramiko.SFTPClient.from_transport(t)
sftp.put('/root/anaconda-ks.cfg','/data/anaconda-ks.cfg') #上傳文件
sftp.get('/root/harbor-online-installer-v1.5.2.tgz','/root/harbor-online-installer-v1.5.2.tgz') #下載文件
sftp.mkdir('/data/parami',0755)
sftp.rmdir('/data/parami')
sftp.rename('/root/1.sh','/root/2.sh')
print sftp.stat('/root/2.sh')
print sftp.listdir('/data/')
t.close()
except Exception, e:
print str(e)
分享題目:系統(tǒng)批量運維管理paramiko
瀏覽地址:http://weahome.cn/article/gsepsj.html