我正在学习 Python,并且正在学习基础知识。现在,代码的主要目标是使用 SSH(在本例中使用 Paramiko)自动执行任务,之后执行一些不相关的操作,然后再次在相同设备上执行任务,但不设置新 session 。 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 构建了一个 session ,并且列表中的迭代次数太多, session 数变得太大。所以我想重用 cmd 变量并在每个 session 的第一个 for 循环中创建新变量(?),还是我的想法完全错误?
谁能帮我解决这个问题?
非常感谢。
请您参考如下方法:
您可以将所有 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
sshclient.close() # close invoked here automatically on call to next() with for loop
for client in create_cmds(hosts):
cmd = client.invoke_shell() # an open method was called here
cmd.send('some command')
如前所述here您将需要调用 client.close 以防止出现奇怪的关闭错误
