Я написал простую программу на C для выполнения другой программы, используя execve.
exec.c:
#include <unistd.h>
#include <stdio.h>
int main(int argc, char** argv) {
char path[128];
scanf("%s", path);
char* args[] = {path, NULL};
char* env[] = {NULL};
execve(path, args, env);
printf("error\n");
return 0;
}
Я скомпилировал ее:
gcc exec.c -o exec
и послезапустив его и написав "/ bin / sh", он успешно запустил оболочку и отобразил знак $
как обычную оболочку, как видно на рисунке.
Затем я сделал следующее: я создал сервер, используя nc -l 12345
, и запустил nc localhost 12345 | ./exec
.Это сработало, но по какой-то причине я не могу понять, знак $
на этот раз не отображался.Я не мог понять причину этого.(демонстрирующие изображения прилагаются)
Теперь вот самая странная вещь.Когда я пытаюсь передать путь программы и больше ввода через канал сразу, кажется, что выполненный процесс просто игнорирует ввод и закрывается.Например:
Но, если я запускаю следующее, оно работает точно так же, как и при выводе nc
:
Итак, в заключение мои вопросы:
- Я не понимаю, почему исполняемая оболочка не печатает знак приглашения
$
при чтении вводаиз трубы вместо стандартного ввода. - Почему исполняемая программа не считывает ввод с канала, когда ввод уже существует и не ожидает?Кажется, он работает только в тех случаях, когда канал остается открытым после выполнения команды.