Paramiko - ssh на консольный сервер, которому нужно нажать return для script, чтобы продолжить

Просто используя мой первый paramiko script, у нас есть консольный консоль opengear, поэтому я пытаюсь автоматизировать настройку любого устройства, которое мы подключаем к нему.

Открытая передача прослушивает соединения ssh на портах, например, устройство в порту 1 будет 3001. Я подключаюсь к устройству на порту 8, который работает, и мой script работает, но по какой-то причине после я получить сообщение "Интерактивный сеанс SSH установлено", мне нужно нажать return на сеансе, чтобы он выполнялся (поэтому у меня есть сеанс ssh, а также script, его общий).

Он просто ждет там до тех пор, пока я не вернусь, я попытался отправить возвращаемые данные, как вы можете видеть, но они не работают, работает только ручной возврат, что странно, потому что технически они одно и то же?

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

Ответ 1

ive нашел еще один модуль (netmiko), который делает именно то, что я хочу, и выполняет все эти проверки. ive, так как отказался от попыток сделать это сам, когда кто-то еще сделал это лучше.

используйте Netmiko!:)

Ответ 2

Я попробовал это и увидел, что

is_global = remote_conn.recv(1024)

виснет, Вы уверены, что '192.168.1.10' отправляет somthing, чтобы быть полученным? Попробуйте установить тайм-аут

remote_conn.settimeout(3) 

3 секунды, например, сделайте это после этой строки:

remote_conn = remote_conn_pre.invoke_shell()

Таким образом, функция recv не зависает и продолжается, когда истекает время ожидания

работает для меня

Ответ 3

сначала отправьте некоторую команду "ls -ltr\n", а затем вызовите sleep

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

Ответ 4

Попробуйте запустить команду в отладчике и узнайте, какая строка ждет ввода. Вы также можете попробовать отправить \r или\r\n, если просто \n. Помните, что клавиша ввода действительно ^ M

Вы также можете попробовать включить подробное ведение журнала.

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