"useradd" 결과를 로그 파일로 출력하려고 하는데 안타깝게도 자세한 옵션이 없습니다. 예를 들어 "useradd 친구"는 사용자가 이미 존재하지 않는 한 출력이 없습니다.
다음과 같은 작업을 수행하고 싶습니다: useradd -v 친구 > $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)
inotify-tools를 기반으로 RHEL에 사용할 수 있는 두 가지 추가 옵션이 있습니다(내가 아는 한 이 옵션은 기본적으로 설치되지 않습니다). 파이프 /dev/null
는 -qq가 설명된 것만큼 조용하지 않기 때문에 터미널로의 표준 출력을 방지하기 위한 것입니다.
~을 위한데비안유통, 변화 /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 &
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(데비안)
또는 귀하의 경우 더 나은 옵션은 명령이 완료된 후에 실행될 것을 사용 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
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.
그러면 $!가 해당 특정 프로세스의 PID를 표시하는 데 필요한 useradd가 백그라운드에서 실행됩니다. 그런 다음 /var/log/secure 프로세스 ID를 역순으로 검색하고 출력을 내 로그 파일에 기록합니다. 동기화 또는 일시 중지(수면 3)가 필요하지만 성능이 저하되어서는 안 됩니다.