在for循环中重用变量,在next for循环中重用

时间:2019-05-03 15:01:57

标签: python python-3.x

我正在通过Python进行工作,并且正在逐步了解基础知识。现在,代码的主要目标是使用SSH(在这种情况下,例如使用Paramiko)自动执行任务,然后执行一些无关的操作,然后再次在同一设备上执行任务,但无需设置新会话。 Paramiko部分可以正常工作,该代码对于单个设备也可以正常工作,但是现在我陷入了困境。可以说我有以下内容:

for host in hosts:
  sshclient = paramiko.SSHClient()
  sshclient.connect(host, port=22, username=user, password=password)
  cmd = sshclient.invoke_shell()

因此,这将遍历主机列表并连接到设备。但是现在,在代码的后面,在此for循环之外,我需要另一个循环,该循环将在所有设备上发送命令,例如:

for some in data:
  cmd.send("some command")

但是,当我这样做时,它仅使用连接到的最后一个主机,因为在第一个for循环中声明并记住了cmd变量。我可以通过在后者的for循环中设置一个新的“连接”来解决此问题,但是Paramiko会建立一个会话,并且列表中的迭代次数过多,因此会话数量变得太大。因此,我想重用cmd变量并在每个会话的第一个for循环中创建新变量(?),还是我认为完全错误?

有人可以帮我解决这个问题吗?

非常感谢。

1 个答案:

答案 0 :(得分:5)

您可以将所有cmd变量汇总到list中,以供以后循环使用:

cmds = []

for host in hosts:
  sshclient = paramiko.SSHClient()
  sshclient.connect(host, port=22, username=user, password=password)
  cmds.append(sshclient.invoke_shell())

# Now you can iterate over them
for cmd in cmds:
    cmd.send("some command")

如果您担心同时打开的连接数,可以根据需要生成它们:

def create_cmds(hosts):
    for host in hosts:
        sshclient = paramiko.SSHClient()
        sshclient.connect(host, port=22, username=user, password=password)
        yield sshclient

for client in create_cmds(hosts):
    cmd = client.invoke_shell() # an open method was called here
    cmd.send('some command')
    # invoke close here as noted in docs

here所述,您将需要调用client.close以防止出现奇怪的关机错误