저는 소규모 사무실에서 로컬 콘솔, SSH 및 NoMachine Workstation을 통해 원격으로 다양한 방법으로 시스템에 로그인하는 여러 사용자가 있는 시스템(RHEL 8 실행)을 관리하고 있습니다. 새 커널이 포함된 업데이트를 수행하거나 다른 이유로 컴퓨터를 재부팅해야 할 때 현재 로그인한 사용자가 없는지 확인하여 소프트웨어를 실행하는 사용자 컴퓨터를 중단하지 않도록 하고 싶습니다.
그래서 현재 로그인한 모든 사용자를 나열하는 명령을 원합니다.
나는 이 주제에 대해 많은 검색을 해왔고 이 질문에 대답하기 위해 내가 찾은 방법은 작동하지 않는 것으로 입증되었으므로 완전히 잘못된 것입니다.
명령 하고 who
, 수행하다w
users
아니요목록로그인한 모든 사용자. 이 글을 쓰고 있는 현재 문제의 컴퓨터에는 나를 포함해 3명의 사용자가 로그인되어 있습니다. 이 명령은 이 세 가지 중 하나만 나열합니다(그런데 저는 그중 하나가 아닙니다). 이 명령은 SSH를 통해 로그인하고 터미널이 열려 있는 사용자를 나열합니다. 다른 사용자는 TTY가 없지만 여러 GUI 응용 프로그램이 열려 있고 그의 X가 SSH를 통해 랩톱에 표시되지만 표시되지 않으며 나도 표시되지 않습니다(NoMachine을 통해 그래픽 로그인이 있습니다). 실제로 who -m
실행하면 출력이 반환되지 않습니다. 이를 사용하여 ps -ef
모든 프로세스를 나열하고 모든 사용자에 대해 현재 실행 중인 프로세스를 찾을 수 있습니다.
명령 last | grep 'still logged in'
(제안여기)는 위와 동일한 불완전한 목록을 생성합니다(동일한 소스에서 정보를 가져옵니다).
그렇다면 질문을 반복하자면, 로그인한 모든 사용자(일반적인 메커니즘을 통해 인증했으며 현재 사용자 ID로 실행되는 대화형 프로세스가 있는 사용자) 목록을 얻는 궁극적인 방법은 무엇입니까? 검색 결과 없이 이 작업을 수행하고 싶습니다 ps
.
편집 - 이 워크스테이션의 사용자는 모두 LDAP를 통해 인증되었지만 이것이 문제와 관련이 없음을 확인했습니다. 위와 동일한 방법을 통해 응답 who
하거나 users
로그인할 때 표시되지 않는 로컬 사용자 계정을 만들었습니다 .
답변1
Linux 시스템을 재부팅하려는 상황을 고려하여 다각적인 접근 방식을 취합니다.
먼저 파일을 생성하여 향후 로그인을 비활성화합니다 /etc/nologin
. 공백으로 두거나 다음과 같은 정보 텍스트를 입력할 수 있습니다.
"서버 재시작을 준비하기 위해 이 시스템에 대한 로그인이 일시적으로 비활성화되었으며 재시작이 (시간 및 날짜)에 예정되어 있습니다. (예상 종료 시간) 후에 다시 시도하십시오."
작업이 끝나면 /etc/nologin을 삭제하는 것을 잊지 마세요!
또한 다시 시작하면 지워지므로모두대화형이든 아니든 프로세스는 ps
사용자가 소유한 프로세스를 찾는 데 사용됩니다. 이를 위해서는 이러한 프로세스를 유지할 가치가 있는지 판단하기 위해 일부 수동 조사가 필요하지만 범위를 좁혀야 합니다. 여기서는 "시스템" 및 "사용자" UID에 대한 컷오프로 /etc/login.defs의 UID_MIN 값으로 1000을 하드코딩했습니다. 사용자 중 UID가 1000 미만인 경우 해당 숫자를 조정해야 합니다.
ps -eo pid,uid,args | awk '$2 >= 1000'
물론 ps
열을 원하는 대로 조정할 수 있습니다. 번역된 사용자 이름과 프로세스 시작 시간( ) 등을 추가할 수도 있습니다. 단, UID와 필드를 서로 동기화 ps -eo pid,uid,user,start,args
되도록 주의하세요 .ps
awk
고유한 사용자 이름 목록을 얻으려면 다음을 사용하세요.
ps -eo user,uid | awk 'NR>1 && $2 >= 1000 && ++seen[$2]==1{print $1}'
답변2
출력을 보고 싶지 않다고 말씀하신 것은 알지만 ps
, 출력을 자동화할 수 있다면 어떨까요?
$ join <(ps -aux | tail -n+2 | cut -d' ' -f1 | sort -u) \
<(getent passwd | grep -f <(grep '^/' /etc/shells) | cut -d: -f1 | sort)
root
terdon
조금 복잡해 보일 수도 있지만, 세부적으로 살펴보면 다음과 같습니다.
ps -aux | tail -n+2 | cut -d' ' -f1 | sort -u
: 모든 사용자를 표시하는 프로세스를 실행하고 첫 번째 줄 이후의 모든 줄이 인쇄되는 ps
출력을 전달 tail -n+2
하므로 헤더를 필터링 ps
한 다음 cut
사용자 이름을 인쇄하고 사용자 이름 목록을 전달하여 sort -u
정렬된 결과를 얻습니다. , 중복 제거 목록.
getent passwd | grep -f <(grep '^/' /etc/shells) | cut -d: -f1 | sort
: 여기서는 /etc/shells
슬래시로 시작하는 모든 줄을 선택하고(유효한 로그인 셸 목록을 제공해야 함) 이를 알려진 사용자 (LDAP 사용자를 포함해야 함) grep
에 대한 출력을 검색하는 셸에 대한 입력으로 사용합니다. 위의 결과는 실제 쉘( 또는 getent passwod
기타 등등)을 사용하는 사용자 목록이어야 합니다 ./usr/bin/nologin
/bin/false
마지막으로 두 명령의 출력이 입력으로 제공되며 join
출력 ps
과 유효한 로그인 쉘을 사용하는 사용자 목록에 모두 있는 사용자만 인쇄됩니다.
~/.bashrc
이것이 효과가 있다면 다음을 실행 중인 경우 이를 셸의 초기화 파일에 추가하여 bash
별칭으로 설정할 수 있습니다.
alias getUsers="join <(ps -aux | tail -n+2 | cut -d' ' -f1 | sort -u) <(getent passwd | grep -f <(grep '^/' /etc/shells) | cut -d: -f1 | sort)"
이는 완벽하지 않으며 일부 시스템 사용자에게 여전히 영향을 미칠 수 있습니다. 예를 들어 내 시스템에는 다음이 있습니다 git
.
$ getent passwd | grep git
git:x:996:996:git daemon user:/:/bin/bash
이 사용자가 언제 로그인한 상태로 표시될지는 잘 모르겠습니다. 아마도 일부 git
명령을 실행하는 동안? 어쨌든, 완벽과는 거리가 멀지만, 적어도 임시 해결 방법은 될 수 있습니다.