我一直在研究这个脚本,用于在思科交换机上定位工作站的交换机端口。我被困在这几个小时,并到处寻找一些帮助。我知道当一个正则表达式需要一个字符串'通常我在列表中调用的错误。但是对于我的生活,我无法找到我做到的地方。任何帮助将不胜感激。感谢。
有问题的代码:
def check_ping(data = None):
ping_result = re.findall(r'!!!!!', data)
return ping_result
错误
Traceback (most recent call last):
File "IPtracetest.py", line 97, in <module>
ping_results = check_ping(data)
File "IPtracetest.py", line 25, in check_ping
ping_results = re.findall( r'!!!!!', data )
File "C:\Python27\lib\re.py", line 181, in findall
return _compile(pattern, flags).findall(string)
TypeError: expected string or buffer
P:\Python\Scripts>
如果需要更多上下文,则需要整个脚本
# get the user credentials
def get_credentials():
username = raw_input('Enter your secondary LANID: ')
password = getpass.getpass('Enter password for user %s: ' % username)
return username, password
def get_ip():
return raw_input('\nEnter IP address of device you which to trace: ')
def get_ping():
ping = "ping " + ip
return ping
def check_ping(data = None):
ping_result = re.findall(r'!!!!!', data)
return ping_result
def get_ping_results(ping_results, ip ):
if ping_results is '!!!!!' :
trace = 'PING OK. Device is accessible'
else:
trace = 'Device is currently off the network!'
return trace
def get_gateways(data):
gateways = re.findall(r'[0-9]+(?:\.[0-9]+){3}', data )
return gateways
def get_gateway(gateway_results):
gateway = gateway_results[-2]
return gateway
def get_mac(data):
mac = re.findall(r'[0-9a-f]+(?:\.[0-9a-f]+){2}', data )
mac = mac[-1]
return mac
def get_access_switch(data):
pattern = r'cs\d+\-\d+\w'
access_switch = re.findall(pattern, data)
return access_switch[0] #--- could return the index value, that should give you a string to pass off to the host
#def get_end_switch(data):
# print data
# pattern = r'cs\d+\-\d+\w*'
# end_switch = re.findall(pattern, data)
# return end_switch
def get_end_switch(data):
#print data
#pattern = r'cs\d+\-\d+\w*'
end_switch = re.findall(r'[c][s][0-9][0-9][0-9][?:\-][\w][\w]', data)
return end_switch[-2]
def get_port(data):
pattern = r'[GF][ai]\d[\d|\/]*'
port = re.findall(pattern, data)
return port[0]
def connect_to_device(username, password, host, command):
try:
print '.... connecting'
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username=username, password=password)
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
chan = ssh.invoke_shell()
chan.send(command + ('\r'))
time.sleep(.5)
data = chan.recv(9999)
return data
except:
print "\n\n **** Unable to connect. Check password, device may be down, or IP not in ARP table ****\n\n"
# ______________________________________MAIN______________________________________#
if __name__ == "__main__":
data = 0
#print '\nEnter an IP address at a location and you will get the end point switch and port: \n'
username, password = get_credentials()
ip = get_ip()
ping = get_ping()
data = connect_to_device(username, password, 'mls319-2c', ping)
ping_results = check_ping(data)
trace = get_ping_results(ping_results, ip)
if trace is 'PING OK. Device is accessible':
data = connect_to_device(username, password, 'mls319-2c', 'traceroute ' + ip)
gateway_results = get_gateways(data)
gateway = get_gateway(gateway_results)
data = connect_to_device(username, password, gateway, 'sh ip arp | i ' + ip)
mac = get_mac(data)
data = connect_to_device(username, password, gateway, 'sh cdp nei' )
access_switch = get_access_switch(data)
#end_host, end_port = trace_mac(username, password, access_switch, mac)
data = connect_to_device(username, password, access_switch, 'trace mac ' + mac + ' ' + mac)
end_switch = get_end_switch(data)
port = get_port(data)
print '\nRouter IP is ', gateway
print '\nMAC address is ', mac
print '\nThe end switch is ', end_switch
print '\nThe port is ', port
答案 0 :(得分:3)
re.findall的输入必须是字符串:
>>> import re
>>> re.findall("\w+", None)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\re.py", line 181, in findall
return _compile(pattern, flags).findall(string)
TypeError: expected string or buffer
可能你可以试试这个:
def check_ping(data = None):
if data:
ping_result = re.findall(r'!!!!!', data)
return ping_result
答案 1 :(得分:0)
这里的数据参数可能是None,你能处理那个案例吗?
def check_ping(data = None):
if data is None:
return
ping_result = re.findall(r'!!!!!', data)
return ping_result