【问题标题】:paramiko exec_command hangs after a few commandsparamiko exec_command 在几个命令后挂起
【发布时间】:2017-07-18 16:48:22
【问题描述】:

我正在使用 sshclient 连接一个 linux 服务器。然后,我通过该服务器上的 telnet 连接 cisco 路由器。我正在连接服务器并完美地执行 telnet 命令,但是在第二个或第三个 telnet 命令代码中,代码卡住并且不会抛出错误。这是我的代码的一部分:

def __init__(self):
        self.pre_client=paramiko.SSHClient()
        self.pre_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        sellf.pre_client.connect("server",username="user",password="password")
        self.client=self.pre_client.invoke_shell()
 def connect(self,ip):
   o=self.client.recv(1024)
   print o
   self.client.exec_command("telnet %s\n"%(ip))
   while True:
       o=self.client.recv(1024)
       print o
       #EXECUTE COMMAND ON ROUTER
       self.client.exec_command("exit\n")
       if 'exit' in o:
           break

为什么会卡在这个命令上?我该如何处理?

【问题讨论】:

    标签: python ssh paramiko cisco


    【解决方案1】:

    我想我需要查看更多代码才能找出问题所在。如果您没有需要使用 Paramiko 频道的特定原因,那么如果您只使用 Paramiko 客户端,您的生活可能会轻松很多。这是我的旧脚本的粗略 sn-p:

    def ssh_connect(usr, pswds, host):
    
        # Open Connection - auto add policy
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    
        # Retry with multiple passwords
        for pswd in pswds:
            try:
                ssh.connect(host, username=usr, password=pswd)
                return ssh
            except:
                pass
        else:
            print("Could not login to: " + host)
            return None
    
    
    def send_command(conn, command):
        try:
            stdin, stdout, stderr = conn.exec_command(command)
            if stdout:
                for str in stdout:
                    sys.stdout.write("\t%s" % str)
                return True
            if stderr:
                for str in stderr:
                    sys.stderr.write("\t%s" % str)
                return False
            else:
                print("\n")
            return True
    
        except paramiko.ssh_exception.SSHException as e:
            print(e.message)
            return False
    

    当然,打电话给他们:

    conn = ssh_connect(login, passwords, host)
    send_command(conn, command)
    

    【讨论】:

    • 当我打印输出时,我发现我的命令打印不正确。例如,如果我发送退出命令,它会打印如下:ex -it 但响应会正确打印。它真的解决了我的问题吗?
    • 这是在第一台主机上,还是在第二台 telnet 主机上?
    • 我不知道,从你的代码 sn-p 很难分辨。您可以使用简单的'echo command' 通过 ssh 检查命令是否正常运行,但我怀疑它在那里失败了。另外值得注意的是,如果您尝试一次发送两个命令,则需要以分号结束每个命令:cd /var/tmp; ls -la。恐怕我无能为力了。