我对 Python 有点陌生,并尝试使用 Python 脚本在 csv 列表中的所有网络设备上运行。成功验证的设备给我输出没有问题,但很少有设备抛出一些无效的信用错误,我们如何处理这种类型的错误...?
file_csv = open('device_csv_test.txt','r')
lines = file_csv.readlines()
file_csv.close()
lines_ = [line.strip() for line in lines[1:]]
# create list of IPs that we need to pull uptime
device_ip_list =[]
for line in lines_:
device_data = line.split("\t")
device_name = device_data[0]
device_ip = device_data[1]
device_ip_list.append(device_ip)
# function that gets system_info details
def system_info(ip):
urllib3.disable_warnings()
try:
fw = firewall.Firewall(ip, username, password)
except ValueError:
print(f"{device_name} is no longer accessible OR might have invalid cred")
else:
system_info = fw.op ("show system info", xml=True ) # without xml=True, it is going to return object only , but with xml=True arg, it is return a string with xml data
system_info_json = xmltodict.parse(system_info)
uptime = system_info_json["response"]["result"]["system"]["uptime"]
device_name = system_info_json["response"]["result"]["system"]["hostname"]
dict_ = [{'device_name':device_name ,'uptime': uptime}]
writer.writerows(dict_)
# writer.writerows([elm.values() for elm in dict_]) # parse value of dict
# write parsed data (hostname , uptime) into CSV file
start_time = timeit.default_timer()
with open ("new_csv.csv","w") as f:
writer = csv.DictWriter(f, fieldnames= ['device_name','uptime']) # create header
writer.writeheader() # write header in csv
# writer = csv.writer(f) t
# f.write('hostname,uptime\n')
for ips in device_ip_list:
system_info(ips)
end_time = timeit.default_timer()
print(f"total time = {end_time - start_time}")
它生成以下错误:
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/admin/palo_nat/lib/python3.11/site-packages/panos/base.py", line 3878, in method
super_method(self, *args, **kwargs)
File "/home/admin/palo_nat/lib/python3.11/site-packages/pan/xapi.py", line 637, in keygen
raise PanXapiError(self.status_detail)
pan.xapi.PanXapiError: URLError: code: 403 reason: Invalid Credential
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/admin/palo_uptime_test.py", line 70, in <module>
system_info(ips)
File "/home/admin/palo_uptime_test.py", line 53, in system_info
system_info = fw.op ("show system info", xml=True ) # without xml=True, it is going to return object only , but with xml=True arg, it is return a string with xml data
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/admin/palo_nat/lib/python3.11/site-packages/panos/firewall.py", line 242, in op
return super(Firewall, self).op(
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/admin/palo_nat/lib/python3.11/site-packages/panos/base.py", line 4047, in op
element = self.xapi.op(cmd, vsys, False, extra_qs, retry_on_peer=retry_on_peer)
^^^^^^^^^
File "/home/admin/palo_nat/lib/python3.11/site-packages/panos/base.py", line 4000, in xapi
self._xapi_private = self.generate_xapi()
^^^^^^^^^^^^^^^^^^^^
File "/home/admin/palo_nat/lib/python3.11/site-packages/panos/firewall.py", line 255, in generate_xapi
return super(Firewall, self).generate_xapi()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/admin/palo_nat/lib/python3.11/site-packages/panos/base.py", line 4072, in generate_xapi
"api_key": self.api_key,
^^^^^^^^^^^^
File "/home/admin/palo_nat/lib/python3.11/site-packages/panos/base.py", line 3994, in api_key
self._api_key = self._retrieve_api_key()
^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/admin/palo_nat/lib/python3.11/site-packages/panos/base.py", line 4159, in _retrieve_api_key
xapi.keygen(retry_on_peer=False)
File "/home/admin/palo_nat/lib/python3.11/site-packages/panos/base.py", line 3897, in method
raise the_exception
panos.errors.PanURLError: URLError: code: 403 reason: Invalid Credential
感谢您的帮助...!!
寻找正确的异常来处理发布的错误。
从错误输出中,您收到
403
错误:
pan.xapi.PanXapiError: URLError: code: 403 reason: Invalid Credential
这意味着 您输入的某些 IP+用户名+密码组合(csv 中的行)不正确。
正如您所提到的,您的脚本确实适用于您登录的某些设备,但不适用于其他设备。鉴于这些信息,很明显脚本可能不是问题所在,但您的 IP+用户名+密码组合对于您收到此 403 错误的用户来说是不正确的。
调试技巧:
tab
(\t
) 分隔符拆分行,因此请确保从 csv 解析的值中没有其他空白字符。请注意,像在开头那样调用 line.strip()
只会删除前导和尾随空格,即行首和行尾的空格。您可以轻松地使用文本编辑器进行检查,该编辑器可以显示空格并在其位置显示符号。例如,如果您的 csv 行看起来像 x.x.x.x\tusername\s\tpassword\n
,则
\s
之后和将其与
username
分开的制表符 (
\t
) 之前的空格 (
password
) 字符将使您解析的用户名:
username\s