Paramiko - ssh 到控制台服务器,必须点击 return 脚本才能继续

Paramiko - ssh to console server, having to hit return for script to continue

仅使用我的第一个 paramiko 脚本,我们就有了一个 opengear 控制台服务器,所以我正在尝试自动设置我们插入的任何设备。

open gear 侦听端口上的 ssh 连接,例如端口 1 中的设备将是 3001。我正在连接到端口 8 上的设备,它可以工作并且我的脚本 运行s,但是对于出于某种原因,在收到 "Interactive SSH session established" 消息后,我需要在会话上点击 return 以使其成为 运行 (所以我有一个 ssh 会话,脚本也有,它是共享的) .

它只是在那里等待,直到我点击 return,我已经尝试发送 return,如您所见,但它们不起作用,只有手动 return 有效,这很奇怪,因为从技术上讲它们是同一回事?

import paramiko
import time

def disable_paging(remote_conn):
    '''Disable paging on a Cisco router'''
    remote_conn.send("terminal length 0\n")
    time.sleep(1)
    # Clear the buffer on the screen
    output = remote_conn.recv(1000)
    return output

if __name__ == '__main__':
    # VARIABLES THAT NEED CHANGED
    ip = '192.168.1.10'
    username = 'root'
    password = 'XXXXXX'
    port = 3008

    # Create instance of SSHClient object
    remote_conn_pre = paramiko.SSHClient()

    # Automatically add untrusted hosts (make sure okay for security policy in your environment)
    remote_conn_pre.set_missing_host_key_policy(
         paramiko.AutoAddPolicy())

    # initiate SSH connection
    remote_conn_pre.connect(ip, username=username, password=password,port=port, look_for_keys=False, allow_agent=False)
    print "SSH connection established to %s" % ip

    # Use invoke_shell to establish an 'interactive session'
    remote_conn = remote_conn_pre.invoke_shell()
    print "Interactive SSH session established"
    time.sleep(1)
    remote_conn.send("\n")

    # Strip the initial router prompt
    #output = remote_conn.recv(1000)

    # See what we have
    #print output

    # Turn off paging
    #disable_paging(remote_conn)

    # clear any config sessions
    is_global = remote_conn.recv(1024)
    if ")#" in is_global:
        remote_conn.send("end\n")
        time.sleep(2)
    # if not in enable mode go to enable mode
    is_enable = remote_conn.recv(1024)
    if ">" in is_enable:
        remote_conn.send("enable\n")
        time.sleep(1)
    remote_conn.send("conf t\n")
    remote_conn.send("int g0/0/1\n")
    remote_conn.send("ip address 192.168.1.21 255.255.255.0\n")
    remote_conn.send("no shut\n")
    remote_conn.send("end\n")
    # Wait for the command to complete
    time.sleep(2)
    remote_conn.send("ping 192.168.1.1\n")
    time.sleep(1)

    output = remote_conn.recv(5000)
    print output

先发送一些命令"ls -ltr\n"然后调用sleep

remote_conn.send("ls -ltr\n")
time.sleep(1)

在调试器中尝试 运行 您的命令,找出哪一行正在等待输入。如果只是 \n,您也可以尝试发送 \r 或 \r\n。记住回车键真的是^M

您也可以尝试打开详细日志记录。

import logging
# ...
logging.getLogger("paramiko").setLevel(logging.DEBUG)

我试过了,看到了

is_global = remote_conn.recv(1024)

挂起, 您确定“192.168.1.10”发送了要接收的内容吗? 尝试设置超时

remote_conn.settimeout(3) 

例如3秒,在这行之后做:

remote_conn = remote_conn_pre.invoke_shell()

这样 recv func 不会挂起并在超时到期时继续

适合我

我找到了另一个模块 (netmiko),它完全符合我的要求并进行了所有这些检查。当别人已经做得更好时,我就放弃了尝试自己做。

使用Netmiko! :)