红帽企业 Linux 中的详细 useradd

红帽企业 Linux 中的详细 useradd

我试图将“useradd”的结果输出到日志文件,但不幸的是没有详细的选项。例如:“useradd dude”没有输出,除非用户已经存在。

我想做类似的事情: useradd -v dude > $logfile

我想我可以检查结果代码,如果 0 查询用户的 UID 和 GID 并将其写入日志文件,例如:

log=logfile
un=dude
if useradd ${un} &>> $log; then
  uu=$(getent passwd ${un} | cut -d: -f3)
  ug=$(getent passwd ${un} | cut -d: -f4)
  uh=$(getent passwd ${un} | cut -d: -f6)
  echo "User ${un} UID:${uu} GID:${ug} ${uh} successfully added." >> $log
fi 


# cat logfile
User dude UID:1000 GID:1000 /home/dude successfully added.
useradd: user 'dude' already exists

但我想知道是否有更简单的选择。

操作系统:RHEL 7.7

解析 /var/log/secure 可能是另一个想法:

un=dude
useradd ${un} 2>&- &
bpid=$!
wait $bpid
ret=$?
sync
(grep "useradd\[${bpid}\]" /var/log/secure | tail -n 2) >> logfile

if [[ ${ret} -eq 0 ]]; then
  echo do whatever you need to do
else
  echo error
  exit 1
fi

# ./abc
do whatever you need to do
# ./abc
error

# cat logfile
Aug 24 03:48:07 vm7031 useradd[4929]: new group: name=dude, GID=1000
Aug 24 03:48:07 vm7031 useradd[4929]: new user: name=dude, UID=1000, GID=1000, home=/home/dude, shell=/bin/bash
Aug 24 03:48:09 vm7031 useradd[4940]: failed adding user 'dude', exit code: 9

但似乎需要同步,否则 grep 将无法工作。不确定,似乎有点矫枉过正。

答案1

选项 1(RHEL、DEBIAN)

这里有两种可供 RHEL 使用的附加选项,基于 inotify-tools(据我所知,默认情况下并未安装这些选项)。该/dev/null管道是为了防止标准输出到终端,因为 -qq 并不像描述的那么安静。

为了德比安分布、变化 /var/log/secure/var/log/auth.log,显然sudo,但实际上登录 as 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 &

auth.log我真的很喜欢这个特定的选项,因为它允许将或日志的不同部分(useradd、pam 等)分隔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(Debian)

或者在您的情况下更好的选择可能是使用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

与其他发行版相比,RHEL 7 上的 useradd 或 adduser 选项似乎受到更多限制。我决定执行以下操作:

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 中的进程 ID,并将输出写入我自己的日志文件中。同步或暂停(睡眠 3)是必要的,但不应损害性能。

相关内容