Канал Paramiko отправляет запрос на дистанционную трассировку - PullRequest
0 голосов
/ 04 ноября 2019

Я новичок в этой концепции, поэтому, пожалуйста, помогите!

Я использую канал Paramiko для выполнения команды и запуска трассировки. Я хочу, чтобы трассировка продолжалась, пока я не отправлю запрос на остановку трассировки. Если я использую channel.send (cmd), он запускает и останавливает трассировку, тогда как я хочу, чтобы трассировка продолжалась и остановилась только при отправке любого запроса на остановку, поскольку у меня есть другие действия, которые необходимо выполнить перед остановкой трассировки.

Примечание: я делаю SSH на одной машине с Paramiko и запускаю новый канал на этой машине, чтобы подключить ssh к еще одной машине, чтобы начать трассировку там. Я попробовал exec_command, но он закрывает сокет.

Что я хочу знать:

  1. Как мне запустить трассировку и не дать команде остановить ее перед возвратом
  2. Как остановить трассировку после выполнения моих действий после запуска трассировки.

Код, который я использую:

    chan = sshClient.get_transport().open_session() 
    chan.get_pty()
    chan.invoke_shell()
    chan.send(cmdline +'\n')
    while not sshClient.recv_ready():
        print("Waiting")
    resp = chan.recv(9999)
    print(resp)

Заранее спасибо за помощь!

1 Ответ

0 голосов
/ 05 ноября 2019

В следующем примере показано, что в цикле while, который выполняется вечно, вы выполняете команду, а затем печатаете вывод. После этого он снова отправляет команду

import base64
import paramiko
import time

key = paramiko.RSAKey(data=base64.b64decode(b'AAA...'))
client = paramiko.SSHClient()
client.get_host_keys().add('ssh.example.com', 'ssh-rsa', key)
client.connect('ssh.example.com', username='strongbad', password='thecheat')
while True: 
  time.sleep(5)
  stdin, stdout, stderr = client.exec_command('ls')
  for line in stdout:
     print('... ' + line.strip('\n'))
client.close()

Возможно, после каждой команды вам потребуется отправлять новую строку \n, чтобы client.exec_command('ls') стало -> client.exec_command('ls\n')

...