가능한 가장 크로스 플랫폼 방식으로 어떤 사용자가 특정 프로세스 세션의 소유자인지 확인하는 방법을 구현하려고 합니다.
Linux에서는 /proc/PID/fd/0 -> /dev/pts/31
링크를 따라가서 터미널을 소유한 utmp 파일을 보면 프로세스의 pty를 추적할 수 있습니다. 예를 들어, AIX 6.1에서는 이를 어떻게 수행합니까? /proc/PID/fd
Linux와 같은 심볼릭 링크 대신 char 파일을 포함합니다. 또한 AIX 6.1의 utmp 파일에 있는 단일 항목의 정확한 구조는 무엇입니까? 7.1을 사용하여 읽어보세요 [http://www-01.ibm.com/support/knowledgecenter/ssw_aix_71/com.ibm.aix.files/utmp.h.htm]utmp 구조이지만 패턴에 실제로 맞지 않습니다.
답변1
pt가 있는 경우 대화형, 즉 첨부된 pt와 같은 의사 터미널이라고 가정합니다. 나는 이것을 서버의 bash 감사자에서 사용하고 있으며 sudo su -
사용자가 루트로 전환하더라도 사용자 이름을 제공합니다.
stat -c %U $(tty)
tty
이름을 얻으십시오 ./dev/pts/0
- stat를 사용하여 파일 소유자 이름 얻기
쉘은 $(tty)
다음과 같이 확장됩니다:
stat -c %U /dev/pts/0
원하는 경우 ls -l /dev/pts
모든 의사 터미널의 소유자를 볼 수 있습니다.
답변2
제가 지나치게 단순화한 것일 수도 있지만, 이렇게 할 수 있나요?
ps -p <pid> -F tty
예는 다음과 같습니다.
$ ps -p 6947010
PID TTY TIME CMD
6947010 pts/0 0:00 ksh
$ ps -p 6947010 -F tty=
pts/0
다음과 같은 방법으로 특정 프로세스에 대한 액세스를 허용할지 또는 거부할지 결정할 수 있습니다.
먼저, 다음을 사용하여 프로세스를 소유한 사람과 프로세스를 시작한 pts 장치를 확인할 수 있습니다.
$ ps -p <PID> -F tty=,user=
pts/X <username>
그런 다음 다음과 같이 pts/X 장치의 소유자를 확인하십시오.
$ ls -l /dev/pts/X
crw--w--w- 1 <username> <group> 21, 0 Apr 18 13:27 /dev/pts/0
/dev/pts/X의 소유자가 프로세스 소유자와 동일한 경우 로그인한 사용자가 프로세스를 시작하고 /dev/pts/X 장치의 소유자가 프로세스 소유자와 다른 경우 액세스 권한을 부여합니다. 또는 액세스를 거부합니다.
답변3
이상하게도 이전에는 제대로 된 응답을 받지 못했습니다.
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
int main(int argc, char **argv)
{
struct stat sb;
stat(argv[1], &sb)
printf("%d\n", sb.st_uid);
}
U*x 간에 이식 가능하며 utmp를 방지합니다. 늦었지만 다른 사람들에게 도움이 될 수 있습니다.
사용자 이름이 필요한 경우:
#include <pwd.h>
...
printf("%s\n", getpwuid(sb.st_uid)->pw_name);