我试图将“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)是必要的,但不应损害性能。