【问题标题】:paramiko's ssh channel closed after executing one cmd - Pythonparamiko ssh 通道在执行一个命令后关闭 - Python
【发布时间】:2015-03-06 01:00:03
【问题描述】:

我正在使用PythonParamiko 在删除服务器中执行命令。代码很简单。

这是我对SSHConn 类的定义:

class SSHConn:

  def __init__(self, hostname, user, pwd, filename=None):
    self.client = paramiko.SSHClient()
    self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    self.client.connect(hostname, username=user, password=pwd,
                          key_filename=filename)
    self.transport = self.client.get_transport()
    self.channel = self.transport.open_session()

所以我正在运行以下代码:

local_ssh = ssh.SSHConn(host, user, passwd)

cmds = ('foo', 'bar')
for cmd in cmds:
   local_ssh.channel.exec_command(cmd)
   self.log.info(local_ssh.channel.recv(1024))

但是,当我执行以下代码时,我得到了:

INFO:paramiko.transport:Connected (version 2.0, client OpenSSH_6.6.1p1)
INFO:paramiko.transport:Authentication (publickey) failed.
INFO:paramiko.transport:Authentication (password) successful!
INFO:paramiko.transport:Secsh channel 1 opened.
INFO:testsets.testcase:
ERROR:testsets.testcase:Channel is not open
Traceback (most recent call last):
  File "/root/fds-src/source/test/integration-framework/testsets/testcases/test_100gb_volume.py", line 87, in runTest
    local_ssh.channel.exec_command(cmd)
  File "/usr/lib/python2.7/dist-packages/paramiko/channel.py", line 209, in exec_command
    raise SSHException('Channel is not open')
SSHException: Channel is not open
ERROR:testsets.testcase:Test Case Test100GBVolume failed.
Traceback (most recent call last):
  File "/root/fds-src/source/test/integration-framework/testsets/testcases/test_100gb_volume.py", line 87, in runTest
    local_ssh.channel.exec_command(cmd)
  File "/usr/lib/python2.7/dist-packages/paramiko/channel.py", line 209, in exec_command
    raise SSHException('Channel is not open')
SSHException: Channel is not open

如何保持频道畅通?

【问题讨论】:

    标签: python ssh paramiko


    【解决方案1】:

    channel 文档非常清楚这一点。您需要为每个exec_command打开一个新频道。

    exec_command(*args, **kwds)

    在服务器上执行命令。如果服务器允许,则通道将直接连接到正在执行的命令的标准输入、标准输出和标准错误。

    当命令执行完毕后,通道将被关闭,无法重用。如果你想执行另一个命令,你必须打开一个新通道。

    SSHClient 对象有一个 exec_command 方法可以为您执行此操作。

    【讨论】: