我的第一个Python随笔
自学Python也很长时间了,注册博客园写了第一篇随笔。之前想过很多次,但是始终不知道该怎么开始,内容如何,现在想想,随笔嘛,是自己的想法,也自己的实践,又是自己的锻炼。话不多说,开始今天的正式内容。
Python的paramiko模块。
paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。由于使用的是python这样的能够跨平台运行的语言,所以所有python支持的平台,如Linux, Solaris, BSD, MacOS X, Windows等,paramiko都可以支持,因此,如果需要使用SSH从一个平台连接到另外一个平台,进行一系列的操作时,paramiko是最佳工具之一。
SSHClient
用于连接远程服务器并执行基本命令
基于用户名密码连接:
import paramiko # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.connect(hostname='192.168.30.129', port=22, username='sunqi', password='43797189') # 执行命令 stdin, stdout, stderr = ssh.exec_command('df') # 获取命令结果 result = stdout.read() # 关闭连接 ssh.close()
示例代码:
1 import paramiko 2 3 ssh = paramiko.SSHClient() 4 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy) 5 ssh.connect(hostname='192.168.30.129',port=22,username='root',password='43797189')#测试机器为Linux虚拟机(CentOS 7) 6 while True: 7 cmd = input('>>:') 8 stdin,stdout,stderr = ssh.exec_command(cmd) 9 result = stdout.read() 10 if stdout: 11 print(str(result,'utf8')) 12 else: 13 print(str(stderr.read(),'utf8')) 14 15 ssh.close()
SFTPClient
用于连接远程服务器并执行上传:
import paramiko ''' 从windows上传文件到Linux虚拟机 IP地址: 192.168.30.129 端口:22 ''' host = '192.168.30.129' port = 22 t = paramiko.Transport((host,port)) t.connect(username="root",password='43797189',) sftp = paramiko.SFTPClient.from_transport(t) target_path = '/var/log/windows.log' local_path = 'E:\\sunqi.log' sftp.put(local_path,target_path) t.close()
最后将多线程和这个paramiko模块综合起来写了一个批量主机管理程序
请看到的朋友原谅我的混乱代码规范,我会加倍努力的!
批量主机管理系统远程连接主机实现命令的执行文件的上传下载:
主机列表:
示例代码:host_dir.py
host_dic = { 'group1':{ 'C1':{'host':'192.168.30.129','port':22,'username':'root','password':'43797189'}, 'C2':{'host':'192.168.30.130','port':22,'username':'root','password':'43797189'}, 'C3':{'host':'192.168.30.131','port':22,'username':'root','password':'43797189'} }, 'group2':{ 'C4':{'host':'192.168.30.132','port':22,'username':'root','password':'43797189'}, 'C5':{'host':'192.168.30.134','port':22,'username':'root','password':'43797189'}, 'C6':{'host':'192.168.30.135','port':22,'username':'root','password':'43797189'}, } }
运行代码:run_code.py
import threading import paramiko import os from paramiko模块.批量主机管理小项目.host_dir import host_dic ''' 主机批量管理程序 实现多个主机的同时管理 利用多线程以及paramiko模块 实现多个主机同时执行命令,上传或下载文件 ''' class host_manage(): def __init__(self,host,port,username,password): self.host = host self.port = port self.username = username self.password = password def command(self,cmd): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy) ssh.connect(hostname=self.host,port=self.port,username=self.username,password=self.password) #cmd = input(">>:") stdin, stdout, stderr = ssh.exec_command(cmd) result = stdout.read() if stdout: print(str(result, 'utf8')) else: print(str(stderr.read(), 'utf8')) def upload(self): t = paramiko.Transport(self.host,self.port) t.connect(username=self.username,password=self.password) sftp = paramiko.SFTPClient.from_transport(t) target_path = '/var/log/windows.log' local_path = 'E:\\sunqi.log' sftp.put(local_path,target_path) t.close() pass def download(self): pass def choose_group(): print('可管理主机分组') for k in host_dic: print(k) for i in host_dic[k]: print(host_dic[k][i]) group_num = input('>>:选择主机编号') return group_num def run(): num = choose_group() print('已选组号:%s' %num) selected = input(">>:输入即将进行的操作:command、upload、download") if selected =="command": cmd = input('>>:请输入要批量操作的命令:') thread_conut = [] for i in host_dic[num]: func = host_manage(host=host_dic[num][i]['host'],port=host_dic[num][i]['port'],username=host_dic[num][i]['username'],password=host_dic[num][i]['password']) if hasattr(func,selected): p = threading.Thread(target=getattr(func,selected),args=(cmd,)) thread_conut.append(p) p.start() for i in thread_conut: i.join() if __name__ == '__main__': run()