로그인하지 않은 사용자를 찾는 명령

로그인하지 않은 사용자를 찾는 명령

시스템에 로그인되지 않은 사용자 수를 확인하는 명령이 있습니까?

로그인한 사용자 수와 로그인하지 않은 사용자 수를 계산하는 쉘 스크립트를 작성하려고 합니다.

답변1

사용자 그룹 나열

다음 명령을 사용하여 모든 로컬 사용자 목록을 가져올 수 있습니다.

$ getent passwd | awk -F: '{print $1}'

노트: getent로컬 사용자가 없고 sssd(또는 유사한 서비스를 실행하여 LDAP 사용자를 가져오며) /etc/nsswitch.conf권한이 파일로 제한되어 있다는 가정 하에 로컬 사용자를 반환합니다. 즉, NIS 또는 NIS+와 같은 항목이 포함되지 않습니다. 순수 로컬 사용자의 경우 awk -F: '{print $1}' /etc/passwd.

현재 로그인된 사용자 목록:

$ who

현재 로그인되지 않은 사용자 목록:

$ grep -Fxvf <(who | awk '{print $1}' | sort -u) \
    <(getent passwd | awk -F: '{print $1}')

마지막 항목은 로그인한 사용자 목록을 가져오고 로그인한 사용자를 제외한 모든 사용자 목록을 표시하는 데 사용됩니다 grep -vf.

카운트 받기

개수를 얻으려면 wc -l명령 끝에 추가하면 됩니다.

로그인하지 않았습니다
$ grep -Fxvf <(who | awk '{print $1}' | sort -u) \
    <(getent passwd | awk -F: '{print $1}') | wc -l
53
로그인
$ who | awk '{print $1}' | sort -u | wc -l
1

grep 플래그

-F, --fixed-strings
        Interpret PATTERN as a list of fixed strings, separated by newlines, 
        any of which is to be matched.

-x, --line-regexp
        Select only those matches that exactly match the whole line.

-v, --invert-match
        Invert the sense of matching, to select non-matching lines.

-f FILE, --file=FILE
        Obtain patterns from FILE, one per line.  The empty file contains 
        zero patterns, and therefore matches nothing.

grep 대신 Join 사용

이러한 유형의 문제는 자동차 운전실에서 더 많이 발생하므로 포기 grep하고 대신 사용할 수도 있습니다. 이는 일치하는 항목을 제외하고 두 번째 매개변수에 있는 고유 항목만 표시하려는 의미를 사용해야 합니다 .joinjoinjoin -v 2getent ...

매뉴얼 페이지 추가
-a FILENUM
        also print unpairable lines from file FILENUM, where FILENUM is 
        1 or 2, corresponding to FILE1 or FILE2

-v FILENUM
        like -a FILENUM, but suppress joined output lines


$ join -v 2 <(who | awk '{print $1}' | sort -u) \
    <(getent passwd | awk -F: '{print $1}' | sort) | wc -l
53

노트:using에 대한 유일한 주의 사항 join은 두 목록을 모두 정렬해야 하므로 | sort에 추가해야 한다는 것입니다 getent ....

답변2

이 줄은 작동합니다 :

grep -Ev $(users | sed 's/ /|/g') /etc/passwd | awk -F: {'print $1'}

어떻게 작동하나요?:

의 출력에는 로그인한 사용자의 별도 목록이 users | sed 's/ /|/g'제공됩니다 .|

grep 옵션을 사용하면 -EOR 조건 하에서 여러 문자열을 일치시킬 수 있습니다. 이 -v옵션은 주어진 문자열/패턴과 일치하지 않는 모든 것을 인쇄합니다. -E를 결합하면 -v파이프로 구분된 문자열을 포함하지 않는 출력의 모든 줄이 나열됩니다 users | sed 's/ /|/g'. 마지막으로 awk사용자 이름만 필터링 하는 데 사용됩니다 .

답변3

현재 로그인한 사용자 수를 한 파일에 저장하고 전체 사용자 수를 다른 파일에 저장 comm하고 처리하는 스크립트를 작성하고 싶을 수도 있습니다.

예를 들어:

#!/bin/bash

w | awk 'NR > 2 {print $1}' | sort > logged.txt #sorted list of logged users
awk -F':' '{ print $1}' /etc/passwd | sort > allusers.txt #sorted list of all users
comm -23 allusers.txt logged.txt #find lines unique to allusers.txt

관련 정보