web-dev-qa-db-ja.com

プロセスのセッションの所有者を特定する

可能な限りクロスプラットフォームの方法で、どのユーザーがプロセスのセッションの所有者であるかを判別する方法を実装しようとしています。

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構造を使用してそれを読み込もうとしたが、実際にはパターンに適合しません。

4
netikras

多分私は単純化しすぎていますが、あなたはこれをすることができますか?

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デバイスの所有者が同じでない場合はアクセスを許可しますプロセスの所有者は、アクセスを拒否します。

1
pichogve

Ptsがある場合、それはインタラクティブであると想定しています。つまり、ptsのような疑似端末が接続されています。私はサーバーのbash監査でこれを使用しています。たとえば、ユーザーが_Sudo su -_を実行してrootに切り替えた場合でも、ユーザー名が表示されます。

_stat -c %U $(tty)
_
  1. tty name、つまり_/dev/pts/0_を取得します
  2. Statを使用して、ファイル所有者名を取得します

Shellが$(tty)を展開すると、次のようになります。

_stat -c %U /dev/pts/0
_

_ls -l /dev/pts_に行くと、すべての疑似端末の所有者を見ることができます。

1
sdkks

奇妙なことに、これまで適切に対応されていませんでした。

#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);
0
user196420