Как изменить пароль пользователя в C с помощью системных вызовов Linux? - PullRequest
1 голос
/ 02 апреля 2012

Я пытаюсь написать C-программу для изменения пароля пользователя с помощью системных вызовов Linux. Я пытался использовать файлы /etc/passwd и /etc/shadow, но у меня проблемы, потому что пароль зашифрован, вы можете помочь мне решить эту проблему?

void main (int argc, char ** argv) {

uid_t uid;

struct passwd *pw;

uid = getuid();

if (argc > 1)
    pw = getpwnam(argv[1]);
else
    pw = getpwuid(uid);
//system("passwd");
//printf("%i",execl("/usr/bin/passwd","passwd",pw->pw_name)); //here I tried to use execl but it returns error

}

Я использовал систему ("passwd"), но я не думаю, что мой учитель примет это. В остальном я просто пытался понять вещи getpw ... это не важно.

Ответы [ 2 ]

3 голосов
/ 02 апреля 2012

Вы можете попытаться использовать putpwent для этого. Как сказал в комментариях Джонатан Леффлер, вам нужно Putpent , если вы хотите обновить файл теней.

Но самый простой и, вероятно, самый портативный способ сделать это - просто позвонить passwd через system(3) или popen(3).

1 голос
/ 02 апреля 2012

Первое, что я узнал, когда начал писать программное обеспечение для Linux после того, как пришел из опыта разработки под Windows и OS X, это то, что утилиты командной строки следует использовать, а не избегать. Даже для вещей, в которых есть возможность использования C api или утилиты командной строки, часто умнее и надежнее fork и exec (НЕ popen, если только вы не хотите проверить, действительно ли код возврата равен 0!), чем использовать C api.

На самом деле, вызов утилиты командной строки ничем не отличается от вызова C api , если только вам не нужно задействовать каждый последний бит производительности в вашем приложении. Это практически API, где имя функции - это имя утилиты, а параметры - аргументы командной строки.

Итак, в ответ на ваш вопрос: попробуйте exec passwd, и он позаботится обо всех ваших проблемах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...