Используя Python для ssh, запустите скрипт bash. Вывод запущенного скрипта bash мне нужно отобразить на экране - PullRequest
0 голосов
/ 04 сентября 2018

Я использую Python (OSX Python 2.7.10) для ssh в коробку Debian (Python 2.7.9), затем запускаю скрипт bash (./capture). Скрипт bash содержит несколько команд tcpdump. Проблема, которую я не могу понять, состоит в том, как отобразить живые результаты из запущенного скрипта bash на терминале.

#!/usr/bin/env python3
import subprocess, os
output = subprocess.run(["ssh", "ju@192.168.199.125", "sudo ./capture"])
print(output)

Я могу выполнить ssh и успешно запустить скрипт, но я не получаю вывод. Когда я нажимаю CTRL C, я получаю следующий след:

**^CTraceback (most recent call last):
  File "/Users/junesjoseph/run.py", line 3, in <module>
    output = subprocess.run(["ssh", "junes@192.168.199.125", "sudo ./capture"])
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/subprocess.py", line 405, in run
    stdout, stderr = process.communicate(input, timeout=timeout)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/subprocess.py", line 835, in communicate
    self.wait()
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/subprocess.py", line 1457, in wait
    (pid, sts) = self._try_wait(0)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/subprocess.py", line 1404, in _try_wait
    (pid, sts) = os.waitpid(self.pid, wait_flags)
KeyboardInterrupt**

Любая помощь очень ценится. спасибо

1 Ответ

0 голосов
/ 04 сентября 2018

Объект, возвращаемый subprocess.run, является CompletedProcess объектом, который имеет атрибуты, которые содержат stdout и stderr завершенного процесса. Вы не хотите печатать его напрямую, но можете использовать его для получения атрибута, который хотите напечатать.

import subprocess  # no reason to import os
subssh = subprocess.run(["ssh", "ju@192.168.199.125", "sudo ./capture"],
    # Set up for capturing stdout and stderr
    stdout=subprocess.PIPE, stderr=subprocess.PIPE,
    # Add commonly useful attributes
    check=True, universal_newlines=True)
print(subssh.output)

Если вы действительно хотите, чтобы вывод отображался только на стандартном выводе, захват его, чтобы вы могли напечатать его, по сути, является излишним. Просто установите его для непосредственного отображения, просто не устанавливая stdout или stderr на что-либо:

subssh = subprocess.run(["ssh", "ju@192.168.199.125", "sudo ./capture"],
    # Don't set up for capturing -- leave stdout and stderr alone
    check=True, universal_newlines=True)

Возможно, смотрите также Выполнение команд Bash в Python , где я опубликовал более подробный ответ об общих проблемах с subprocess.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...