使用 Python 创建 UNIX 命令行工具
2008-05-31 12:48:48 来源:WEB开发网子流程 arping
import subprocess
import re
def arping(ipaddress="10.0.1.1"):
"""Arping function takes IP Address or Network, returns nested mac/ip list"""
#Assuming use of arping on Red Hat Linux
p = subprocess.Popen("/usr/sbin/arping -c 2 %s" % ipaddress, shell=True,
stdout=subprocess.PIPE)
out = p.stdout.read()
result = out.split()
pattern = re.compile(":")
for item in result:
if re.search(pattern, item):
print item
arping()
以下是该函数单独运行时的输出: [root@localhost]~# python pyarp.py [00:16:CB:C3:B4:10]
请注意使用 subprocess 来获取 arping 命令的输出,以及使用已编译的正则表达式匹配 MAC 地址。注意,如果您使用的是 Python 2.3,则可以使用 popen 模块替换 subprocess,后者在 Python 2.4 或更高版本中提供。
在命令行工具中使用对象关系映射器,如配合 SQLite 使用的 SQLAlchemy 或 Storm
命令行工具的另一个可能选项是使用 ORM(对象关系映射器)来存储由命令行工具生成的数据记录。有相当多的 ORM 可用于 Python,但 SQLAlchemy 和 Storm 恰好是最常用的两个。我通过掷硬币的方式决定使用 Storm 作为示例:
Storm ORM arping
#!/usr/bin/env python
import optparse
from storm.locals import *
from scapy import srp,Ether,ARP,conf
class NetworkRecord(object):
__storm_table__ = "networkrecord"
id = Int(primary=True)
ip = RawStr()
mac = RawStr()
hostname = RawStr()
def arping(iprange="10.0.1.0/24"):
"""Arping function takes IP Address or Network,
returns nested mac/ip list"""
conf.verb=0
ans,unans=srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=iprange),
timeout=2)
collection = []
for snd, rcv in ans:
result = rcv.sprintf(r"%ARP.psrc% %Ether.src%").split()
collection.append(result)
return collection
def main():
"""Runs program and handles command line options"""
p = optparse.OptionParser()
p = optparse.OptionParser(description='Finds MACAddr of IP address(es)',
prog='pyarping',
version='pyarping 0.1',
usage= '%prog [10.0.1.1 or 10.0.1.0/24]')
options, arguments = p.parse_args()
if len(arguments) == 1:
database = create_database("sqlite:")
store = Store(database)
store.execute("CREATE TABLE networkrecord "
"(id INTEGER PRIMARY KEY, ip VARCHAR,
mac VARCHAR, hostname VARCHAR)")
values = arping(iprange=arguments)
machine = NetworkRecord()
store.add(machine)
#Creates Records
for ip, mac in values:
machine.mac = mac
machine.ip = ip
#Flushes to database
store.flush()
#Prints Record
print "Record Number: %r" % machine.id
print "MAC Address: %r" % machine.mac
print "IP Address: %r" % machine.ip
else:
p.print_help()
if __name__ == '__main__':
main()
更多精彩
赞助商链接