2016-03-15 3 views
11

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

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

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

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! :)

0

первый отправить несколько команд «LS -ltr \ п», а затем вызвать сон

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

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

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

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

протоколирование не определено. мне нужно что-то добавить? Кроме того, ive ntoiced, что первый возврат carrige работает, я смотрю консоль и вижу ее, затем она делает паузу, пока я не ударил еще раз, после чего запускается сценарий. – AlexW

+0

Я добавил оператор импорта. –

+0

Для регистратора «paramiko.transport» не найдено никаких обработчиков, – AlexW

0

Я попытался это и увидел, что

is_global = remote_conn.recv(1024) 

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

remote_conn.settimeout(3) 

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

remote_conn = remote_conn_pre.invoke_shell() 

Таким образом RECV FUNC не зависает и продолжается, когда срок истечет

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

 Смежные вопросы

  • Нет связанных вопросов^_^