Пишите в стандартный поток запущенного процесса с тем же эффектом / поведением прямой записи

8

Этот пост отвечает только частично на мой вопрос. Моя проблема в том, что запись в stdin запущенного процесса с использованием FD процесса в файловой системе / proc не дает такого же эффекта.

Проблема:

  1. запустите nc для прослушивания порта 10000 (этот процесс называется далее nc 1)

    nc -l 10000
    
  2. запустить другой nc для отправки символов в nc прослушивания (это будет nc 2)

    nc localhost 10000
    
  3. Пишите в стандартный ввод на нк 2

    echo "some chars here" >> /proc/[PID-nc-2]/fd/0
    

проблема: «некоторые символы здесь» не попадают в прослушивающий nc (nc 1), НО отображаются на консоли nc 2.

Вопрос: почему и можно ли заставить это работать?

Geo
источник

Ответы:

11

Это не работает, как вы ожидаете, потому что /proc/<PID>/fd/0это не труба. Если вы вызываете отправляющую сторону с подключенным к каналу stdin, она будет работать

На принимающем хосте

nc -l 10000

На отправляющем хосте

mkfifo my.fifo
cat >my.fifo &
cat my.fifo | nc remotehost.tld 10000

Теперь вы можете

echo "Hello World" >my.fifo
myprog >my.fifo

Обратите внимание, что cat >my.fifoтребуется, чтобы держать fifo открытым, в противном случае EOF отправляется и соединение закрывается преждевременно. Чтобы закрыть соединение, вам нужно убить процесс cat, который держит fifo открытым.

user9517
источник
Очень полезно! В моем случае это фактически упростило взаимодействие с процессом, так как перманент fifo может позволить обычному пользователю влиять на сценарий sudo'ne.
natevw
1

Как указано в ответе на пост, на который вы ссылаетесь, вам нужно писать /proc/pid/fd/0, а не /proc/pid/fd/1.

Майкл Хэмптон
источник
1
Я исправил свой вопрос. Но все равно: я пробовал оба / fd / 0 и / fd / 1. Вопрос остается ...
Geo
Я попробовал это, но столкнулся с небольшой проблемой. он отправляет требуемый домен в telnet, но я думаю, что требуется какой-то перевод каретки или символ новой строки, который я не могу передать ему
Farhan