Первый раз в жизни приключилась необходимость, экспортировать большое количество пользователей из одного дистрибутива, в другой. Сперва думал, как и чего наколхозить для достижения истинного дзена, но нашел утилиту newusers (нашел – громко сказано, она всегда рядом была, в пакете shadow) и возрадовался.
Прога умеет создавать пользователей руководствуясь списком в текстовом файле, где каждая строка имеет вид:
user_name:clear_text_password:number_uid:number_gid:text_comment:home_dir:user_shell
где:
- user_name – это имя пользователя (латиницей);
- clear_text_password – нешифрованный пароль;
- number_uid – цифровой идентификатор пользователя (должен быть больше UID_MIN и меньше UID_MAX в файле /etc/login.defs) ;
- number_gid – цифровой идентификатор группы (должен быть больше GID_MIN и меньше GID_MAX в файле /etc/login.defs) ;
- text_comment – Комментарий, или фио пользователя (можно кириллицей);
- home_dir – домашняя директория (скрипт создаст ее сам);
- 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 не забудь!) и готово.