使用 SSH 命令在 python 中生成字典

Posted

技术标签:

【中文标题】使用 SSH 命令在 python 中生成字典【英文标题】:Generate dictionary in python with SSH command 【发布时间】:2019-12-03 14:24:39 【问题描述】:

我有一个执行以下故事情节的 python 脚本:

首先检查所有不需要***连接的IPS,通过SSH连接并运行CAT命令

然后检查需要***的每个人,连接到***,并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="***",
        password="***102030"
    )
    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

【问题讨论】:

【参考方案1】:

这很难复现,但假设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'])

这用扁平元组替换列表列表 - 这是因为字典中的键不能是列表,因为它们是可变的。您的代码的根本问题是您试图将字典键设置为列表。

【讨论】:

以上是关于使用 SSH 命令在 python 中生成字典的主要内容,如果未能解决你的问题,请参考以下文章

如何在字典中生成所有可能的组合

如何在macOS上的一行中生成并复制SSH密钥?

在 git bash 中生成 SSH 密钥,我无法获取 git 代理

proto 文件,在 python 中生成代码并运行

在ios中生成imageview后如何设置图像?

Python如何调用yaml文件中的参数来执行ssh命令