Python运维(六)--系统监控psutil、数据报scapy、扫描nmap
目录
- 一、系统监控psutil
- 1.1 cpu监控
- 1.2 内存
- 1.3 磁盘
- 1.4 进程
- 1.4.1 进程查询
- 1.4.2 进程修改
- 二、网络嗅探器scapy
- 2.1 命令行操作
- 2.2 数据报构造简介
- 2.2.1 按层构建数据报
- 2.2.2 发送数据报
- 2.3 ARP扫描网段存活主机
- 三、使用python-nmap
- 3.1 nmap命令
- 3.2 python-nmap
一、系统监控psutil
- 安装:
pip3 install psutil
1.1 cpu监控
- 代码示例
In [1]: import psutil # 获取cpu逻辑个数 In [2]: psutil.cpu_count() Out[2]: 2 # 获取cpu物理个数 In [3]: psutil.cpu_count(logical=False) Out[3]: 2 # cpu使用百分比 In [4]: psutil.cpu_percent() Out[4]: 11.7
1.2 内存
- 代码示例
# 获取内存的所有信息 In [1]: psutil.virtual_memory() Out[1]: svmem(total=1927233536, available=1256218624, percent=34.8, used=403361792, free=166739968, active=699125760, inactive=532242432, buffers=2154496, cached=1354977280, shared=75677696, slab=409309184) # 获取交换内存 In [2]: psutil.swap_memory() Out[2]: sswap(total=2147479552, used=532480, free=2146947072, percent=0.0, sin=0, sout=434176) # 获取内存使用率 In [3]: psutil.virtual_memory().percent Out[3]: 34.8
1.3 磁盘
- 代码示例
# 获取磁盘分区及挂载点 In [1]: psutil.disk_partitions() Out[1]: [sdiskpart(device='/dev/mapper/centos-root', mountpoint='/', fstype='xfs', opts='rw,relatime,attr2,inode64,noquota', maxfile=255, maxpath=4096),... ] # 通过挂载点查看磁盘使用情况:单位字节 In [2]: psutil.disk_usage("/") Out[2]: sdiskusage(total=53660876800, used=4668542976, free=48992333824, percent=8.7) # 通过挂载点查看磁盘使用率 In [3]: psutil.disk_usage("/").percent Out[3]: 8.7
1.4 进程
1.4.1 进程查询
查询列表
功能 写法 功能 写法 所有进程的PID列表 psutil.pids()
进程生成器(见下演示) psutil.process_iter()
进程名 p.name()
进程的可执行绝对路径 p.exe()
进程当前的工作目录 p.cwd()
调用此进程的命令行 p.cmdline()
进程PID p.pid
进程的父PID p.ppid() 进程的子进程 p.children() 进程的父进程(对象) p.parent() 进程的父进程(列表) p.parents() 进程的状态 p.status()
拥有该进程的用户 p.username()
进程创建的时间 p.create_time() 进程累计的时间 p.cpu_times() 进程的CPU占用率 p.cpu_percent()
进程的CPU亲和性 p.cpu_affinity() 进程的内存信息 p.memory_info() 进程的内存占用率 p.memory_percent()
进程映射的内存区域 p.memory_maps() 进程的I/O信息 p.io_counters() 进程打开的文件信息 p.open_files() 进程打开的套接字连接 p.connections() 进程使用的线程数 p.num_threads()
进程打开的线程 p.threads()
进程执行的上下文切换数量 p.num_ctx_switches() 进程的优先级(带参可设优先级) p.nice() 进程的I/O优先级(带参可设优先级) p.ionice() 进程的环境变量 p.environ() 进程信息(字典) p.as_dict()
进程是否正在运行 p.is_running()
效果演示
In [1]: import psutilIn [2]: pid_list = psutil.pids() In [3]: print("所有进程的PID列表:",pid_list) 所有进程的PID列表:[1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, .....]In [4]: p = psutil.Process(18449)In [5]: print(p) psutil.Process(pid=18449, name='top', status='sleeping', started='09:24:28')In [6]: print("进程名:", p.name()) 进程名: topIn [7]: print("进程的可执行绝对路径:", p.exe()) 进程的可执行绝对路径: /usr/bin/topIn [8]: print("进程当前的工作目录:", p.cwd()) 进程当前的工作目录: /rootIn [9]: print("调用此进程的命令行:", p.cmdline()) 调用此进程的命令行: ['top']In [10]: print("进程PID:", p.pid) 进程PID: 18449In [11]: print("进程的父PID:", p.ppid()) 进程的父PID: 18272In [12]: print("进程的子进程:", p.children()) 进程的子进程: []In [13]: print("进程的父进程(对象):", p.parent()) 进程的父进程(对象): psutil.Process(pid=18272, name='bash', status='sleeping', started='09:24:26')In [14]: print("进程的父进程(列表):", p.parents()) 进程的父进程(列表): [psutil.Process(pid=18272, name='bash', status='sleeping', started='09:24:26'), ...]In [15]: print("进程的状态:", p.status()) 进程的状态: sleepingIn [16]: print("拥有该进程的用户:", p.username()) 拥有该进程的用户: rootIn [17]: print("进程创建的时间:", p.create_time()) 进程创建的时间: 1655342668.64In [18]: print("进程进驻cpu累计的时间:", p.cpu_times()) 进程进驻cpu累计的时间: pcputimes(user=0.73, system=1.29, children_user=0.0, children_system=0.0, iowait=0.0)In [19]: print("进程的CPU占用率:", p.cpu_percent()) 进程的CPU占用率: 0.0In [20]: print("进程的CPU亲和性:", p.cpu_affinity()) 进程的CPU亲和性: [0, 1]In [21]: print("进程的内存信息:", p.memory_info()) 进程的内存信息: pmem(rss=3133440, vms=166739968, shared=1622016, text=98304, lib=0, data=1937408, dirty=0)In [22]: print("进程的内存占用率:", p.memory_percent()) 进程的内存占用率: 0.1625874571746763In [23]: print("进程映射的内存区域:", p.memory_maps()) 进程映射的内存区域: [pmmap_grouped(path='/usr/bin/top', rss=94208, size=110592, pss=94208, shared_clean=0, shared_dirty=0, private_clean=81920, private_dirty=12288, referenced=94208, anonymous=12288, swap=0), ...]In [24]: print("进程的I/O信息:", p.io_counters()) 进程的I/O信息: pio(read_count=54669, write_count=2169, read_bytes=0, write_bytes=0, read_chars=7752773, write_chars=4272652)In [25]: print("进程打开的文件信息:", p.open_files()) 进程打开的文件信息: [popenfile(path='/proc/stat', fd=4, position=1250, mode='r', flags=32768), ...]In [26]: print("进程打开的套接字连接:", p.connections()) 进程打开的套接字连接: []In [27]: print("进程使用的线程数:", p.num_threads()) 进程使用的线程数: 1In [28]: print("进程打开的线程:", p.threads()) 进程打开的线程: [pthread(id=18449, user_time=0.74, system_time=1.31)]In [29]: print("进程执行的上下文切换数量:", p.num_ctx_switches()) 进程执行的上下文切换数量: pctxsw(voluntary=706, involuntary=676)In [30]: print("进程的优先级(带参数则可设置优先级):", p.nice()) 进程的优先级(带参数则可设置优先级): 0In [31]: print("进程的I/O优先级(带参数则可设置优先级):", p.ionice()) 进程的I/O优先级(带参数则可设置优先级): pionice(ioclass= <IOPriority.IOPRIO_CLASS_NONE: 0>, value=4)In [32]: print("进程的环境变量:", p.environ()) 进程的环境变量: {'XDG_SESSION_ID': '1348', 'HOSTNAME': 'localhost.localdomain', 'TERM': 'xterm', 'SHELL': '/bin/bash', 'HISTSIZE': '1000', 'SSH_CLIENT': '10.10.10.13 9858 22', 'SSH_TTY': '/dev/pts/1', 'LC_ALL': 'en_US', 'QT_GRAPHICSSYSTEM_CHECKED': '1', 'USER': 'root', ...}In [33]: print("进程信息(字典):", p.as_dict()) 进程信息(字典): {'memory_percent': 0.1625874571746763, 'cpu_times': pcputimes(user=0.74, system=1.31, children_user=0.0, children_system=0.0, iowait=0.0), ...}In [34]: print("进程是否正在运行:", p.is_running()) 进程是否正在运行: True
迭代查找指定属性进程
# 方法一:指定属性格式 In [35]: for p in psutil.process_iter(attrs=['pid', 'name']):...: if 'top' in p.info['name']:...: print(p.info)...: {'name': 'top', 'pid': 18449}# 方法二:万金流方法 In [36]: for p in psutil.process_iter(): ...: if 'top' == p.name(): ...: print(p.pid) ...: 18449
1.4.2 进程修改
- 操作
# 暂停挂起进程 p.suspend() # 恢复进程 p.resume()# 结束进程:正常结束并退出进程,包括依次结束子进程等 p.terminate() # 强制结束进程:暴力结束进程,不管子进程 p.kill()
二、网络嗅探器scapy
- 概述:使用scary可以发送、嗅探、剖析和伪造网络数据报,直接操作网络二三四层数据报
- 安装:
pip3 install scapy
2.1 命令行操作
- 显示scapy命令及配置
[root@localhost ~]# scapy # 显示支持的协议 >>> ls() # 显示支持的命令 >>> lsc() # 显示所有配置信息 >>> conf # 显示命令的帮助信息 >>> help(sniff) # 查看协议包含的参数 >>> ls(TCP) sport : ShortEnumField = ('20') dport : ShortEnumField = ('80') seq : IntField = ('0') ack : IntField = ('0') dataofs : BitField (4 bits) = ('None') reserved : BitField (3 bits) = ('0') flags : FlagsField = ('<Flag 2 (S)>') window : ShortField = ('8192') chksum : XShortField = ('None') urgptr : ShortField = ('0') options : TCPOptionsField = ("b''")
- 查询网卡信息
>>> show_interfaces() Source Index Name MAC IPv4 IPv6 sys 1 lo 00:00:00:00:00:00 127.0.0.1 ::1 sys 2 eth0 02:11:31:20:b7:70 192.168.1.110 fe80::3381:a2a6:492f:5757 sys 3 zttftqv4vg 8e:b2:2b:5b:34:4c 10.10.10.10 fe80::8cb2:3bff:fe2b:344c sys 4 br-4913d28cc615 02:42:c2:38:a8:2b 172.19.0.1 sys 5 br-4c5033b4000b 02:42:21:a8:68:1b 172.18.0.1 sys 6 docker0 02:42:22:22:ce:d3 172.17.0.1
- 获取路由表
# scapy内本机路由表(centos通过命令route -n查看) >>> conf.route Network Netmask Gateway Iface Output IP Metric 0.0.0.0 0.0.0.0 192.168.1.1 eth0 192.168.1.120 100 127.0.0.0 255.0.0.0 0.0.0.0 lo 127.0.0.1 1 192.168.1.0 255.255.255.0 0.0.0.0 eth0 192.168.1.120 100 # 增加路由(不会修改主机路由表,退出scapy也恢复主机路由表) >>> conf.route.add(net="192.168.2.0/24",gw="192.168.1.2") >>> conf.route Network Netmask Gateway Iface Output IP Metric 0.0.0.0 0.0.0.0 192.168.1.1 eth0 192.168.1.120 100 127.0.0.0 255.0.0.0 0.0.0.0 lo 127.0.0.1 1 192.168.1.0 255.255.255.0 0.0.0.0 eth0 192.168.1.120 100 192.168.2.0 255.255.255.0 192.168.1.2 eth0 192.168.1.120 1 # 删除路由:恢复原状(不会修改主机路由表) >>> conf.route.delt(net="192.168.2.0/24",gw="192.168.1.2")
2.2 数据报构造简介
2.2.1 按层构建数据报
- 代码示例
# 网络二层:链路层 >>> l2 = Ether() # 网络三层:网络层 IP协议 >>> l3 = IP(dst='192.168.1.1/30') # 网络四层:传输层 TCP协议,半开扫描(SYN)的办法,标识‘S’ >>> l4 = TCP(dport=22, flags = 'S') # 组合数据报:各层从下向上用/组合数据报,未写scapy自动补充 >>> packet = l2/l3/l4# 显示 层数据报 的报头信息 >>> l2.show() ###[ Ethernet ]### dst = ff:ff:ff:ff:ff:ffsrc = 02:11:32:20:b7:70type = LOOP>>> l3.show() ###[ IP ]### version = 4ihl = Nonetos = 0x0len = Noneid = 1flags = frag = 0ttl = 64proto = hopoptchksum = Nonesrc = 192.168.1.120dst = Net("192.168.1.1/30")\options \>>> l4.show() ###[ TCP ]### sport = ftp_datadport = sshseq = 0ack = 0dataofs = Nonereserved = 0flags = Swindow = 8192chksum = Noneurgptr = 0options = ''
2.2.2 发送数据报
- send发送(第三层网络层发送,不接收响应)
# 从第三层网络层发送一个数据报:若192.168.1.1/24,则每个ip发一个数据报 # 目标地址本机,发送一个icmp包,不接收响应数据包 # 每个点为一个数据报 >>> send(IP(dst="127.0.0.1")/ICMP()) . Sent 1 packets. --------------------------------------------------------------- # 目标地址本机80端口,发送10个tcp包,不接收响应数据包 >>> send(IP(dst='127.0.0.1')/TCP(dport=80, flags='S'), count=10) .......... Sent 10 packets. --------------------------------------------------------------- # 目标地址本机80端口,循环发送tcp包,不接收响应数据包,知道Ctrl+C退出 >>> send(IP(dst='127.0.0.1')/TCP(dport=80, flags='S'), loop=1) .......................^C Sent 22 packets.
功能:网络攻击用的,只负责发,不关心响应,目的为耗尽靶机网络资源
- sendp发送(第二层链路层发送,不接收响应)
# 用法同send():唯一区别在于从第二层链路层发送数据报 # TTL是IP数据包在计算机网络中可以转发的最大跳数,此处元组代表5,6,7 # iface:网卡名称 # inter:数据报发送间隔0.2秒 >>> sendp(Ether()/IP(dst="8.8.8.8",ttl=(5,7)), iface="eth0", inter=0.2) ... Sent 3 packets.
- sr发送(第三层网络层发送,接收响应)
# 第三层网络层发送数据包并接收响应 # sr函数返回:响应列表ans,未响应列表unans >>> ans,unans = sr(IP(dst="159.75.78.150")/TCP(dport=[21,22,23])) Begin emission: Finished sending 3 packets. .....*............^C Received 54 packets, got 1 answers, remaining 2 packets # 显示数据包简短的摘要 >>> ans.summary()IP / TCP 192.168.1.120:ftp_data > 159.75.78.150:ssh S ==> IP / TCP 159.75.78.150:ssh > 192.168.1.120:ftp_data SA / Padding>>> unans.summary()IP / TCP 192.168.1.120:ftp_data > 159.75.78.150:ftp SIP / TCP 192.168.1.120:ftp_data > 159.75.78.150:telnet S
- sr1发送(第三层网络层发送,接收且仅接收第一个响应)
>>> p=sr1(IP(dst="www.baidu.com")/ICMP()) Begin emission: Finished sending 1 packets. ...* Received 4 packets, got 1 answers, remaining 0 packets >>> p.summary() 'IP / ICMP 183.232.231.174 > 192.168.1.120 echo-reply 0 / Padding'
- srloop发送(循环发送,随发随显)
>>> srloop(IP(dst='192.168.1.102')/ICMP()) RECV 1: IP / ICMP 192.168.1.102 > 192.168.1.120 echo-reply 0 / Padding RECV 1: IP / ICMP 192.168.1.102 > 192.168.1.120 echo-reply 0 / Padding ^C Sent 10 packets, received 10 packets. 100.0% hits. (<Results: TCP:0 UDP:0 ICMP:10 Other:0>, <PacketList: TCP:0 UDP:0 ICMP:0 Other:0>)
2.3 ARP扫描网段存活主机
- scan_pc.py
#!/usr/bin/python3 # -*- coding=utf-8 -*-# 局域网主机扫描器 使用ARP扫描 from scapy.all import * from scapy.layers.l2 import Ether, ARPdef arp_scan(ifname, network):# 构造数据包:Ether()层可以省略构造内容,此为默认值,可写上加快速度p = Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(pdst=network) / "text"# srp()用于第二层链路层发送和接收数据包:arp# 数据包发送后:ans有响应主机,unans没有响应主机,五秒后统计结果ans, unans = srp(p, iface=ifname, timeout=5, verbose=False)print("共扫描{}个主机,{}个主机响应".format(len(unans), len(ans)))result = []# ans是元组的形式,可以测试ans[0],发现结果是元组的形式for s, r in ans:# 把目标的IP以及MAC地址加入到新的列表result.append([r[ARP].psrc, r[ARP].hwsrc]) result.sort() # 对列表进行排序# 遍历列表,打印ip以及对应的mac地址for ip, mac in result:print("{}--->{}".format(ip, mac))if __name__ == '__main__':print(show_interfaces())print("若报错OSError,请从上面选择相应网段的网卡名回填程序eth_name变量")eth_name = "Realtek PCIe GbE Family Controller"arp_scan(eth_name, '192.168.1.0/24')
- 运行:
python3 scan_pc.py
测试指定PC是否存活:
python3 main.py | grep 192.168.1.134
- 返回
Source Index Name MAC IPv4 libpcap 16 Realtek PCIe GbE Family Controller 1c:2b:0d:3d:48:52 192.168.1.102 若报错OSError,请从上面选择相应网段的网卡名回填程序eth_name变量 共扫描171个主机,85个主机响应 192.168.1.1--->f2:2c:23:bf:02:82 192.168.1.102--->1c:1b:1d:1d:18:12 192.168.1.107--->3c:3d:3b:38:3a:38
三、使用python-nmap
3.1 nmap命令
- 概述:主要用于扫描,安装
yum install nmap
,以下在centos下测试 - 扫描1000个常用端口
# SYN扫描,使用最频繁,安全,快 >>> nmap -sS 192.168.1.102 # 扫描指定端口:nmap -sS 192.168.1.102 -p 80,443Starting Nmap 6.40 ( http://nmap.org ) at 2022-06-17 10:05 CST Nmap scan report for 192.168.1.102 Host is up (0.00032s latency). Not shown: 995 closed ports PORT STATE SERVICE 135/tcp open msrpc 139/tcp open netbios-ssn 445/tcp open microsoft-ds 1026/tcp open LSA-or-nterm 2179/tcp open vmrdp MAC Address: 1C:1B:0D:3D:88:11 (Unknown)Nmap done: 1 IP address (1 host up) scanned in 1.69 seconds
- ping方式检测局域网主机
# 不进行端口扫描:会发送四种报文确定目标是否存活 >>> nmap -sn 192.168.1.0/24Starting Nmap 6.40 ( http://nmap.org ) at 2022-06-17 10:10 CST Nmap scan report for 192.168.1.1 Host is up (0.00049s latency). MAC Address: F8:8C:21:BF:01:81 (Unknown) Nmap scan report for 192.168.1.6 Host is up (0.00054s latency). MAC Address: F4:B5:20:14:45:1F (Unknown) Nmap scan report for 192.168.1.7 Host is up (0.00081s latency). MAC Address: 48:4D:7E:C1:62:A0 (Unknown) ... Nmap done: 256 IP addresses (93 hosts up) scanned in 7.67 seconds
3.2 python-nmap
- 概述:封装nmap命令,安装
pip3 install python-nmap
(需先安装nmap命令) - 单语句结果测试
In [1]: import nmap # 构造PortScanner对象 In [2]: nm = nmap.PortScanner() # scan( host , port , args ) 方法:以指定方式扫描指定主机或网段的指定端口 # 返回结果字典汇总信息: # ip写法:192.168.1.1-50 或 192.168.1.1/24,默认127.0.0.1 # 端口写法:22,80,443 或 22-80 或 22-80,443,默认None # arguments:默认-sV,其他同nmap # 其余参数:sudo=False, timeout=0 In [3]: nm.scan('192.168.1.120', '1-1000') Out[3]: {'nmap': {'command_line': 'nmap -oX - -p 1-1000 -sV 192.168.1.120','scaninfo': {'tcp': {'method': 'syn', 'services': '1-1000'}},'scanstats': {'timestr': 'Fri Jun 17 10:20:26 2022','elapsed': '89.73','uphosts': '1','downhosts': '1','totalhosts': '2'}},'scan': {'192.168.1.120': {'hostnames': [{'name': '', 'type': ''}],'addresses': {'ipv4': '192.168.1.120'},'vendor': {},'status': {'state': 'up', 'reason': 'localhost-response'},'tcp': {22: {'state': 'open','reason': 'syn-ack','name': 'ssh','product': 'OpenSSH','version': '7.4','extrainfo': 'protocol 2.0','conf': '10','cpe': 'cpe:/a:openbsd:openssh:7.4'},80: {'state': 'filtered','reason': 'no-response','name': 'http','product': '','version': '','extrainfo': '','conf': '3','cpe': ''},111: {'state': 'open','reason': 'syn-ack','name': 'rpcbind','product': '','version': '2-4','extrainfo': 'RPC #100000','conf': '10','cpe': ''}}}}}# 返回scan语句翻译成nmap命令的写法 In [4]: nm.command_line() Out[4]: 'nmap -oX - -p 1-1000 -sV 192.168.1.120,110'# 返回nmap扫描参数信息:格式为字典类型 In [5]: nm.scaninfo() Out[5]: {'tcp': {'method': 'syn', 'services': '1-1000'}}# 获取存活主机列表 In [6]: nm.all_hosts() Out[6]: ['192.168.1.120']# 返回被扫描主机状态:判断是否存活 In [7]: nm['192.168.1.120'].state() Out[7]: 'up'# 返回被扫描主机所有打开端口支持的协议列表 In [8]: nm['192.168.1.120'].all_protocols() Out[8]: ['tcp']# 返回被扫描主机tcp协议字典里的键 In [9]: nm['192.168.1.120']['tcp'].keys() Out[9]: dict_keys([22, 80, 111])# 返回被扫描主机tcp协议打开的端口80的详细信息 In [10]: nm['192.168.1.120']['tcp'][80] Out[10]: {'state': 'filtered','reason': 'no-response','name': 'http','product': '','version': '','extrainfo': '','conf': '3','cpe': ''}# 复杂nmap参数写法:参照nmap命令 In [11]: nm.scan(hosts='192.168.1.0/24', arguments='-n -sP -PE -PA21,23,80,3389') '192.168.1.38': {'hostnames': [{'name': '', 'type': ''}], 'addresses': {'ipv4': '192.168.1.38', 'mac': '08:00:37:FB:76:49'}, 'vendor': {'08:00:37:FB:76:49': 'Fuji-xerox CO.'}, 'status': {'state': 'up', 'reason': 'arp-response'}},
- 扫描局域网存活主机
import nmapnm = nmap.PortScanner() nm.scan(hosts = '192.168.1.0/24', arguments='-n -sP -PE') up_hosts = nm.all_hosts() for i in up_hosts:print(up_hosts)# 打印输出 >>> 192.168.1.80 >>> 192.168.1.81
- 扫描单个主机打开端口
import nmapnm = nmap.PortScanner() nm.scan('127.0.0.1', '22-80,443')# 获取所有tcp协议的端口 ports_tcp = nm['127.0.0.1'].all_tcp() print(ports_tcp ) # 打印输出 >>> [22, 80] # 按协议输出:协议名nm['127.0.0.1'].all_protocols()获取 for i in nm['127.0.0.1']['tcp'].keys():print(i) # 打印输出 >>> 22 >>> 80
其他信息参见本节:单语句结果测试
回到总目录
Python运维(六)--系统监控psutil、数据报scapy、扫描nmap相关推荐
- linux系统运维指南 pdf_linux运维:系统监控命令实践
内存监控 vmstat 命令 该命令可以实时动态监测系统虚拟内存.进程.CPU的活动,默认情况首先需要安装sysstat软件包,可以用命令安装. [root@dujm0 ~]# yum install ...
- linux下进程监控6,系统运维|Linux系统监控神器-Collectl
系统资源监控 为使系统良好运转,Linux系统管理员经常需要监测cpu,内存,磁盘,网络等系统信息.Linux上已有iotop,top,free,htop,sar等丰富的常规工具来实现监测功能.今天让 ...
- cdt规约报文用程序解析_用Python运维网络(5):scapy
本文参考了文章: 弈心:网络工程师的Python之路---Scapy基础篇zhuanlan.zhihu.com 弈心:网络工程师的Python之路---Scapy应用篇zhuanlan.zhihu ...
- python运维看什么书_学习Python在Linux运维上的应用应该看哪些书 什么样的学习路线...
匿名用户 1级 2017-08-02 回答 Python岗位有哪些呢?主要的岗位有这些: Python全栈开发工程师(10k-20K) Python运维开发工程师(15k-20K) Python高级开 ...
- python运维系统开发_Python系统运维开发实战
课程主题: Python 高级运维开发实战 课程讲师: Alex 老师, triaquae python 开源运维管理软件创始人,知名 IT 公司运维开发架构师 课程安排: 每周六一天全天(早 9:0 ...
- 运维想吃透监控系统,就这一篇足够了
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:51CTO技术栈 ID:blog51cto 作者:崔皓 &q ...
- python运维模块_Python 运维常用模块
基础库:sys.os(os.path.os.stat).time.logging.prarmiko.re.random Python运维常用的20个库 1.psutil是一个跨平台库(https:// ...
- python程序员需要掌握哪些技术-python运维要掌握哪些内容
python运维需要会什么 随着移动互联网的普及,服务器运维所面临的挑战也随之越来越大.当规模增长到一定程度,手动管理方式已经无法应对,自动化运维成为解决问题的银弹. Python凭借其灵活性,在自动 ...
- python运维是做什么的_Python运维工程师主要干什么?
Python运维工程师主要干什么? 更新时间:2020年05月09日 作者:spoto 广义运维工程师的职责介绍 Python运维工程师主要干什么?其实无论是做什么运维,运维工程师最基本的职责都是负责 ...
- python职能-python运维工程师主要干什么
很多人可能并没有听说过python运维工程师,只知道运维工程师或者是linux运维工程师这两个词.实际上python运维工程师这个岗位也是最近几年随云计算计算发展和广泛普及而火的,所以大家不知道pyt ...
最新文章
- Python 标准库之 time
- android layerlist bitmap,android – 在LayerListDrawable中更改Bitmap Drawable
- 第二阶段冲刺第六天(6月5号)
- Javaweb监听器(2)
- python 均方误差_一个很随意的Python智能优化库,一个文件就是一个库-- PySwarm
- spring-mybatis.xml 访问html5,Spring mvc无xml配置及利用JdbcTemplate访问数据库
- NLTK的图形化语料文本下载器downloader
- 原生JS写Ajax的请求函数
- 《代码敲不队》第九次团队作业:Beta冲刺第1天
- 消息称苹果关联公司1.25亿美元购买车辆测试场 占地超过3万亩
- 徐州工程学院计算机报名,2019年3月江苏徐州工程学院计算机等级考试报名时间...
- java 解析excle
- 真奇怪:我机器上的freeswitch无法绑定端口了
- python写刷课脚本_python opencv 知到 刷课 脚本
- SQL Server 2008 修改安装路径
- robo 3t 查询
- Python 批量推送微信公众号模板消息
- canvas 擦除动画_HTML5 实现橡皮擦的擦除效果
- 阿里云ECS服务器很多台共用一个公网ip吗?
- 微应用 qiankun 项目搭建