Есть ли способ отправить данные на стандартный ввод другого процесса в Mac OS? - PullRequest
5 голосов
/ 21 августа 2010

Мне было интересно, есть ли API, каким бы неясным он был, который позволял бы кому-то отправлять данные в поток stdin другого процесса в Mac OS X. В Linux, если я правильно помню, вы можете использовать файловую систему.в /proc для доступа к этим потокам (с правильными разрешениями, конечно).

Не знаю.Маха порты, кто-нибудь?

Ответы [ 5 ]

5 голосов
/ 21 августа 2010

Просто мысль, но не могли бы вы создать канал и перенаправить этот (именованный) канал на стандартный ввод процесса при запуске этого процесса?

Примерно как-то как

mkfifo MYPIPE
Prog < MYPIPE
echo "test" > MYPIPE
4 голосов
/ 09 апреля 2016

Если вы выполняете целевой процесс на терминале, вы можете использовать writevt, исходный код которого здесь .

Предположим, например, что вы запускаете команду "cat" наклемма ttys000.

на клемме 1:

$ tty
/dev/ttys000
$ cat

на клемме 2:

$ sudo ./writevt /dev/ttys000 'Hello!^M'

^M выше является управляющим символом.На моем Mac вы можете ввести этот символ, набрав Ctrl-V, а затем Ctrl-<enter>.

Вот результат на терминале 1:

$ tty
/dev/ttys000
$ cat
Hello!
Hello!

Программа writevt может быть скомпилирована изисходный файл writevt.c с gcc:

$ gcc -o writevt writevt.c 
3 голосов
/ 21 августа 2010

К сожалению, я не верю, что вы можете сделать это - MacPorts - все пользовательское пространство, и для требуемой вам операции (либо много хитрости, см. Ниже, либо) взаимодействие с ядром, которое, я считаю, непредстоящий.Например, Mac OSX Internals, системный подход в разделе о передаче файлового дескриптора, говорит

Дескриптор является локальным для процесса в том смысле, что он имеет смысл только впроцесс, который получил дескриптор, скажем, открыв файл.В частности, процесс A не может получить доступ к файлу, который открыт в другом процессе B, просто используя значение дескриптора, представляющего этот файл в B.

, а затем продолжает описывать, как отправляются FD.

Часть "хитрости" потребует, чтобы вы запустили какой-то код (либо в пользовательском пространстве, либо в составе ядра) в другом процессе.

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

Чтобы сделать это на уровне ядра, потребуются аналогичные исправления либо для самого кода ядра, либо для кода, который ядро ​​загружает и работает с полным, непроверенным доверием (поэтому они могут похитить описание файла не связанного процессая уверен, что в Mac OS X не осталось таких путей к коду (поскольку их основным использованием, несомненно, будут вирусы, троянские кони и другие вредоносные программы всех типов), но, если они есть, вы можетенайдите их, это может быть более общее решение, чем исправление каждого интересующего двоичного исполняемого файла.

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

1 голос
/ 21 августа 2010

Предполагая, что это с разрешения пользователя (то есть вы хотите собирать информацию из стороннего приложения, перенаправлять в другое приложение, такое как аудио-приложения Rogue Amoeba или некоторые приложения для захвата видеопотока), тогда я бы сказал, что вы хотите либопосмотрите на расширения ядра или Менеджеры ввода.

(См. также fscript где угодно, SIMBL и Application Enhancer - все примеры программного обеспечения, которое внедряет функциональность в сторонние приложения).

Множество старых методовдля пользовательского кода ввод кода был ограничен в 10.6 (например, сложнее установить менеджеры ввода).

Если вы заинтересованы в вводе данных пользователем, а не в stdin, заменяющий набор методов ввода на самом деле может быть «достаточно хорошим» - классически, менеджеры ввода использовались для внедрения всех видов кода в приложения.

С другой стороны, если вы хотите сделать это без разрешения пользователя (т. Е. Регистрации ключей), то вы взломаны.Вероятно, существует целая цепочка еще не исправленных уязвимостей, которые можно объединить, чтобы сделать то, что вы хотите сделать, но тот, кто знает, вероятно, будет зарабатывать на этом деньги.

0 голосов
/ 21 августа 2010

Ну, технически вы могли бы встроить поток в целевой процесс, а затем отправить ему копию дескриптора файла stdin обратно к вам ... Но вы, вероятно, не должны.: -)

Что вы действительно пытаетесь сделать?

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