python模塊之paramiko


很多運維人員平時進行維護linux/unix主機時候,無非通過ssh到相應主機操作,那么一旦主機有成千上百台,那該如何應對,這時候我們需要批處理工具,基於python的工具有ansible、salt,而ansible的核心則是基於paramiko。

 

 

安裝:

pip install paramiko或 easy_install paramiko

核心組件:

SSHclient類
方法:

connect():遠程ssh連接並作校驗

參數:

  • hostname 連接的目標主機
  • port=SSH_PORT 指定端口
  • username=None 驗證的用戶名
  • password=None 驗證的用戶密碼
  • pkey=None 私鑰方式用於身份驗證
  • key_filename=None 一個文件名或文件名列表,指定私鑰文件
  • timeout=None 可選的tcp連接超時時間
  • allow_agent=True 是否允許連接到ssh代理,默認為True 允許
  • look_for_keys=True 是否在~/.ssh中搜索私鑰文件,默認為True 允許
  • compress=False 是否打開壓縮
  • sock=None
  • gss_auth=False
  • gss_kex=False
  • gss_deleg_creds=True
  • gss_host=None
  • banner_timeout=None

 

exec_command():用於遠程執行命令,該命令的輸入與輸出流為標准輸入、標出輸出、標准錯誤輸出

參數:

  • command 執行的命令
  • bufsize=-1 文件緩沖區大小
  • timeout=None 設置超時時間
  • get_pty=False

 

load_system_host_key():裝載系統公鑰,默認為~/.ssh/known_hosts

參數:

  • filename=None 指定本地公鑰文件

 

set_missing_host_key_policy():設置連接的遠程主機沒有本地主機密鑰或HostKeys對象時的策略,目前支持三種,也就是參數只有三個。

參數:

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

  用法:
  set_missing_host_key_policy(paramiko.AutoAddPolicy())

SFTPClient類

SFTPCLient作為一個sftp的客戶端對象,根據ssh傳輸協議的sftp會話,實現遠程文件操作,如上傳、下載。

方法:

    • from_transport(cls,t) 創建一個已連通的SFTP客戶端通道
    • put(localpath, remotepath, callback=None, confirm=True) 將本地文件上傳到服務器 參數confirm:是否調用stat()方法檢查文件狀態,返回ls -l的結果
    • get(remotepath, localpath, callback=None) 從服務器下載文件到本地
    • mkdir() 在服務器上創建目錄
    • remove() 在服務器上刪除目錄
    • rename() 在服務器上重命名目錄
    • stat() 查看服務器文件狀態
    • listdir() 列出服務器目錄下的文件

 

 

 

使用:

1.執行遠程命令

1)用戶名,密碼

#!/usr/bin/env python3
#_*_ coding:utf-8 _*_
#Author:wd
import paramiko
host='10.0.0.241'
username='root'
passwd='1234qwer'
ssh=paramiko.SSHClient()#創建SSH對象
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())#設置自動添加known_host
ssh.connect(hostname=host,username=username,password=passwd,)#連接主機
paramiko.util.log_to_file('tran.log')#設置登陸數據傳輸日志
stdin,stdout,stderr=ssh.exec_command('ifconfig',timeout=10)#執行命令設置超時時間
stdout,stderr=stdout.read(),stderr.read()
res=stdout if stdout else stderr
print(res.decode())ssh.close()#關閉連接

 

2)使用公鑰

#!/usr/bin/env python3
#_*_ coding:utf-8 _*_
#Author:wd
host='172.16.11.35'
username='root'

import paramiko
ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())#設置自動添加known_hosts,一定要在connection之前
ssh.connect(username=username,hostname=host,pkey=paramiko.RSAKey.from_private_key_file('/Users/fangchaoliu/.ssh/id_rsa'))
stdin,stdout,stderr=ssh.exec_command('ifconfig')
stdout,stderr=stdout.read(),stderr.read()
res=stdout if stdout else stderr
print(res.decode())

 

3)使用SSHClient封裝transport

#!/usr/bin/env python3
#_*_ coding:utf-8 _*_
#Author:wd
host=('172.16.11.35',22)
user='root'
passwd='1234qwer'
import paramiko
tran=paramiko.Transport(host)#host是一個tuple,分別是主機和port
tran.connect(username=user,password=passwd)
ssh=paramiko.SSHClient()
ssh._transport=tran
stdin,stdout,stderr=ssh.exec_command('df -h')
stdout,stderr=stdout.read(),stderr.read()
res=stdout if stdout else stderr
print(res.decode())tran.close()

密鑰字符串:

import paramiko
from io import StringIO

key_str = """-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAq7gLsqYArAFco02/55IgNg0r7NXOtEM3qXpb/dabJ5Uyky/8
NEHhFiQ7deHIRIuTW5Zb0kD6h6EBbVlUMBmwJrC2oSzySLU1w+ZNfH0PE6W6fans
H80whhuc/YgP+fjiO+VR/gFcqib8Rll5UfYzf5H8uuOnDeIXGCVgyHQSmt8if1+e
7hn1MVO1Lrm9Fco8ABI7dyv8/ZEwoSfh2C9rGYgA58LT1FkBRkOePbHD43xNfAYC
tfLvz6LErMnwdOW4sNMEWWAWv1fsTB35PAm5CazfKzmam9n5IQXhmUNcNvmaZtvP
c4f4g59mdsaWNtNaY96UjOfx83Om86gmdkKcnwIDAQABAoIBAQCnDBGFJuv8aA7A
ZkBLe+GN815JtOyye7lIS1n2I7En3oImoUWNaJEYwwJ8+LmjxMwDCtAkR0XwbvY+
c+nsKPEtkjb3sAu6I148RmwWsGncSRqUaJrljOypaW9dS+GO4Ujjz3/lw1lrxSUh
IqVc0E7kyRW8kP3QCaNBwArYteHreZFFp6XmtKMtXaEA3saJYILxaaXlYkoRi4k8
S2/K8aw3ZMR4tDCOfB4o47JaeiA/e185RK3A+mLn9xTDhTdZqTQpv17/YRPcgmwz
zu30fhVXQT/SuI0sO+bzCO4YGoEwoBX718AWhdLJFoFq1B7k2ZEzXTAtjEXQEWm6
01ndU/jhAasdfasdasdfasdfa3eraszxqwefasdfadasdffsFIfAsjQb4HdkmHuC
OeJrJOd+CYvdEeqJJNnF6AbHyYHIECkj0Qq1kEfLOEsqzd5nDbtkKBte6M1trbjl
HtJ2Yb8w6o/q/6Sbj7wf/cW3LIYEdeVCjScozVcQ9R83ea05J+QOAr4nAoGBAMaq
UzLJfLNWZ5Qosmir2oHStFlZpxspax/ln7DlWLW4wPB4YJalSVovF2Buo8hr8X65
lnPiE41M+G0Z7icEXiFyDBFDCtzx0x/RmaBokLathrFtI81UCx4gQPLaSVNMlvQA
539GsubSrO4LpHRNGg/weZ6EqQOXvHvkUkm2bDDJAoGATytFNxen6GtC0ZT3SRQM
WYfasdf3xbtuykmnluiofasd2sfmjnljkt7khghmghdasSDFGQfgaFoKfaawoYeH
C2XasVUsVviBn8kPSLSVBPX4JUfQmA6h8HsajeVahxN1U9e0nYJ0sYDQFUMTS2t8
RT57+WK/0ONwTWHdu+KnaJECgYEAid/ta8LQC3p82iNAZkpWlGDSD2yb/8rH8NQg
9tjEryFwrbMtfX9qn+8srx06B796U3OjifstjJQNmVI0qNlsJpQK8fPwVxRxbJS/
pMbNICrf3sUa4sZgDOFfkeuSlgACh4cVIozDXlR59Z8Y3CoiW0uObEgvMDIfenAj
98pl3ZkCgYEAj/UCSni0dwX4pnKNPm6LUgiS7QvIgM3H9piyt8aipQuzBi5LUKWw
DlQC4Zb73nHgdREtQYYXTu7p27Bl0Gizz1sW2eSgxFU8eTh+ucfVwOXKAXKU5SeI
+MbuBfUYQ4if2N/BXn47+/ecf3A4KgB37Le5SbLDddwCNxGlBzbpBa0=
-----END RSA PRIVATE KEY-----"""

private_key = paramiko.RSAKey(file_obj=StringIO(key_str))
transport = paramiko.Transport(('10.0.1.40', 22))
transport.connect(username='wupeiqi', pkey=private_key)

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

stdin, stdout, stderr = ssh.exec_command('df')
result = stdout.read()

transport.close()

print(result)

 

2.上傳與下載文件

1)

下載上傳,使用SSHclient封裝的Transport,注意(連接建立完成以后需要關閉通道tran.close())

通過用戶名密碼demo:

#!/usr/bin/env python3
#_*_ coding:utf-8 _*_
#Author:wd
host=('172.16.11.35',22)
user='root'
passwd='1234qwer'
import paramiko
tran=paramiko.Transport(host)#host是一個tuple,分別是主機和port
tran.connect(username=user,password=passwd)
sftp=paramiko.SFTPClient.from_transport(tran)
status=sftp.put('socket_client.py','/usr/local/socket_client.py')#上傳文件
sftp.get('/root/skip.sh','skip.sh')#下載文件
print(status)#打印傳輸狀態
tran.close()#關閉連接

2)

#!/usr/bin/env python3
#_*_ coding:utf-8 _*_
#Author:wd
import paramiko
host=('172.16.11.35',22)
user='root'
private_key=paramiko.RSAKey.from_private_key_file('/Users/fangchaoliu/.ssh/id_rsa')
tran=paramiko.Transport(host)#host是一個tuple,分別是主機和port
tran.connect(username=user,pkey=private_key)
sftp=paramiko.SFTPClient.from_transport(tran)
status=sftp.put('socket_client.py','/usr/local/socket_client.py')#上傳文件
sftp.get('/root/skip.sh','skip.sh')#下載文件
print(status)#打印傳輸狀態
tran.close()#關閉連接

 

 

 

 

參考: https://www.cnblogs.com/wdliu/p/6858918.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM