Некоторые программы (которые запрашивают пароль) используют isatty(STDIN_FILENO)
вызов для гарантии того, что пароль введен через терминал.
В этом случае невозможно использовать обычные каналы для отправки пароля к программе.
Для этих программ вы можете создать псевдотерминал, который будет использоваться вместо канала. Пример:
void test(void)
{
const int fdm = posix_openpt(O_RDWR | O_NOCTTY);
if (fdm != -1)
{
char name[100];
unlockpt(fdm);
ptsname_r(fdm, name, sizeof(name));
const int fds = open(name, O_RDWR | O_NOCTTY);
if (fds != -1)
{
const pid_t child_pid = fork();
if (child_pid == -1)
{
// TODO: Error handling
}
else if (child_pid == 0)
{
dup2(fds, STDIN_FILENO);
dup2(fds, STDOUT_FILENO);
close(fds);
close(fdm);
execl("/sbin/program_that_requires_password_from_terminal", "blabla", (char*) NULL);
}
else
{
const char password[] = "mypassword\n";
int status;
close(fds);
// TODO: wait prompt from the program by reading fdm
write(fdm, password, strlen(password));
waitpid(-1, &status, 0);
close(fdm);
}
}
}
}
Таким образом, isatty(STDIN_FILENO)
в целевой программе возвращает «true».