Как побороть баг в newusers

Первый раз в жизни приключилась необходимость, экспортировать большое количество пользователей из одного дистрибутива, в другой. Сперва думал, как и чего наколхозить для достижения истинного дзена, но нашел утилиту newusers (нашел – громко сказано, она всегда рядом была, в пакете shadow) и возрадовался.

Прога умеет создавать пользователей руководствуясь списком в текстовом файле, где каждая строка имеет вид:

user_name:clear_text_password:number_uid:number_gid:text_comment:home_dir:user_shell

где:

  1. user_name – это имя пользователя (латиницей);
  2. clear_text_password – нешифрованный пароль;
  3. number_uid – цифровой идентификатор пользователя (должен быть больше UID_MIN и меньше UID_MAX в файле /etc/login.defs) ;
  4. number_gid – цифровой идентификатор группы (должен быть больше GID_MIN и меньше GID_MAX в файле /etc/login.defs) ;
  5. text_comment – Комментарий, или фио пользователя (можно кириллицей);
  6. home_dir – домашняя директория (скрипт создаст ее сам);
  7. user_shell – командная оболочка или например /usr/sbin/nologin, если в шелл пользователю нельзя;

Но радость была не долгой. Скормив проге список пользователей, получил в ответ:


root@server:/home/serp# newusers ./userlist.txt
*** Error in `newusers': free(): invalid next size (fast): 0x00000000012b23d0 ***
Aborted (core dumped)


И проблема не в моем списке пользователей, или кривых руках, а в данной версии программы (https://bugs.launchpad.net/ubuntu/+source/shadow/+bug/1266675)

Изучив данный вопрос, выяснилось, что в версии программы из дистрибутива 16.04, такой проблемы нет (сделал бэкпорт пакета и проверил). Но использовать полученные бинарники я не стал, т.к. автоматически оставил бы сервер без обновлений на пакеты uidmap, login, passwd, а это не приемлемо.

Как выяснилось, багается программа только если в файле со списком более 2 строк. Т.е. по одной строке она импортирует без проблем. Отсюда делаем умозаключение, что нам срочно нужен скрипт! (как же в линуксах без скрипта?) Который и был благополучно написан. Не ахти какой, но работает.


#!/bin/bash
while read LINE; do
echo "$LINE"|newusers
done < userlist.txt

не трудно догадаться, что вместо userlist.txt нужно подставить имя вашего файла со списком пользователей.
А дальше, сохраняем, запускаем (chmod +x не забудь!) и готово.

Добавить комментарий

Войти с помощью: