Трубные команды в парамико - PullRequest
5 голосов
/ 04 января 2011

Как мне запускать конвейерные команды в paramiko?Я делаю это:

statement = 'grep thing file | grep thing2 | tail -1'
last_msg = conn.execute(statement)

и получаю вывод только grep thing file.

1 Ответ

8 голосов
/ 04 января 2011

Потому что grep не знает, как обращаться с |. Приготовься к неприятному побегу:

statement = """sh -c 'grep thing file | grep thing2 | tail -1'"""

Это создает оболочку на другой стороне и просит ее интерпретировать строку grep thing file | grep thing2 | tail -1. Одинарные кавычки необходимы, поскольку sh -c принимает только один аргумент.

Таким образом, оболочка создаст канал для вас, выполняя все команды. И вам лучше убедиться, что имя файла file не содержит пробелов. Если это так, попробуйте "file".

Как видите, это быстро становится очень уродливым. Я предлагаю вам поместить конвейер в сценарий оболочки. Тогда вы можете избежать кавычек и просто запустить скрипт с sh -c script.sh.

...