Выполнение (под) команд во вторичной оболочке / команда на SSH-сервере в Python Paramiko - PullRequest
1 голос
/ 18 октября 2019

У меня проблема с голосовым переключателем ShoreTel, и я пытаюсь использовать Paramiko, чтобы прыгнуть в него и выполнить пару команд. Я считаю, что проблема может заключаться в том, что интерфейс командной строки ShoreTel выдает подсказки, отличные от стандартных Linux $. Это выглядело бы так:

server1$:stcli
Mitel>gotoshell
CLI>  (This is where I need to enter 'hapi_debug=1')

Python все еще ожидает, что $, или я что-то упускаю?

Я думал, что это может быть время, поэтому я поместил эти time.sleep(1) между командами. По-прежнему, похоже, не принимает.

import paramiko
import time

keyfile = "****"
User = "***"
ip = "****"

command1 = "stcli"
command2 = "gotoshell"
command4 = "hapi_debug=1"

ssh = paramiko.SSHClient()
print('paramikoing...')
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect(hostname = ip, username = User, key_filename = keyfile)
print('giving er a go...')
ssh.invoke_shell()
stdin, stdout, stderr = ssh.exec_command(command1)
time.sleep(1)
stdin, stdout, stderr = ssh.exec_command(command2)
time.sleep(1)
stdin, stdout, stderr = ssh.exec_command(command4)
time.sleep(1)
print(stdout.read())

ssh.close()

print("complete")

Что бы я ожидал от успешного выполнения этого кода, было бы для уровня hapi_debug равным 1. Что означает, что когда я SSH вЯ бы хотел увидеть эти отладки HAPI. Когда я это делаю, я не вижу этих отладок.

1 Ответ

1 голос
/ 18 октября 2019

Я предполагаю, что gotoshell и hapi_debug=1 - это не команды верхнего уровня, а подкоманды stcli. Другими словами, stcli является своего рода оболочкой.

В этом случае вам нужно записать команды, которые вы хотите выполнить в подоболочке, в stdin:

stdin, stdout, stderr = ssh.exec_command('stcli')
stdin.write('gotoshell\n')
stdin.write('hapi_debug=1\n')
stdin.flush()

Если после этого вы позвоните stdout.read, он будет ждать, пока команда stcli не завершится. Что это никогда не делает. Если вы хотите продолжить чтение вывода, вам нужно отправить команду, которая завершает подоболочку (обычно exit\n).

stdin.write('exit\n')
stdin.flush()
print(stdout.read())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...