내 질문은 현재 Linux 데스크톱을 사용하고 있는 셸에서 사용자 이름을 얻는 방법입니다("일반" 데스크톱 시스템에서는 일반적으로 활성 사용자가 한 명만 있습니다. 즉, 여기에는 서버 시스템이 없고 일반적인 노트북만 있습니다). 정말로 서버 시스템을 상상하고 싶다면 모든 것을 나열할 수 있습니다.긍정적인사용자.
따라서 cron 작업(또는 유사한 작업)으로 루트로 실행되는 스크립트의 경우 시스템의 현재/모든 활성 사용자를 가져오고 싶습니다.
현재 로그인된 사용자를 사용하거나 가져올 수 있다는 w
것을 알고 있습니다 . 괜찮습니다. 하지만 사용자가 로그인했다고 해서 실제로 현재 로그인되어 있다는 의미는 아닙니다.who
users
사용데스크탑, 제가 아는 모든 데스크탑 환경에서는 사용자가 로그인 후 다른 사용자로 전환할 수 있기 때문입니다.
또한 이를 사용하여 마지막으로 로그인한 사용자를 가져올 수도 있지만 last
, 이는 사용자가 여전히 활성 사용자임을 보장하지 않습니다.
그럼 어떻게 할 수 있나요? 다양한 데스크탑 환경(GNOME, KDE 등)에 대한 특정 솔루션을 갖는 것은 괜찮지만, 물론 상호 호환 가능한 솔루션이 선호됩니다.
답변1
현재 많은 배포에서 로그인 세션(그래픽 및 비그래픽)은 다음을 사용 logind
하여 세션을 나열할 수 있습니다.
loginctl list-sessions
그런 다음 다음을 사용하여 각 세션의 속성을 표시합니다.
loginctl show-session ${SESSIONID}
또는
loginctl session-status ${SESSIONID}
( ${SESSIONID}
적절하게 교체) 두 변형의 차이점은 show-session
쉽게 구문 분석되도록 설계되었으며 session-status
사람이 소비할 수 있도록 고안되었다는 것입니다. 활성 세션은 상태로 식별되며 쿼리를 직접 사용할 수 있습니다.
loginctl show-session -p State ${SESSIONID}
이것은 출력됩니다
State=active
활성 세션의 경우. 전체 show-session
출력은 어떤 사용자가 연결되어 있는지, 어떤 TTY가 사용되고 있는지, 원격 세션인지, 그래픽 세션인지 등을 알려줍니다.
logind
시스템이 다중 시트로 구성되거나 원격 세션이 존재하는 경우 다중 활성 세션이 있을 수 있습니다 .
함께 모아서,
for sessionid in $(loginctl list-sessions --no-legend | awk '{ print $1 }')
do loginctl show-session -p Id -p Name -p User -p State -p Type -p Remote $sessionid
done
어떤 세션이 활성화되어 있고 누가 사용하고 있는지 확인하는 데 필요한 모든 정보를 제공합니다.
for sessionid in $(loginctl list-sessions --no-legend | awk '{ print $1 }')
do loginctl show-session -p Id -p Name -p User -p State -p Type -p Remote $sessionid | sort
done |
awk -F= '/Name/ { name = $2 } /User/ { user = $2 } /State/ { state = $2 } /Type/ { type = $2 } /Remote/ { remote = $2 } /User/ && remote == "no" && state == "active" && (type == "x11" || type == "wayland") { print user, name }'
모든 활성 사용자의 식별자와 로그인 정보는 그래픽 세션을 통해 인쇄됩니다.
이제 이 LockedHint
속성은 지정된 세션이 잠겨 있는지 여부를 나타냅니다.
for sessionid in $(loginctl list-sessions --no-legend | awk '{ print $1 }')
do loginctl show-session -p Id -p Name -p User -p State -p Type -p Remote -p LockedHint $sessionid | sort
done |
awk -F= '/Name/ { name = $2 } /User/ { user = $2 } /State/ { state = $2 } /Type/ { type = $2 } /Remote/ { remote = $2 } /LockedHint/ { locked = $2 } /User/ && remote == "no" && state == "active" && (type == "x11" || type == "wayland") { print user, name, locked == "yes" ? "locked" : "unlocked" }'
또한 활성 세션이 잠겨 있는지 여부도 나타냅니다.
답변2
아래와 같이 bash 기능을 사용하고 있습니다.
function Xowner() {
for pid in $(ps -houid --ppid $(ps -hoppid $(pgrep X))) ; do
[ "$pid" = "0" ] && continue
id -n -u $pid
break
done
}
이 기능의 목적은 기본적으로 Xserver의 형제 프로세스의 루트가 아닌 "첫 번째" UID를 선택하는 것입니다. man ps
자세히보다. 귀하의 사용 사례에 여러 개의 X 서버가 포함될 수 있다면 어떤 서버부터 시작해야 할지 더 주의를 기울여야 할 것입니다.
답변3
대부분의 Unix 계열 시스템(예:위키피디아) 주문하다
$ whoami
명령을 실행하는 현재 사용자의 이름을 제공합니다.
$ whoami
dessert
$ sudo whoami
root