问题:1 感谢有人可以进一步建议我。我想使用 python 脚本和 netmiko 模块 ssh 到我的设备。我通过 api 请求获取 ssh 详细信息(json 文件),并使用这些数据来运行脚本。但是我在下面收到错误。我希望有人能给我建议并为我指明道路。
我错过了一些东西,但我不知道如何解决它。请纠正并引导我。谢谢。
json 文件按照下面的代码片段创建;
response = requests.post(url,data=data,headers=headers,verify=False)
dictionary_info = response.json()
with open('devices.json', 'w') as fp:
json.dump(dictionary_info, fp, indent=4, sort_keys=True)
devices.json文件如下;
{
"device": [
{
"login": "test1",
"ip": "10.10.10.1",
"password": "test1",
"device_type": "cisco_ios"
},
{
"login": "test1",
"ip": "10.10.10.2",
"password": "test1",
"device_type": "cisco_ios"
},
{
"login": "test1",
"ip": "10.10.10.3",
"password": "test1",
"device_type": "cisco_ios"
},
{
"login": "test1",
"ip": "10.10.10.4",
"password": "test1",
"device_type": "cisco_ios"
}
],
"status": "SUCCESS"
}
当我运行下面的脚本(片段)时,它将返回下面的错误
File "devices.py", line 18, in <module>
print('Connecting to device:',device['ip'])
TypeError: string indices must be integers
for device in devices:
try:
print('~' * 79)
print('Connecting to device:',device['ip'])
connection = netmiko.ConnectHandler(**device)
print(connection.send_command('show interface'))
connection.disconnect()
except netmiko_exceptions as e:
print('Failed to ', device['ip'], e)
我应该能够根据 json 文件提供的 ssh 详细信息运行脚本和 ssh 到每个设备。不知何故,代码需要进一步修改,只是我不知道如何修改。请帮助我。谢谢
<小时/>我编辑 devices.json 的内容..我删除了大括号 {}、对象名称“device”和“status”,只保留列表[],如下所示;
[
{
"username": "scnpa",
"ip": "10.10.10.1",
"password": "123",
"device_type": "cisco_ios"
},
{
"username": "scnpa",
"ip": "10.10.10.2",
"password": "123",
"device_type": "cisco_ios"
},
{
"username": "scnpa",
"ip": "10.10.10.3",
"password": "123",
"device_type": "cisco_ios"
},
{
"username": "scnpa",
"ip": "10.10.10.4",
"password": "123",
"device_type": "cisco_ios"
}
]
今天,我只是尝试了 n 个错误...然后运行脚本,它就可以工作了...使用上面的可编辑 json 文件...我知道这不是最终的解决方案,我将获得我之前共享的 json 文件(用大括号 {} 等)或者有没有办法,我可以得到像上面的格式 [{},{},{},{}]?从 json api 响应创建文件并仅获取 {{},{}.{},{}] 内容...?
或保持原样格式...
也许需要修改Python脚本的for循环部分。我尝试删除设备,但收到不同的错误。将“设备”更改为其他名称,但仍然出现错误“类型错误:字符串索引必须是整数”。 不知道...
for device in devices:
try:
print('~' * 79)
print('Connecting to device:',device['ip'])
connection = netmiko.ConnectHandler(**device)
print(connection.send_command('show interface'))
connection.disconnect()
<小时/>
<小时/>
问题:2 我创建单独的帖子
我还有一个关于从 API 读取响应 json 文件(字符串)查询的问题。例如json响应如下
{
"status": "SUCCESS",
"device": [
{
"model":"XXXX-A",
"username": "scnpa1",
"ip": "10.10.10.1",
"password": "123",
"device_type": "cisco_ios"
},
{
"model":"XXXX-A",
"username": "scnpa2",
"ip": "10.10.10.2",
"password": "456",
"device_type": "cisco_ios"
}
]
}
如何确保只有特定的键/值(例如名称和密码),并能够将文件打印和创建为 json 文件(列表),该文件可以由 python 脚本读取为输入。预计会像下面这样
{
"status": "SUCCESS",
"device": [
{
"username": "scnpa1",
"ip": "10.10.10.1",
"password": "123"
},
{
"username": "scnpa2",
"ip": "10.10.10.2",
"password": "456"
}
]
}
我使用下面的代码,但它将创建包含所有参数的 json 文件
response = requests.post(url,data=data,headers=headers,verify=False)
dictionary_info = response.json()
with open('devices.json', 'w') as fp:
json.dump(dictionary_info, fp, indent=4, sort_keys=True)
请给我建议。谢谢
最佳答案
您应该将循环更改为
for device in devices['mydevice']:
关于python - 如何从python脚本读取json文件中的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54106599/