Как вы передаете данные в STDIN программы из разных локальных / удаленных процессов в Python?

Стандартные потоки связаны с программой. Итак, предположим, что какая-то программа уже запущена (мне все равно, как и каким образом). Цель состоит в том, чтобы создать каналы к STDIN программы из разных процессов (или программ), которые выполняются локально или удаленно и передают данные в него асинхронно.

Доступная информация: (1) адрес хоста и (2) только pid программы. Как реализовать оба случая в Python в этом случае?

Изменить: я должен был упомянуть эту предпосылку. Предполагаемая операционная системаLinux с (довольно) недавним ядром.

 Michael Mior25 сент. 2010 г., 03:40
Можете ли вы контролировать запуск удаленных программ?
 NullUserException25 сент. 2010 г., 03:41
@OTZ Я понял; вот почему это просто комментарий.
 OTZ25 сент. 2010 г., 03:43
@Michael В идеале удаленные программы должны также иметь возможность создавать каналы из hostanme и pid программы. Пока это можно сделать удаленно на основе этой информации, я не налагаю ограничений на выполнение этих программ.
 OTZ25 сент. 2010 г., 03:33
Nullpo. Серьезно, я знаю каждый бит модуля подпроцесса. Он не предоставляет интерфейс для получения каналов уже запущенных процессов.
 Porculus25 сент. 2010 г., 03:52
Можете ли вы предоставить некоторый контекст, почему вы хотите это сделать? У него немного неприятный запах.
 OTZ25 сент. 2010 г., 04:06
@Porculus Я хочу эффективно объединить весь вывод нескольких серверов в один файловый (-подобный) объект.

Ответы на вопрос(2)

Решение Вопроса

но во многих системах Linux вы можете написать

/proc/$PID/fd/0

Я думаю, что это может быть одним из очень ограниченного числа потенциально сложных вариантов, если у вас нет другого контроля над удаленным процессом.

 OTZ25 сент. 2010 г., 03:57
Майкл. Ваша схема решения работает локально. Но как ты делаешь это удаленно? Кроме того, какие-либо предложения Python?
 Michael Mior25 сент. 2010 г., 07:18
Нет проблем. Вы можете использовать что-то вродеnetcat если вы беспокоитесь о накладных расходах шифрования через SSH. Вы также можете попробоватьssh -c blowfish использовать более быстрый шифр Blowfish.
 Michael Mior25 сент. 2010 г., 04:43
Вам не нужно использовать sshfs. Просто используйте SSH и канал в данных. Что-то вродеssh $SERVER "cat - > /proc/$PID/fd/0", Или используйте предложение Алекса и проверьтеparamiko.
 OTZ25 сент. 2010 г., 04:01
На самом деле, я знаю, как можно сделать это удаленно: использовать sshfs или другую виртуальную файловую систему и смонтировать целевой файл. Но такая методология, как правило, менее надежна и менее целостна. Так что нужен какой-то другой способ.
 OTZ25 сент. 2010 г., 06:31
Правильно. Но в этом случае мы будем полагаться на стандартный ввод и вывод кошки. Так что я не уверен, что это будет более эффективно, чем sshfs. В любом случае, я думаю, что у меня достаточно материала для дальнейшего кодирования (спасибо вам и Алексу).
 Yuhao01 нояб. 2015 г., 22:17
Интересно, но это работает только для Linux. Есть ли что-то похожее на Unix или OSX?

вые дескрипторы существующего процесса являются неприкосновенными - операционная система, стремясь гарантировать целостность процесса, будет разработана дляне разрешить отдельному, не связанному процессу изменять эти файловые дескрипторы.

Тем не менее, если вы укажете очень конкретную и четко идентифицированную платформу (в идеале включающую точную версию и выпуск рассматриваемой операционной системы, так как безопасность, как правило, ужесточается в последующих выпусках по сравнению с предыдущими), вполне возможно, чтобудут быть доступным трюки для ваших целей. Например, вы можете использовать некоторые из хуков, которые операционная система намеревается использовать для «удаленных отладчиков», присоединяющихся к существующим процессам, - если ваша специфическая ОС предлагает такие хуки (не все !).

Но, если вы хотите кроссплатформенное решение, ни за что.

Итак, я рекомендую вам отредактировать ваш вопрос и, в частности, заменить один из тегов названием «единственной» ОС, которую вам действительно необходимо поддерживать (в отредактированном тексте Q, пожалуйста, будьте как можно точнее о точных версиях). и выпуски, которые вам абсолютно необходимо поддерживать - Python практически не имеет отношения к проблеме, так как вам нужно работать на уровне определенных ОС, поэтому нет никакой необходимости точно определять версию Python).

 OTZ25 сент. 2010 г., 03:52
Ред. Я должен был упомянуть об этом первым. Предполагаемая ОС для этого вопроса - Linux. Спасибо за указание на это.
 Alex Martelli25 сент. 2010 г., 04:01
@OTZ, пожалуйста. Тогда используйте решение @ Michael - сделайте это удаленно черезssh конечно (или напрямую со сторонним пакетом расширения Pythonparamiko, который позволяет вам говорить «sshese» непосредственно из вашего кода Python, без необходимости раскошелиться наssh клиент командной строки! -). Конечно, вам нужны учетные данные для аутентификации себя на удаленном узлеsshd (но тогда очевидно, что безопасностьпо крайней мере требует, чтобы любой удаленный процесс, способный делать такие вещи, был надежно аутентифицирован с данным узлом, верно? -).
 OTZ25 сент. 2010 г., 04:10
До сих пор не знаю, как получить дескриптор файла с указанием только pid и имени хоста, но я посмотрю дальше. Если в python нет хорошего способа сделать это, смонтированный мной sshfs (к ответу Майкла) может быть хорошим компромиссом.

Ваш ответ на вопрос