отправка ввода из файлового дескриптора - PullRequest
1 голос
/ 03 мая 2020

У меня есть двоичный файл, который я отлаживаю удаленно, один из способов отправить входные данные в этот файл - бросить

echo "input" > /proc/pid/fd/0

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

вот пример

#include <stdio.h>

int main () {
   char str[50];

   printf("Enter a string : ");
   gets(str);

   printf("You entered: %s", str);

   return(0);
}

, когда вы запускаете вышеуказанную программу и отправляете ввод с использованием

echo "input" > /proc/pid/fd/0

вышеупомянутая программа получит ввод, но она не будет нажимать клавишу ввода

, поэтому есть способ сделать это с помощью файлового дескриптора двоичного файла или любого другого быстрый способ?

в моем случае нажатие клавиши - это просто клавиша ввода

edit:

echo -en 'input\r' > /proc/pid/fd/0

или

echo -en 'input\x0d' > /proc/pid/fd/0

не будет работать, потому что терминал будет думать, что это ведомое устройство, отправляющее на выход, оно не будет отправлено на стандартный интерфейс ведомого устройства

1 Ответ

3 голосов
/ 03 мая 2020

Можете ли вы прочитать процесс из именованного канала (mkfifo)? Тогда ввод с клавиатуры возможен с cat > mypipe, но пока работает cat, вы также можете echo foo > mypipe, потому что канал может иметь несколько писателей (я думаю.)

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


echo "input" > /proc/pid/fd/0 вышеупомянутая программа получит вход

Нет, выходные данные будут отображаться в терминале точно так же, как если бы вы сделали echo "input" > /dev/pts/12 или любое другое оконечное устройство, которое процесс открыл как свой стандартный ввод (обычно с тем же дескриптором файла для чтения / записи для всех 3 стандартных выводов, stdout и stderr, поэтому он работает для записи в него).

Чтобы программа могла read() вводить данные, вам необходимо выполнить запись на другую сторону псевдотерминала , который, вероятно, принадлежит ssh или эмулятору терминала. возможно можно записать в один из FD ssh или xterm или чего-либо еще.

...