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*
(что было бы полезно также работать с именами пользователей, содержащими пробелы ).
Похоже, что параметры 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 )необходимы, но не должны снижать производительность.
Вот две дополнительные возможности, доступные для 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
, будет непрерывно отслеживать в фоновом режиме, даже когда терминал закрывается.
Или даже лучшим вариантом в вашем случае может быть использование вместо этого 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
Это должно дополнять файл журнала всякий раз, когда создается новый пользователь
Да, вывод 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
Это даст вам все записи журнала с именами и временем добавления пользователей в систему.