可能な限りクロスプラットフォームの方法で、どのユーザーがプロセスのセッションの所有者であるかを判別する方法を実装しようとしています。
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構造を使用してそれを読み込もうとしたが、実際にはパターンに適合しません。
多分私は単純化しすぎていますが、あなたはこれをすることができますか?
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デバイスの所有者が同じでない場合はアクセスを許可しますプロセスの所有者は、アクセスを拒否します。
Ptsがある場合、それはインタラクティブであると想定しています。つまり、ptsのような疑似端末が接続されています。私はサーバーのbash監査でこれを使用しています。たとえば、ユーザーが_Sudo su -
_を実行してrootに切り替えた場合でも、ユーザー名が表示されます。
_stat -c %U $(tty)
_
tty
name、つまり_/dev/pts/0
_を取得しますShellが$(tty)
を展開すると、次のようになります。
_stat -c %U /dev/pts/0
_
_ls -l /dev/pts
_に行くと、すべての疑似端末の所有者を見ることができます。
奇妙なことに、これまで適切に対応されていませんでした。
#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);