Можно ли импортировать пользователей с помощью файла CSV? или что-то вроде соединения LDAP для импорта всех пользователей?
Существует приложение для этого! 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
Многие из них могут быть проигнорированы, и значения по умолчанию будут использоваться. Вы [только 118] потребность для определения имени пользователя и пароля. Например:
tom:password1:::::
danny:password2:::::
, Если я сохраняю это как users.txt
и выполняю эту команду:
sudo newusers < users.txt
пользователи создаются:
$ grep -E 'tom|danny' /etc/passwd
tom:x:1005:1006:::
danny:x:1006:1007:::
Со сценарием Вы можете. Этому нужен файл с пользователем и паролем commaseparated:
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" в "~ / Загрузки".
Выполните сценарий:
./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's system
функция позволяет выполнять команды оболочки, в то время как awk обрабатывает записи от текстового файла. Мы создаем переменную "команду", которая является просто текстом команды, которую мы хотим выполнить. Используя запятую как разделитель полей -F','
, мы берем поле № 2 и № 1 и размещаем их для соответствия синтаксису команды useradd. После того как текст команды собран, система (команда) выполняется useradd -p $(mkpasswd password) username
, для каждой строки текста. print command
часть является дополнительной, просто для отладки и проверки, что все имена пользователей были обработаны
Дополнение:
Острота может быть превращена в 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()
функция. Функция Sub изменяет первую инстанцию символа или слова в каждой строке. Другими словами, если у нас есть запись такой как testuser,foo,bar
, где foo,bar
пароль, и мы изменяем первую запись в пространство, мы можем обычно использовать awk, не говоря этому использовать -F','
флаг. Awk переведет каждую запись в testuser foo,bar
, и рассматривайте testuser как 1$ и нечто, панель как 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]
возьмет часть строки containg, имя пользователя
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
, Чем можно использовать эту остроту:
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 имеет проблему с ,
в пароле. Вот моя версия жемчуга:
#!/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