Я пытаюсь создать графический интерфейс для linux-версии windscribe, поэтому я хочу связаться с CLI-модулем windscribe из моей C-программы. Я решил использовать popen.
Я могу написать отдельные команды с помощью popen («команда», «w»), но я хочу добавить информацию при запросе, например, войти в CLI:
$ windscribe login
Windscribe Username: myname
Windscribe Password: mypassword
Так что я держу ФАЙЛ открытым и использую fputs для продолжения отправки информации.
Я наконец написал эту функцию:
void write_in_shell_commands(char** commands, int length){
FILE *fp = NULL;
// sending first command
if (length > 0) {
debug("Writing \"%s\" to shell.", commands[0]);
fp = popen(commands[0], "w");
}
// sending the rest
if (fp) {
debug("File successfully opened.");
for (int i = 1; i < length; i++){
debug("%s", "Writing to shell.");
fputs(commands[i], fp);
}
pclose(fp);
} else {
debug("Operation failed.");
}
}
Но когда я использую эту функцию (например,) для входа в систему, она не работает, как я ожидал, кажется, что дополнительные команды теряются и не учитываются.
char* cmd1 = "windscribe login";
char* cmd2 = "myname";
char* cmd3 = "mypassword";
char** commands = malloc(3 * sizeof(char*));
commands[0] = cmd1;
commands[1] = cmd2;
commands[2] = cmd3;
write_in_shell_commands(commands, 3);
Я ожидаю, что программа:
- Написать cmd1 в оболочке
- Запишите cmd2 в стандартный ввод
- Запишите cmd3 в стандартный ввод
Но на самом деле это происходит
DEBUG output/shellwriter.c:22: Writing "windscribe login" to shell.
DEBUG output/shellwriter.c:27: File successfully opened.
DEBUG output/shellwriter.c:30: Writing to shell.
DEBUG output/shellwriter.c:30: Writing to shell.
Windscribe Password: Windscribe Username:
На самом деле он запрашивает пароль в терминале и в конечном итоге дает сбой, потому что учетные данные неверны.
Что на самом деле здесь происходит? Где мои вторая и третья команды? Я использую неправильные функции?