현재 쉘 세션이 로그인 세션 내에서 실행되고 있는지 확인하려고 합니다 su
.
이 상황을 테스트하는 가장 좋은 방법은 무엇입니까?
답변1
logname
명령을 봅니다 . logname은 utmp 로그에서 제공한 대로 제어 터미널에 로그인한 사용자의 사용자 이름을 인쇄합니다.
tk-mbp:~ tkennedy$ id -g -rn
staff
tk-mbp:~ tkennedy$ id -u -rn
tkennedy
tk-mbp:~ tkennedy$ logname
tkennedy
tk-mbp:~ tkennedy$ su -
Password:
tk-mbp:~ root# id -g -rn
wheel
tk-mbp:~ root# id -u -rn
root
tk-mbp:~ root# logname
tkennedy
이 예는 Mac OS X에서 가져온 것이므로 명령 사용은 id
다른 운영 체제와 다를 수 있지만 로그 이름 사용은 Mac OS 간에 일관됩니다.
logname을 사용하면 명령에 의해 반환된 사용자가 다음과 같다고 가정할 수 있습니다 id
.아니요반환된 사용자와 동일 logname
하면 현재 셸 세션은 su, sudo 또는 셸에서 권한 변경을 허용하는 다른 도구에서 실행되고 있습니다.
답변2
현재 쉘이 실행되는지 테스트하려면 다음을 수행하십시오 su
.
[ "$(ps -o comm= $PPID)" = "su" ]
su
로그인 후 사용자가 호출하는지 여부를 테스트하려면 많은(전부는 아님) 시스템에서 LOGNAME
(일반적으로 초기 로그인 시 설정) USER
또는 (현재 사용자를 식별함)과 id -un
비교할 수 있습니다. 이는 LOGNAME
쉽게 속일 수 있습니다(환경 변수임). 그러나 다른 솔루션의 경우에도 마찬가지입니다(예: 모든 솔루션은 ln -s /bin/su ~/sh; ~/sh
프로세스 이름에 따라 숨겨집니다).su
답변3
내가 연결한 솔루션 중 하나는 다음과 같습니다.
pstree -p $$ |
grep -oP '[r]oot su .*(\w+)' |
sed -n -E 's/.* ([[:alnum:]]+)$/\1/p'`
나무현재 쉘 프로세스 PID($$)의 조상 트리를 나열하려면 -p 플래그를 사용하십시오.
grep"root su"가 포함된 행을 찾습니다. (저는 grep 프로세스 자체를 반환하지 않기 위해 [r] 트릭을 사용합니다.)
sed결과를 정리하고 줄 끝에 현재 사용자 이름만 인쇄합니다. (부모 프로세스의 사용자를 출력한다면 더 도움이 될 것입니다.)