Добавление нескольких новых пользователей — Сценарии оболочки Bash

#bash #shell #file #multiple-users

Вопрос:

Я хочу добавить несколько пользователей в систему Red Hat UNIX. Я использую два текстовых файла в качестве источников, содержащих 9 имен пользователей и 9 полных имен, разделенных по отдельности на 9 новых строках.

$U содержит usernames.txt, $I содержит полные имена для команды-c, а $Z содержит конечные числа от 1 до 9 для установки конечного значения-u. Я надеялся, что сценарий достигнет того, что он заполнит команду useradd значениями, которые я описал, чтобы команда useradd выполняла добавление пользователей с их именем пользователя, полем комментария (полное имя) и значением идентификатора. Я использовал команду echo, чтобы проверить, каковы были выходные данные, прежде чем фактически выполнить часть команды useradd сценария в системе. Однако сценарий фактически интерпретировал пробелы в fullnamecomment.txt в виде отдельных итераций и в основном скрипт выводит один и тот же запрос 9 раз, последовательно добавляя 1 к значению-u.

@Сообщество, может ли кто-нибудь внести какой-либо вклад в оптимизацию этого сценария или изменение моего метода для добавления нескольких пользователей, заполняющих имя пользователя, комментарий и значения идентификаторов в команде useradd?

Спасибо.

 #!/bin/bash

for U in $(cat username.txt)
do
        for I in $(cat fullnamecomment.txt)
        do
                for Z in {1..9}
                do
                        #useradd $U -m -c $I -u 10010$Z
                        echo "useradd $U -m -c $I -u 10010$Z"
                done
        done
done
 

Комментарии:

1. Не обращайте внимания на

2. Кроме того, если вы хотите , чтобы первая строка из username.txt совпадала с первой строкой fullnamecomment.txt , 2-я строка каждого файла совпадала со 2-й строкой другого и т. Д., Вам вообще не следует использовать вложенный цикл. Если это то , что вы пытаетесь сделать, четко укажите это, и я смогу найти существующий вопрос с вопросом и ответом, описывающий технику.

3. Кстати, чтобы показать свою собственную модификацию чьего-либо ответа, добавьте свой собственный ответ с помощью кнопки Добавить ответ вместо редактирования ответов в вопрос. См. Обсуждение обмена метастеками, в том числе Что делать, когда ОП отвечает на свой собственный вопрос в правке? и должен ли я обновить свой вопрос, чтобы включить правильный ответ?

4. Спасибо, Чарльз! Я обновил свой вопрос и добавил ответ с изменениями в разрешение SteveKlines, чтобы он работал в моей системе. Спасибо Чарльздаффи и Стивеклайну за то, что нашли время ответить. Очень признателен! Я надеюсь однажды ответить на один из ваших вопросов и отплатить вам тем же! Заботиться.

Ответ №1:

Когда вы размещаете свои циклы, это означает, что вы хотите запускать внутренний цикл снова и снова, каждый раз, когда происходит внешний цикл. Это явно не то, что вы на самом деле собираетесь здесь делать; вместо этого ваш код предназначен для пошагового перебора переменных, сопоставляя каждое имя пользователя, полное имя и UID. Это означает, что у вас должен быть только один цикл вместо того, чтобы вкладывать несколько циклов друг в друга.

 offset=0
while IFS= read -r username <amp;3 amp;amp; IFS= read -r fullname <amp;4 amp;amp; ((   offset )); do
  useradd "$username" -m -c "$fullname" -u "$((100100   offset))"
done 3<username.txt 4<fullnamecomment.txt
 

Комментарии:

1. Большое вам спасибо, что нашли время ответить. Ваш ответ отлично сработал без каких-либо изменений и пометил это как ответ.

Ответ №2:

Разрешение от SteveKline изменено:

 #!/bin/bash
Z=100101
IMPORTCSV=$(cat tabdelimituserlist.csv)
while read -r line; do
        U=$(echo $line | cut -f1 -d:)
        I=$(echo $line | cut -f2 -d:)

        echo "useradd "$U" -m -c "$I" -u "$Z""
        #useradd "$U" -m -c "$I" -u "$Z"

        #Optional since RHEL passwd permits stdin arguments
        #echo 73mp@ssw0rd | passwd --stdin "$U"

        Z=$(( $Z   1 )) #Will increment 1 after 100100 for each user added
done <<< "$IMPORTCSV"
 

Комментарии:

1. Не используйте echo $line | cut ... для разделения полей, read можете сделать это самостоятельно, например IFS=: read -r U I ignored . См . BashFAQ #1: Как я могу прочитать файл (поток данных, переменную) построчно (и/или поле за полем)? Кроме того, ваше цитирование довольно запутано; shellcheck.net хорошо указывает на проблемы с цитированием.