模块名不要与py文件重名;py文件可以作为模块导入。
一、paramiko
基于用户名和密码的sshclient方式登录
缺点:只能在绝对路径下执行命令,不能在当前目录下执行
import paramiko ssh=paramiko.SSHClient() #建立一个sshclient对象 #允许将信任的主机自动加入到host_allow列表;此方法必须加到connec方法前 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy) #调用connect方法连接服务器 ssh.connect(hostname='192.168.42.12',port=22,username='root',password='0330') while True: stdin,stdout,stderr=ssh.exec_command(input('===>:').strip()) res=stdout.read().decode('utf-8')+stderr.read().decode('utf-8') #拼接字符串,可以看到报错信息 print(res) ssh.close()
import paramiko #实例化一个transport对象 t=trans=paramiko.Transport(('192.168.42.12',22)) #一定是元组形式的变量 #建立连接 t.connect(username='root',password='0330') #实例化一个sftp对象,指定连接的通道 sftp=paramiko.SFTPClient.from_transport(t) #发送文件,不能直接上传到目录,可以改名 sftp.put(r'D:\pycharm】\b.txt','/root/a.txt') #关闭 t.close()
import paramiko #实例化一个transport对象 t=trans=paramiko.Transport(('192.168.42.12',22)) #一定是元组形式的变量 #建立连接 t.connect(username='root',password='0330') #实例化一个sftp对象,指定连接的通道 sftp=paramiko.SFTPClient.from_transport(t) #下载文件,不能直接上传到目录,可以改名 sftp.get('/root/a.txt',r'D:\pycharm】\b.txt') #关闭 t.close()
二、socket(效率高)
基于ip地址和端口号,实现收发消息,可以实现服务的监控
import socket 监控一个主机 sever=socket.socket() #tcp协议 sever.settimeout(1) #设置超时时间,超过1秒就停止 res=sever.connect_ex(('127.0.0.1',8080)) print(res) #res==0表示端口号启用,res!=0表示端口号没启用
监控多个主机 import socket,re hosts=['1.1.1.1:8080','2.2.2.2:8080','3.3.3.3:8080','127.0.0.1:8080','4.4.4.4:8080','5.5.5.5:8080'] for host in hosts: # compile编译 # (.*?)非贪婪匹配,尽可能少的匹配 # (.*)贪婪匹配,尽可能多的匹配 # search方法表示去host里匹配 # 正则匹配的是字符串 ip = re.compile('(.*?):(.*)').search(host).group(1) port = re.compile('(.*?):(.*)').search(host).group(2) sever=socket.socket() sever.settimeout(1) res=sever.connect_ex((ip,int(port))) #必须是元组形式 if res == 0: print('%s----%s:ok' % (ip,port)) else: print('%s----%s:不ok' % (
import psutil import yagmail def mail(subject,contents): # 连接邮件服务器 yag=yagmail.SMTP(user='xxx@163.com',password='jam0330',host='smtp.163.com') #发送邮件 yag.send(to='xxx@163.com',subject=subject,contents=contents) #关闭邮件 yag.close() # 监控内存 def mem(): mem = psutil.virtual_memory() mem_dict = {'mem_total':int(mem[0])/1024/1024, #输出单位为 'mem_free':int(mem[1])/1024/1024, 'mem_percent':mem[2], 'mem_used':int(mem[3])/1024/1024} return mem_dict # 监控1秒内cpu的使用率 def cpu(): cpu = psutil.cpu_percent(1) return cpu # 监控硬盘 def disk(): disk = psutil.disk_usage(r'c:') disk_dict = {'disk_total':int(disk[0])/1024/1024, 'disk_used':int(disk[1])/1024/1024, 'disk_free':int(disk[2])/1024/1024, 'disk_percent':disk[3]} return disk_dict def main(): a = mem() b = cpu() c =disk() mag = ''' 内存总大小:%sM 内存剩余大小:%sM 内存使用率:%s%% 内存使用大小:%sM cpu使用率:%s%% 硬盘总大小:%sM 硬盘使用大小:%sM 硬盘剩余大小:%sM 硬盘使用率:%s%% ''' % (a['mem_total'],a['mem_free'],a['mem_percent'],a['mem_used'],b, c['disk_total'],c['disk_used'],c['disk_free'],c['disk_percent']) if a['mem_percent'] > 50: #判断内存使用率是否超过50 print('内存超过50%了,省着点用呐') mail('内存预警',mag) else: print('内存空间足足的') if b > 50: #判断cpu是否超过50 print('cpu超过50%了') mail('cpu预警',mag) else: print('cpu护你走天下') if c['disk_percent'] > 50: #判断硬盘使用率是否超过50 print('硬盘转疯了,快让他歇歇') mail('硬盘预警',mag) else: print('硬盘还有好久的寿命') if __name__ == '__main__': main()
三、re正则
# compile编译 # (.*?)非贪婪匹配,尽可能少的匹配 # (.*)贪婪匹配,尽可能多的匹配 # search方法表示去host里匹配 # 正则匹配的是字符串 ip = re.compile('(.*?):(.*)').search(host).group(1) port = re.compile('(.*?):(.*)').search(host).group(2)
四、yagmail
提供端口发送电子邮件,具有更好的易读性
yagmail是开源项目,使用前需要安装
import yagmail # 连接邮件服务器 yag=yagmail.SMTP(user='***@163.com',password='****',host='smtp.163.com') #发送邮件 yag.send(to='***9@163.com',subject='subject',contents='contents') #关闭邮件 yag.close()
五、psutil
import psutil # 监控内存 mem = psutil.virtual_memory() print(mem) # 监控1秒内cpu的使用率 cpu = psutil.cpu_percent(1) print(cpu) # 监控硬盘 disk = psutil.disk_usage(r'c:') print(disk)
# 持续监控内存,cpu,硬盘的使用情况 import psutil import yagmail def mail(subject,contents): # 连接邮件服务器 yag=yagmail.SMTP(user='18335192869@163.com',password='jam0330',host='smtp.163.com') #发送邮件 yag.send(to='18335192869@163.com',subject=subject,contents=contents) #关闭邮件 yag.close() # 监控内存 def mem(): mem = psutil.virtual_memory() mem_dict = {'mem_total':int(mem[0])/1024/1024, #输出单位为 'mem_free':int(mem[1])/1024/1024, 'mem_percent':mem[2], 'mem_used':int(mem[3])/1024/1024} return mem_dict # 监控1秒内cpu的使用率 def cpu(): cpu = psutil.cpu_percent(1) return cpu # 监控硬盘 def disk(): disk = psutil.disk_usage(r'c:') disk_dict = {'disk_total':int(disk[0])/1024/1024, 'disk_used':int(disk[1])/1024/1024, 'disk_free':int(disk[2])/1024/1024, 'disk_percent':disk[3]} return disk_dict def main(): a = mem() b = cpu() c =disk() mag = ''' 内存总大小:%sM 内存剩余大小:%sM 内存使用率:%s%% 内存使用大小:%sM cpu使用率:%s%% 硬盘总大小:%sM 硬盘使用大小:%sM 硬盘剩余大小:%sM 硬盘使用率:%s%% ''' % (a['mem_total'],a['mem_free'],a['mem_percent'],a['mem_used'],b, c['disk_total'],c['disk_used'],c['disk_free'],c['disk_percent']) if a['mem_percent'] > 50: #判断内存使用率是否超过50 print('内存超过50%了,省着点用呐') mail('内存预警',mag) else: print('内存空间足足的') if b > 50: #判断cpu是否超过50 print('cpu超过50%了') mail('cpu预警',mag) else: print('cpu护你走天下') if c['disk_percent'] > 50: #判断硬盘使用率是否超过50 print('硬盘转疯了,快让他歇歇') mail('硬盘预警',mag) else: print('硬盘还有好久的寿命') if __name__ == '__main__': main()
六、os模块
import os # 利用os.system调用系统命令 cmds = ['uname -r','update'] for cmd in cmds: res = os.system(cmd) if res == 0: print('执行成功') else: print('执行失败') # path.exists判断是否存在这个文件或目录 res=os.path.exists(r'a.txt') if res: print('文件已存在') else: os.system('dir') # os.path.join拼接路径 path1='D:/python/' path2='lion' res1=os.path.join(path1,path2) print(res1) # os.remove删除文件 os.remove(r'a.txt') # os.rename重命名 os.rename('a.txt','b.txt')
七、configparser模块
ConfigParser 是用来读取配置文件的包。配置文件的格式如下:中括号“[ ]”内包含的为section。section 下面为类似于key-value 的配置内容。
import configparser # 实例化 config = configparser.ConfigParser() config.read('mariadb.txt',encoding='utf-8') # 获取section节点 res = config.sections() print(res) # 获取指定section中的option res1=config.options('mysql') print(res1) # 获取section指定的option的值 config.get('mysql','baseurl') # 获取section中所有的配置信息 config.items('mysql') # 修改某个option值,不存在会创建 config.set('mysql','baseurl','url') config.write('mariadb.txt','w') # 检查section或option是否存在,返回bool值 config.has_section('mysql') config.has_option('mysql','baseurl') # 将section下的所有内容都删除 config.remove_section('mysql') # 将内容写入文件中 config.write('mariadb.txt','w')