1.什麼是paramiko是什麼?
基於ssh用於鏈接遠程服務器作操做:
遠程執行命令
上傳文件ios
import paramiko 導入模塊服務器
#ssh username@ip
#建立一個ssh對象
client = paramiko.SSHClient() 建立一個ssh對象,使用變量client 接收
#解決的問題:若是以前沒有鏈接過的ip(主機),會出現
"""
The authenticity of host '172.25.0.101 (172.25.0.101)' can't be established.
ECDSA key fingerprint is 9d:37:08:8e:a4:ad:45:b5:eb:69:6f:d2:88:d3:da:8c.
Are you sure you want to continue connecting (yes/no)? yes
"""
#自動選擇yes
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#鏈接服務器
client.connect(
hostname='172.25.0.101',
username='root',
password='redhat'
)
#執行操做
#標準輸入 標準輸出 標準錯誤輸出
stdin,stdout,stderr = client.exec_command('')
#獲取命令的執行結果
print(stdout.read().decode('utf-8'))ssh
#關閉鏈接
client.close()ide
2.paramiko批量遠程密碼鏈接函數
當須要處理的主機比較多的時候,能夠使用批量鏈接的方式。將須要鏈接的主機ip,用戶名稱以及密碼等信息,按照固定的格式保存在文件中,經過讀取文件中的內容實現批量自動鏈接進行操做。code
主要步驟:
1 將上述的遠程密碼鏈接主機進行操做,定義成一個函數。
2 將須要批量鏈接處理的主機信息,寫在文件中,文件對象也是一個可迭代的對象,使用循環遍歷對全部的主機進行鏈接操做。對象
from paramiko.ssh_exception import\
NoValidConnectionsError,AuthenticationExceptionip
def connect(cmd,hostname,user,password):
import paramiko
#建立一個ssh對象
client = paramiko.SSHClient()
#解決的問題:若是以前沒有鏈接過的ip(主機),會出現
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:utf-8
client.connect( hostname=hostname, username=user, password=password ) except NoValidConnectionsError as e: return '主機%s鏈接失敗' %(hostname) except AuthenticationException as e: return '主機%s密碼錯誤' %(hostname) except Exception as e: return '未知錯誤:',e #執行操做 stdin,stdout,stderr = client.exec_command('hostname') #獲取命令的執行結果 print(stdout.read().decode('utf-8')) #關閉鏈接 client.close()
if name == 'main':
with open('hosts') as f:
for line in f:ci
hostname,username,password = line.strip().split(':') res = connect('pwd',hostname,username,password) print(hostname.center(50,'*')) print('主機名:',res)
3.paramiko基於公鑰和私鑰的鏈接
要注意的是:咱們當前用戶(執行此程序的用戶)要免祕鏈接的一臺主機、
用戶拿到的是私鑰 要鏈接的主機要掛載公鑰
鏈接的前提是,須要提早將公鑰放置被鏈接主機的指定用戶~/.ssh 目錄中。將私鑰放置在客戶端主機的指定用戶~/.ssh 中 設置ssh服務公鑰以及私鑰
鏈接操做步驟與第一個因此密碼鏈接基本一致,值守在鏈接主機的時候,不在使用密碼,而是使用生成的私鑰對象。
import paramiko
client = paramiko.SSHClient()
#建立一個私鑰對象
private_key = paramiko.RSAKey.\
from_private_key_file('/home/kiosk/.ssh/id_rsa')
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#鏈接服務器
client.connect(
hostname='172.25.0.250',
username='root',
pkey=private_key
)
#執行操做
#標準輸入 標準輸出 標準錯誤輸出
stdin,stdout,stderr = client.exec_command('')
#獲取命令的執行結果
print(stdout.read().decode('utf-8'))
#關閉鏈接
client.close()
4.paramiko基於用戶和密碼的上船和下載文件
import paramiko
from paramiko import AuthenticationException,SSHException
def put(hostname,password,source_name,target_name):
try:
#創建與遠程主機的通道 tarnsport = paramiko.Transport((hostname,22)) #驗證用戶名和密碼是否正確 tarnsport.connect(username='root',password=password) #根據建立並驗證成功的通道 sftp = paramiko.SFTPClient.from_transport(tarnsport) except AuthenticationException as e: return '主機%s密碼錯誤' %(hostname) except Exception as e: return '未知錯誤:',e else: # 上傳文件 sftp.put(source_name,target_name) #下載文件 #sftp.get('/mnt/name') finally: # 關閉兩臺主機創建的通道 tarnsport.close()
put('172.25.254.250','dd','/etc/passwd','/mnt/172.25.254.250')