python模組之paramiko
阿新 • • 發佈:2022-03-20
很多運維人員平時進行維護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