我正在通过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循环中创建新变量(?),还是我认为完全错误?
有人可以帮我解决这个问题吗?
非常感谢。
答案 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
以防止出现奇怪的关机错误