grep을 사용하여 어떤 사용자가 sudo를 사용하는지 확인하는 방법은 무엇입니까?

grep을 사용하여 어떤 사용자가 sudo를 사용하는지 확인하는 방법은 무엇입니까?

루트 권한이 있습니다. /etc/passwd가 있는 파일 행에서 선택하고 , 사용자 이름(필드 1)을 가져오고, 사용된 경우 /bin/bash로그 파일에서 찾습니다 . 을 사용하여 사용자 이름을 찾았지만 확인 방법을 모르겠습니다. 그들은 sudo로 사용됩니다. 사용자 이름과 sudo를 사용하는 방법은 무엇입니까 ? 아니면 다른 명령을 사용해야 합니까?/var/log/auth.logsudogrepcutgrep

답변1

다른 방향에서 보면: 최근 사용자를 모두 가져오고 sudo로그인 셸이 사용된 사용자를 나열합니다.bash

sed -nE 's/.*[0-9] ([^ ]+) sudo:.*/\1/p' </var/log/auth.log | sort -u |
while read user; do
    getent passwd "$user" |
    awk -F ':' '$NF == "/bin/bash" { print $1 }'
done

sed표현식은 이미 사용된 사용자의 사용자 이름을 추출하고 sudo이를 sort -u정렬하고 중복을 제거한 다음 루프를 통해 나머지 사용자가 /bin/bash로그인 셸로 설정되었는지 테스트합니다. 있는 경우 사용자 이름을 인쇄하십시오.

auth.log파일이 정말 크고 각 사용자에 대해 한 번만 구문 분석하고 싶지 않다면 bash이 순서대로 수행하는 것이 좋습니다. 대신 getent로그 파일의 각 사용자에 대해 한 번씩 실행합니다. 하지만 우리는 이것을 개선할 수 있습니다...

제안된 순서대로:

getent passwd |
awk -F ':' '$NF == "/bin/bash" { printf("s/.*[0-9] (%s) sudo:.*/\\1/p\n", $1) }' |
sed -nE -f - /var/log/auth.log | sort -u

여기서 awk스크립트는 sed스크립트를 생성합니다. 내 Ubuntu 테스트 시스템에서 이 스크립트는 다음과 같습니다.

s/.*[0-9] (root) sudo:.*/\1/p
s/.*[0-9] (ubuntu) sudo:.*/\1/p
s/.*[0-9] (myself) sudo:.*/\1/p
s/.*[0-9] (otheruser) sudo:.*/\1/p

sed그런 다음 이 스크립트는 로그 파일에 대해 실행되어 가장 최근에 사용한 사용자의 이름을 auth.log인쇄합니다 . 결과를 정렬하고 중복 항목을 제거합니다.bashsudo

여기서는 로그 파일을 여러 번 구문 분석하지 않으며 여러 번 호출할 필요도 없습니다 getent.

답변2

/etc/passwd이것은 쉘을 사용하여 in 각 사용자를 반복한 /bin/bash다음 grepin 사용자에 대해 루프를 수행한 /var/log/auth.log다음 다섯 번째 필드가 "sudo:"이고 여섯 번째 필드가 다음을 사용하는 awk사용자 이름인지 확인합니다 ( 다음에도 쉘이 있습니다 :sortuniqsudo/bin/bash/etc/passwd

for user in $(awk -F: '$7 == "/bin/bash"{print $1}' /etc/passwd);do 
  grep "$user" /var/log/auth.log|\
  awk -v user="$user" '$5 == "sudo:" && $6 == user {print user}'
done | sort | uniq

관련 정보