Требуется изменить пароль пользователя из программы. Программа работает под root-ом.
ОС: BSDI BSD/4.1 . Очень желательно делать все без "хака" (только системный API, на крайний случай - запуск внешней программы). PASSWD(1) не подходит т.к. там пароли нужно задавать в открытую и их видно даже из PS.
Заранее благодарен за ответ.romanSA.
man getspnam // для shadow.h
man getpwnam // для pwd.h
Извините, как "читать пароли" я знаю. Но нужно их именно изменять. И потом, SHADOW-пароли хранятся на разных *NIX-ах в различных файлах. (А в BSD getspnam и др. "SHADOW"-процедур вообще нет).
Извиняю.
Функцией проверки правильности пароля можно зашифровать новый пароль, после чего просто переписать нужный файл (в моем случае shadow) в нужном формате. Как называются во фрях шадовские функции я не знаю ( на работал на ней ни разу, хотя хотелось бы рискнуть)- я бы просто посмотрел shadow.h, если он есть, ессно.
Вот этого я и не хотел... В смысле, переписывать "нужный файл в нужном формате". Хотелось, что-либо стандартное, да видно нету...
А "нужные файлы" в разных *NIX-ах и лежат по-разному и форматами несколько различаются.
Да, к сведению, в BSD нет _специальных_ функций доступа к shadow-паролям. Просто если root вызывает getpwnam () или аналогичное, то в поле pw_password _всегда_ лежит шифрованный пароль. И не надо вызывать никаких getspnam ().В общем, как ни грустно, приходётся закрыть эту проблему к-либо "кустарным" методом.
Спасибо за советы.
Да не за что.
Просто, как я думаю, системные проги смены паролей делают то-же самое - переписывают файл. Скажем, в Солярке и RH62, /etc/shadow вообще имеет права доступа - чтение только руту и бину. И прикол в том, что системная прога в процессе смены пароля делает 2 chmod-a и благополучно переписывает его. Не думаю, что в этом есть что-то хакерское.
ЗЫ:
Кстати, а ты не пробовал использовать popen(...); ?
Лучше не popen(), а fork() + exec*() - можно организовать взаимодействие с запускаемым процессом так, как тебе угодно. К слову, именно так я сейчас и сделал (Вызываю соответствующую системную программу /usr/sbin/adduser или /usr/sbin/useradd или ещё что-либо (зависит от задачи и ОС). Т.к. ключи команды тоже зависят от ОС, то вся исполняемая строка хранится в config-е, а исходный код прекрасно работает под BSD/Linux/AIX без изменений. В строку подставляются соответствующие параметры (напр. логин, "зашифрованный пароль" и др.) и далее она исполняется. Перехватить ввод/вывод/код возврата не составляет труда.) .