本節內容:html
http://www.cnblogs.com/wupeiqi/articles/5095821.htmlpython
paramiko是一個模塊,socket和ssh協議,利用這個模塊就能夠用python代碼實現遠程服務器操做mysql
ansible底層就是用的這個模塊linux
功能:sql
a.使用用戶名密碼:命令,文件shell
b.使用用戶名祕鑰:命令,文件服務器
c.執行建立session(後面講堡壘機項目)session
1.基於用戶名密碼鏈接:ssh
import paramiko # 建立SSH對象 ssh = paramiko.SSHClient() # 容許鏈接不在know_hosts文件中的主機 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 鏈接服務器 ssh.connect(hostname='c1.salt.com', port=22, username='wupeiqi', password='123') # 執行命令 stdin, stdout, stderr = ssh.exec_command('df') # 獲取命令結果 result = stdout.read() # 關閉鏈接 ssh.close()
b'anaconda-ks.cfg\ninstall.log\ninstall.log.syslog\npackage\n\xe5\x85\xac\xe5\x85\xb1\xe7\x9a\x84\n\xe6\xa8\xa1\xe6\x9d\xbf\n\xe8\xa7\x86\xe9\xa2\x91\n\xe5\x9b\xbe\xe7\x89\x87\n\xe6\x96\x87\xe6\xa1\xa3\n\xe4\xb8\x8b\xe8\xbd\xbd\n\xe9\x9f\xb3\xe4\xb9\x90\n\xe6\xa1\x8c\xe9\x9d\xa2\n'
假如利用普通用戶登陸socket
# -*- coding: UTF-8 -*- #blog:http://www.cnblogs.com/linux-chenyang/ import paramiko # 建立SSH對象 ssh = paramiko.SSHClient() # 容許鏈接不在know_hosts文件中的主機 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 鏈接服務器 ssh.connect(hostname='10.236.62.37', port=22, username='root', password='123456') # 執行命令 stdin, stdout, stderr = ssh.exec_command('sudo ls') stdin.write('123456') stdin.flush() # 獲取命令結果 result = stdout.read() print(str(result)) # 關閉鏈接 ssh.close()
import paramiko transport = paramiko.Transport(('hostname', 22)) transport.connect(username='wupeiqi', password='123') ssh = paramiko.SSHClient() ssh._transport = transport stdin, stdout, stderr = ssh.exec_command('df') print stdout.read() transport.close()
2.基於用戶名祕鑰鏈接
import paramiko private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa') # 建立SSH對象 ssh = paramiko.SSHClient() # 容許鏈接不在know_hosts文件中的主機 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 鏈接服務器 ssh.connect(hostname='c1.salt.com', port=22, username='wupeiqi', key=private_key) # 執行命令 stdin, stdout, stderr = ssh.exec_command('df') # 獲取命令結果 result = stdout.read() # 關閉鏈接 ssh.close()
import paramiko private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa') transport = paramiko.Transport(('hostname', 22)) transport.connect(username='wupeiqi', pkey=private_key) ssh = paramiko.SSHClient() ssh._transport = transport stdin, stdout, stderr = ssh.exec_command('df') transport.close()
3.基於私鑰字符串的形式
#3.基於私鑰字符串的形式 import paramiko from io import StringIO key_str = """ zhe shi yi da dui zi fu chuan """ #1.至關於生成一個文件先f=StringIO(key_str) #2.而後在讀f.read() private_key = paramiko.RSAKey(file_obj=StringIO(key_str)) # 建立SSH對象 ssh = paramiko.SSHClient() # 容許鏈接不在know_hosts文件中的主機 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 鏈接服務器 ssh.connect(hostname='c1.salt.com', port=22, username='wupeiqi', key=private_key) # 執行命令 stdin, stdout, stderr = ssh.exec_command('df') # 獲取命令結果 result = stdout.read() # 關閉鏈接 ssh.close()
SFTPClient
用於鏈接遠程服務器並執行上傳下載
基於用戶名密碼上傳下載
import paramiko transport = paramiko.Transport(('hostname',22)) transport.connect(username='wupeiqi',password='123') sftp = paramiko.SFTPClient.from_transport(transport) # 將location.py 上傳至服務器 /tmp/test.py sftp.put('/tmp/location.py', '/tmp/test.py') # 將remove_path 下載到本地 local_path sftp.get('remove_path', 'local_path') transport.close()
基於公鑰密鑰上傳下載
import paramiko private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa') transport = paramiko.Transport(('hostname', 22)) transport.connect(username='wupeiqi', pkey=private_key ) sftp = paramiko.SFTPClient.from_transport(transport) # 將location.py 上傳至服務器 /tmp/test.py sftp.put('/tmp/location.py', '/tmp/test.py') # 將remove_path 下載到本地 local_path sftp.get('remove_path', 'local_path') transport.close()
# -*- coding: UTF-8 -*- #blog:http://www.cnblogs.com/linux-chenyang/ # # #傳統的方式就是我上傳一個文件,先鏈接上,而後上傳完在斷開,執行一個命令,先鏈接上,在執行命令,而後斷開 #案例場景,建立一個鏈接,執行多條命令,執行多個上傳,本身想關掉鏈接就關掉 #經過paramiko能夠封裝成個模塊, import paramiko class SshHelper(object): def __init__(self,host,port,username,pwd): self.host = host self.port = port self.username = username self.pwd = pwd self.transport = None def connect(self): transport = paramiko.Transport((self.host, self.port)) transport.connect(username=self.username, password=self.pwd) self.transport = transport def upload(self,local,target): sftp = paramiko.SFTPClient.from_transport(self.transport) # 將location.py 上傳至服務器 /tmp/test.py sftp.put(local, target) # 將remove_path 下載到本地 local_path #sftp.get('remove_path', 'local_path') def cmd(self,shell): ssh = paramiko.SSHClient() ssh._transport = self.transport stdin, stdout, stderr = ssh.exec_command(shell) print(stdout.read()) def close(self): self.transport.close() if __name__ == '__main__': obj = SshHelper('..........') obj.connect() #中間能夠想執行多少次命令就執行多少次 obj.close()
- 什麼是MySQL 服務端: a.socket服務端運行,監聽:IP和端口 b.獲取客戶端發送的數據: asdfasdfasdfasdfasdfasdf c.解析 d.去文件中作操做 客戶端: a.socket客戶端:基於各類語言的客戶端 b.驗證 c.發送命令(學習規則SQL語句)