Импорт пользователей из файла 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
Другие вопросы по тегам