Импорт пользователей из файла CSV
Можно ли импортировать пользователей с помощью файла CSV? или что-то вроде соединения LDAP для импорта всех пользователей?
6 ответов
Для этого есть приложение! newusers
инструмент, который является частью passwd
Пакет предназначен для пакетного создания пользователей:
DESCRIPTION
The newusers command reads a file (or the standard input by default)
and uses this information to update a set of existing users or to
create new users. Each line is in the same format as the standard
password file (see passwd(5)) with the exceptions explained below:
Вам нужно будет создать файл в этом формате:
username:passwd:UID:GID:full name,room number,work phone,home phone,other:directory:shell
Многие из них могут быть проигнорированы, и будут использованы значения по умолчанию. Вам нужно только указать имя пользователя и пароль. Например:
tom:password1:::::
danny:password2:::::
Если я сохраню это как users.txt
и запустите эту команду:
sudo newusers < users.txt
Пользователи созданы:
$ grep -E 'tom|danny' /etc/passwd
tom:x:1005:1006:::
danny:x:1006:1007:::
С помощью скрипта вы можете. Для этого нужен файл с разделенными запятыми именем пользователя и паролем:
while IFS="," read -r user passwd ; do
echo "useradd -m -p $(mkpasswd "$passwd") $user"
done < /home/$USER/Downloads/users.txt
mkpasswd
может быть установлен сsudo apt-get install whois
- Измените, чтобы; если тебе это нужно
Сохранить это как users.sh
и установить разрешения с chmod +x users.sh
Если вы тогда делаете
./users.sh > users_create.sh
Вы получите текстовый файл со всеми командами, чтобы вы могли проверить его и
chmod +x users.sh
./users_create.sh
затем создаст их.
тестирование
Пример файла:
wdn,password123
wdn2,password345
сохранен как "users.txt" в "~/Downloads".
Выполнить скрипт:
./users.sh
useradd -m -p acBNi2tbw9iaw wdn
useradd -m -p OHOzeMGqbcMso wdn2
а также
./users.sh > users_create.sh
~/Downloads$ more users_create.sh
useradd -m -p Q1BVotdoA3ucI wdn
useradd -m -p siUX7mYTYw.3A wdn2
(пароль зашифрован).
После этого все, что вам нужно сделать, это выполнить, это сделать этот исполняемый файл с chmod +x users.sh
и выполнить его с ./users_create.sh
(Я не делал этого в последнюю очередь, поэтому, если не работает, пожалуйста, прокомментируйте)
Вот один вкладыш awk:
sudo awk -F',' '{ command="useradd -p $( mkpasswd "$2" ) "$1;print command; system(command) }' userlist.txt
Или для удобочитаемости, вот формат:
sudo awk -F',' '{
command="useradd -p $(mkpasswd "$2 ")" $1;
print command;
system(command)
}' userlist.txt
Пояснение:
AWK-х system
Функция позволяет запускать команды оболочки, пока awk обрабатывает записи из текстового файла. Мы создаем переменную "команда", которая является просто текстом команды, которую мы хотим выполнить. Использование запятой в качестве разделителя полей -F','
, мы берем поля #2 и #1 и размещаем их так, чтобы они соответствовали синтаксису команды useradd. Как только текст команды собран, система (команда) выполняется useradd -p $(mkpasswd password) username
для каждой строки текста. print command
part является необязательным, просто для отладки и проверки того, что все имена пользователей были обработаны
Дополнение:
Oneliner можно превратить в сценарий awk следующим образом:
#!/usr/bin/awk -f
BEGIN {FS=",";}
{
command="useradd -p $(mkpasswd "$2") " $1;
print command;
system( command )
}
Теперь убедитесь, что скрипт имеет права на выполнение с sudo chmod +x script-name.awk
и запустить его с любым входным файлом, например, так sudo ./awkscript.sh userlist.txt
если он находится в вашем текущем рабочем каталоге, или вы можете вызвать этот скрипт в любом месте, поместив его в один из $PATH
каталоги
Возможный ,
в пароле
Чтобы учесть возможность использования запятой в пароле, я предлагаю вам использовать sub()
функция. Подфункция изменяет первый экземпляр символа или слова в каждой строке. Другими словами, если у нас есть запись, такая как testuser,foo,bar
, где foo,bar
это пароль, и мы меняем первую запись на пробел, мы можем использовать awk как обычно, не сказав ему использовать -F','
флаг. Awk переведет каждую запись на testuser foo,bar
и рассматривайте testuser как 1 доллар, а foo, bar как 2 доллара. Чтобы вставить это в код:
sudo awk '{ sub(","," ");command="useradd -p $( mkpasswd "$2" ) "$1;print command; system(command) }' userlist.txt
Вот python
решение:
#!/usr/bin/env python2
import subprocess, crypt
with open('/path/to/file.csv') as f:
for line in f:
i = line.find(',')
name = line[:i]
password = line.rstrip()[i+1:]
encpt_passwd = crypt.crypt(password, '2b')
command = 'useradd -m -p {0} {1}'.format(encpt_passwd, name).split()
subprocess.call(command)
Это будет обрабатывать пароли с запятыми.
line.find(',')
найдет самый низкий индекс,
в каждой строке файлаline[:i]
возьмет кусок строки, связывающей имя пользователяline.rstrip()[i+1:]
будет содержать парольcrypt
модуль генерирует зашифрованный пароль от ввода формыcrypt.crypt(password, salt)
,encpt_passwd
будет содержать зашифрованный пароль. Вcrypt.crypt(password, '2b')
,password
сохраненный простой пароль и2b
это соль.subprocess.call(command)
просто запустит команду для генерации пользователей
У меня короче awk
версия (@Serg =)):
Первая установка whois
нам нужна команда mkpasswd
sudo apt-get install whois
Чем вы можете использовать этот oneliner:
awk -F',' '{print "Create user: "$1; system("sudo useradd -p $(mkpasswd "$2") "$1)}' users
или без какого-либо вывода:
awk -F',' '{system("sudo useradd -p $(mkpasswd "$2") "$1)}' users
Содержание users
:
foo,foopasswd
bar,password
foobar,foobar
Имя пользователя в первом столбце, незашифрованный пароль во 2-м столбце.
Справедливости ради, я упоминаю здесь проблему. Пароли не могут содержать запятую.
Моя версия AWK имеет проблемы с ,
в пароле. Вот моя версия Perl:
#!/usr/bin/perl
use strict;
use warnings;
use Text::CSV;
my $file = $ARGV[0];
open my $fh, "<", $file or die "$file: $!";
my $csv = Text::CSV->new ({
binary => 1, # Allow special character. Always set this
auto_diag => 1, # Report irregularities immediately
sep_char => ','
});
while (my $row = $csv->getline ($fh)) {
print "User: ".$row->[0]."\n";
print "Password: ".$row->[1]."\n";
my $hashed = crypt($row->[1], "salt");
my $cmd = 'useradd -p '.$hashed.' '.$row->[0]."\n";
system($cmd);
}
close $fh;
Пример:
CSV файл users.csv
:
foo,"foopasswd"
bar,"password"
foobar,"""foo,bar"
Запустить скрипт
% sudo add_users users.csv
User: foo
Password: foopasswd
useradd -p sajllSNct/Wx2 foo
User: bar
Password: password
useradd -p sa3tHJ3/KuYvI bar
User: foobar
Password: "foo,bar
useradd -p saBWMpscG9WvA foobar