Импорт пользователей из файла CSV

Можно ли импортировать пользователей с помощью файла CSV? или что-то вроде соединения LDAP для импорта всех пользователей?

7
задан 8 June 2015 в 14:54

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

Многие из них могут быть проигнорированы, и значения по умолчанию будут использоваться. Вы [только 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:::
0
ответ дан 8 June 2015 в 14:54

Со сценарием Вы можете. Этому нужен файл с пользователем и паролем 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
  • Изменитесь к a; если Вам нужно это.

Сохраните это как 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 (Я не внес свою лепту поэтому, не работая, прокомментируйте).

9
ответ дан 8 June 2015 в 14:54

Вот 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

6
ответ дан 8 June 2015 в 14:54

Вот 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) просто выполнит команду для генерации пользователей

0
ответ дан 8 June 2015 в 14:54

У меня есть более короткое 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-м столбце.

<час>

Честно, я упоминаю проблему здесь. Пароли не могут включать запятую.

0
ответ дан 8 June 2015 в 14:54

Моя версия 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
1
ответ дан 8 June 2015 в 14:54

Другие вопросы по тегам:

Похожие вопросы: