【问题标题】:Python3: Substitute variable in paramiko connectPython3:paramiko connect中的替代变量
【发布时间】:2018-10-11 04:27:23
【问题描述】:

通过使用 iter(),我从 json 文件中获取主机名。我正在尝试通过函数调用将主机名转发到 paramiko connect、exec_command 方法。

但是在将主机名替换为变量时,连接方法将其视为主机名而不是变量。

如何在 paramiko connect 中替换变量?

import paramiko,json
def exec_commands(host_data):
 host_data = host_data
 new_client=paramiko.SSHClient()
 new_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
 new_client.connect(host_data,username='root',password='password',port=22,timeout=60)
 stdin, stdout, stderr = new_client.exec_command('uptime')
 for i in stdout:
    print(i)
 new_client.close()

with open('server_list.json','r') as f:
    server_list = json.load(f)


for item in server_list:
    print((item['mydev']))
    iterator_var = iter(item['mydev'])
    next(iterator_var)
    exec_commands(next(iterator_var))

json文件内容如下

[
    {
        "mydev" : ["192.168.56.101","192.168.56.101","192.168.56.101"]
    }
]

错误:

    Traceback (most recent call last):
  File "D:\Personal\Python_code\Logs_Finder\authentication.py", line 30, in <module>
    exec_commands(next(iterator_var))
  File "D:\Personal\Python_code\Logs_Finder\authentication.py", line 16, in exec_commands  new_client.connect(host_data,username='root',password='password',port=22,timeout=60)
  File "C:\Users\rgenupula\AppData\Local\Continuum\Miniconda3\lib\site-packages\paramiko\client.py", line 310, in connect
    retry_on_signal(lambda: sock.connect(addr))
  File "C:\Users\rgenupula\AppData\Local\Continuum\Miniconda3\lib\site-packages\paramiko\util.py", line 276, in retry_on_signal
    return function()
  File "C:\Users\rgenupula\AppData\Local\Continuum\Miniconda3\lib\site-packages\paramiko\client.py", line 310, in <lambda>
    retry_on_signal(lambda: sock.connect(addr))
TimeoutError: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
[Finished in 26.4s]

如果文字 IP 地址已作为参数传递,则工作。

import paramiko,json

client=paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('192.168.56.102',port=22,username='root',password='password',timeout=60)
stdin, stdout, stderr = client.exec_command('uptime')
for i in stdout:
    print(i)
client.close()

【问题讨论】:

  • “将其视为主机名而不是变量。” => 这是什么意思?
  • @MartinPrikryl,感谢您的回复。实际上host-data 是一个变量,它包含来自 mydev dict 数据集的 IPAddress。但是 paramiko connect 假设 host-data 作为主机名并尝试解析。
  • 为什么会这样想?你得到什么错误?
  • @MartinPrikryl,请检查更新的问题。
  • 我在您更新的问题中没有看到任何表明 Paramiko 正在尝试解析主机名的内容。 + 我们需要minimal reproducible example => 如果您将文字 IP 地址字符串传递给new_client.connect,您会遇到同样的问题吗? + 您可以使用与您的代码在同一台机器上运行的任何 SSH 客户端连接到相同的 IP 地址吗?向我们展示它的日志文件。

标签: json python-3.x iterator python-3.6 paramiko


【解决方案1】:

当我运行你的代码时,它甚至没有到达exec_commands。你的nextcalls 对我来说有点意义。

这很好用:

for item in server_list:
    for item2 in item['mydev']:
        exec_commands(item2)

【讨论】:

    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 2016-02-01
    相关资源
    最近更新 更多