Подробный useradd в Red Hat Enterprise Linux

read -a array считывает все слова из одной записи в array.

Если вы хотите прочитать все слова из всего ввода, используйте разделитель записей, который не встречается во вводе, например, -d '', который использует символ NUL в качестве разделителя записи, или-d :(как :не может встречаться в имени пользователя ).

IFS=$'\n' read -rd '' -a array < <(ls -Ll /dev | awk '/tty/{print $3}')

(здесь используется -L, чтобы для символических ссылок возвращалось право собственности на устройства, а не символическая ссылка ).

Или используйте readarrayдля каждой строки ввода, который будет сохранен в массиве.

readarray -t array < <(ls -Ll /dev | awk '/tty/{print $3}')

Или вы можете использовать оператор split+glob:

set -o noglob # disable glob part
IFS=$'\n'     # split on newline
array=($(ls -Ll /dev | awk '/tty/{print $3}')) # invoke split+glob by leaving
                                               # the $(...) unquoted.

Обратите внимание, что ttyищется во всем выводе ls -Ll, включая имя пользователя и группы, имя файла (и цель символической ссылки, если вы опустите-L). Если вы хотите учитывать только имя файла, вы можете сделать

ls -Lld /dev/*tty* | awk '{print $3}'

вместо этого.

С помощью zshможно сделать:

zmodload zsh/stat
stat -s -A array +uid /dev/*tty*

(что было бы полезно также работать с именами пользователей, содержащими пробелы ).

3
24.08.2019, 04:56
2 ответа

Похоже, что параметры useradd или adduser в RHEL 7 более ограничены по сравнению с другими дистрибутивами. Я решил сделать следующее:

useradd ${un} 2>&- &
pid=$!; wait $pid; sync
{ grep "useradd\[${pid}\]" ${authlog} | tail -n 2; } >> ${logfile}

Then I simply verify whether the user exists and continue accordingly.

Это выполнит useradd в фоновом режиме, что необходимо для того, чтобы $! покажет мне PID этого конкретного процесса. Затем он будет искать в /var/log/secure идентификатор процесса в обратном порядке и записывать результат в мой собственный файл журнала. Синхронизация или пауза (сон 3 )необходимы, но не должны снижать производительность.

1
27.01.2020, 21:20

ВАРИАНТ 1 (RHEL,DEBIAN)

Вот две дополнительные возможности, доступные для RHEL, основанные на инструментах inotify -(, которые не установлены по умолчанию, насколько я помню ). Канал /dev/nullпредназначен для предотвращения стандартного вывода на терминал,потому что -qq не был таким тихим, как описано.

Для дистрибутивов DEBIAN измените/var/log/secureна/var/log/auth.logи, очевидно, sudo, но фактически войдите в систему как root-, чтобы настроить этот тип системы -широкий мониторинг -на самом деле может быть одним из подходящих вариантов использования root.

1.Отслеживание /var/log/secureизменений фона:

    while inotifywait -qq -e modify /var/log/secure; 
       do 
       if tail -n1 /var/log/secure | grep useradd > /dev/null; 
         then 
           tail -n1 /var/log/secure | grep useradd >> ~/useradd.log; 

           echo "Here you can also add conditional action if user already exists";    

       fi; 
    done &

Мне очень нравится именно этот вариант, потому что он позволяет разделять различные части (useradd, pam и т. д. )журналов auth.logили secureна отдельно отслеживаемые вложенные журналы.

2.Мониторинг использования самой команды useradd

while inotifywait -qq /usr/sbin/useradd; 
   do  
    if tail -n1 /var/log/secure | grep useradd > /dev/null; 
        then  tail -n1 /var/log/secure | grep useradd >> ~/useradd.log ;          
    fi; 
  done  &

Любая опция, упакованная в виде скрипта и выполняемая с помощью nohup [script] > /dev/null, будет непрерывно отслеживать в фоновом режиме, даже когда терминал закрывается.

ВАРИАНТ 2 (ДЕБИАН)

Или даже лучшим вариантом в вашем случае может быть использование вместо этого adduserи создание /usr/local/sbin/adduser.local, которое будет выполнено после завершения команды adduser

если вы создаете adduser.localследующим образом:

#!/bin/bash

# arguments passed in the following order: username uid gid home-directory
    #adjust log path accordingly

echo "ADDUSER: $1 $2 $3 $4 $5" >> ~/adduser.log

Это должно дополнять файл журнала всякий раз, когда создается новый пользователь

ВАРИАНТ 3 (ВСЕ)

Да, вывод useraddфактически добавляется к/var/log/auth.log

проверил это как пример (sudo перед командами, очевидно)

$useradd dude
$cat /var/log/auth.log | tail -2

Aug 23 19:01:25 useradd[32230]: new group: name=dude, GID=1012
Aug 23 19:01:25 useradd[32230]: new user: name=dude, UID=1011, GID=1012, home=/home/dude, shell=/bin/sh

$useradd dude
$cat /var/log/auth.log | tail -1 

Aug 23 19:04:16 useradd[32328]: failed adding user 'dude', data deleted

В общем, я считаю, что вы ищете:

$ sudo grep -a "useradd" /var/log/auth.log

Это даст вам все записи журнала с именами и временем добавления пользователей в систему.

2
27.01.2020, 21:20

Теги

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