使用 SSH 命令在 python 中生成字典
Generate dictionary in python with SSH command
我有一个 python 脚本执行以下故事情节:
首先检查所有不需要VPN
连接的IPS
,通过SSH
和运行CAT
命令连接
然后检查每个需要VPN
的人,连接到VPN
,SSH
到运行 CAT
命令
这部分功能正常,我的问题是将此 ssh 的输出分配给 python 字典
#!/usr/bin/python
# -*- coding: utf-8 -*-
from datetime import datetime, date, time, timedelta
import socket
import socks
import paramiko
import sys
import re
# create script head
print ('-----------------------------------------------------------------------------------------')
print ('Initializing UP/DOWN script in: '+str(date.today()))
print ('-----------------------------------------------------------------------------------------')
Ips = {'123.45.44.33': {'customer' : 'webservice'}}
IPsocks = {'176.25.0.61': {'customer' : 'hosting'}}
output = []
outputSocks = []
outfinally = []
outfinallySocks = []
lds_data = {}
for ip in Ips:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=ip, username='admin', password="admin")
output.append((ssh.exec_command('cat /tmp/hosts.txt')[1]).read().decode())
ssh.close()
outfinally.append([re.split(r'\s*#\s*',line) for line in output[0].splitlines()])
for a, b in zip(Ips, outfinally):
lds_data.update({b[:1] : {'hostname' : b[1:5], 'customer' : Ips[a]['customer']}})
for ip in IPsocks:
sock=socks.socksocket()
sock.set_proxy(
proxy_type=socks.SOCKS5,
addr='10.0.1.10',
port=1080,
username="vpn",
password="vpn102030"
)
sock.connect((ip, 22))
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('ignored without host key verification', username='admin', password='admin', sock=sock)
outputSocks.append((ssh.exec_command('cat /tmp/hosts.txt')[1]).read().decode())
ssh.close()
outfinallySocks.append([re.split(r'\s*#\s*',line) for line in outputSocks[0].splitlines()])
for a, b in zip(IPsocks, outfinallySocks):
lds_data.update({b[:1] : {'hostname' : b[1:5], 'customer' : IPsocks[a]['customer']}})
print(lds_data)
print ('-----------------------------------------------------------------------------------------')
print ('Script successfully completed')
print ('-----------------------------------------------------------------------------------------')
输出
File "SCRIPT.py", line 36, in <module>
lds_data.update({tuple(b[:1]) : {'hostname' : b[1:5], 'customer' : Ips[a]['customer']}})
TypeError: unhashable type: 'list'
归档主机
192.168.0.1 #SRVNET
192.168.0.254 #SRVDATA
192.168.0.254 #SRVDATA
这很难重现,但是假设 b
是一个列表的列表,我们可以替换这一行的实例:
lds_data.update({b[:1] : {'hostname' : b[1:5], 'customer' : IPsocks[a]['customer']}})
有了这个:
lds_data.update({tuple(b[0]) : {'hostname' : b[1:5], 'customer' : Ips[a]['customer']}})
这用扁平元组替换了列表列表 - 这是因为字典中的键不能是列表,因为它们是可变的。您的代码的潜在问题是您试图将字典键设置为列表。
我有一个 python 脚本执行以下故事情节:
首先检查所有不需要
VPN
连接的IPS
,通过SSH
和运行CAT
命令连接然后检查每个需要
VPN
的人,连接到VPN
,SSH
到运行CAT
命令
这部分功能正常,我的问题是将此 ssh 的输出分配给 python 字典
#!/usr/bin/python
# -*- coding: utf-8 -*-
from datetime import datetime, date, time, timedelta
import socket
import socks
import paramiko
import sys
import re
# create script head
print ('-----------------------------------------------------------------------------------------')
print ('Initializing UP/DOWN script in: '+str(date.today()))
print ('-----------------------------------------------------------------------------------------')
Ips = {'123.45.44.33': {'customer' : 'webservice'}}
IPsocks = {'176.25.0.61': {'customer' : 'hosting'}}
output = []
outputSocks = []
outfinally = []
outfinallySocks = []
lds_data = {}
for ip in Ips:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=ip, username='admin', password="admin")
output.append((ssh.exec_command('cat /tmp/hosts.txt')[1]).read().decode())
ssh.close()
outfinally.append([re.split(r'\s*#\s*',line) for line in output[0].splitlines()])
for a, b in zip(Ips, outfinally):
lds_data.update({b[:1] : {'hostname' : b[1:5], 'customer' : Ips[a]['customer']}})
for ip in IPsocks:
sock=socks.socksocket()
sock.set_proxy(
proxy_type=socks.SOCKS5,
addr='10.0.1.10',
port=1080,
username="vpn",
password="vpn102030"
)
sock.connect((ip, 22))
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('ignored without host key verification', username='admin', password='admin', sock=sock)
outputSocks.append((ssh.exec_command('cat /tmp/hosts.txt')[1]).read().decode())
ssh.close()
outfinallySocks.append([re.split(r'\s*#\s*',line) for line in outputSocks[0].splitlines()])
for a, b in zip(IPsocks, outfinallySocks):
lds_data.update({b[:1] : {'hostname' : b[1:5], 'customer' : IPsocks[a]['customer']}})
print(lds_data)
print ('-----------------------------------------------------------------------------------------')
print ('Script successfully completed')
print ('-----------------------------------------------------------------------------------------')
输出
File "SCRIPT.py", line 36, in <module>
lds_data.update({tuple(b[:1]) : {'hostname' : b[1:5], 'customer' : Ips[a]['customer']}})
TypeError: unhashable type: 'list'
归档主机
192.168.0.1 #SRVNET
192.168.0.254 #SRVDATA
192.168.0.254 #SRVDATA
这很难重现,但是假设 b
是一个列表的列表,我们可以替换这一行的实例:
lds_data.update({b[:1] : {'hostname' : b[1:5], 'customer' : IPsocks[a]['customer']}})
有了这个:
lds_data.update({tuple(b[0]) : {'hostname' : b[1:5], 'customer' : Ips[a]['customer']}})
这用扁平元组替换了列表列表 - 这是因为字典中的键不能是列表,因为它们是可变的。您的代码的潜在问题是您试图将字典键设置为列表。