시스템에 로그인되지 않은 사용자 수를 확인하는 명령이 있습니까?
로그인한 사용자 수와 로그인하지 않은 사용자 수를 계산하는 쉘 스크립트를 작성하려고 합니다.
답변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
하고 대신 사용할 수도 있습니다. 이는 일치하는 항목을 제외하고 두 번째 매개변수에 있는 고유 항목만 표시하려는 의미를 사용해야 합니다 .join
join
join -v 2
getent ...
-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 옵션을 사용하면 -E
OR 조건 하에서 여러 문자열을 일치시킬 수 있습니다. 이 -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