kkAyatakaのメモ帳。

誰かの役に立つかもしれない備忘録。

wの元utmp

Linuxのログイン情報の取得について調べているときに、wコマンドの実装について気になった。巡り巡って/var/run/utmpgetutentにたどり着くんだけど、ファイルについてはwコマンドのman pageに記載があった。

  • getutxent APIでutmpの中身を読むことでログイン情報を得る
  • getutxentPOSIX APIとして提供されている

ファイルが特定できたときに、まあ、とりあえずとcat /var/run/utmp打ったらコンソールが化けました。バイナリやんか...tmuxから打って大変なことになった。

getutxentでログインユーザーの情報をえる

getutentgetutxentがあるがドキュメントの通りgetutxentを使う。

#include <utmpx.h>

#include <iostream>

int main() {
    setutxent();
    struct utmpx * ut = 0;
    while((ut = getutxent()) != NULL) {
        std::cout << ut->ut_user << ", type:" << ut->ut_type
            << ", session:" << ut->ut_session
            << ", line:" << ut->ut_line
            << ", id:" << ut->ut_id
            << std::endl;
    }
    endutxent();
}

ビルドして実行すると以下のように出力される。ut_sessionはなんでか0でした。ログイン中のユーザー名やpidなどが取得できる。

$ ./a.out
reboot, type:2, session:0, line:~, id:~~
runlevel, type:1, session:0, line:~, id:~~
ayataka, type:7, session:0, line::0, id:
ayataka, type:7, session:0, line:pts/0, id:/0
test, type:7, session:0, line::1, id:
test, type:8, session:0, line:pts/4, id:/4
test, type:7, session:0, line:pts/6, id:/6
ayataka, type:7, session:0, line:pts/8, id:/8