こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

バイナリファイルの解析方法

Unixでのlastコマンドをつくろうと思っています。

lastコマンドはwtmpxというバイナリファイルを参照しているらしいと分かり、
wtmpxを分析してlastコマンドと同じ出力結果を出そうとスクリプトを書いてます。
ただ、分析するため

od -c wtmpx

というコマンドが良いと思ったのですが、これではlastで得られるような時間(いつログインしたか)までは分かりませんでした。
このようなバイナリファイルを解析するにはどうすればよいでしょうか?

投稿日時 - 2011-08-11 06:38:58

QNo.6935395

暇なときに回答ください

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

wtmpxのフォーマットは man wtmpx で説明されていると思います。

> これではlastで得られるような時間(いつログインしたか)までは分かりませんでした。

整数値(1970年からの通算秒数)で書かれています。

FreeBSDのmanを引用すれば

== ここからマニュアルからの引用
#define _PATH_UTMP "/var/run/utmp"
#define _PATH_WTMP "/var/log/wtmp"
#define _PATH_LASTLOG "/var/log/lastlog"

#define UT_NAMESIZE 16
#define UT_LINESIZE 8
#define UT_HOSTSIZE 16

struct lastlog {
int32_t ll_time; /* ユーザが何時ログインしたか */
char ll_line[UT_LINESIZE]; /* 端末線名 */
char ll_host[UT_HOSTSIZE]; /* ユーザの出身ホスト */
};

struct utmp {
char ut_line[UT_LINESIZE]; /* 端末線名 */
char ut_name[UT_NAMESIZE]; /* ユーザのログイン名 */
char ut_host[UT_HOSTSIZE]; /* ユーザの出身ホスト */
int32_t ut_time; /* ユーザが何時ログインしたか */
};

lastlog ファイルは、 lastlog 構造体の線型配列であり、ユーザの UID でイン
デックスされています。 utmp ファイルは、 utmp 構造体の線型配列であり、端
末線番号 ( ttyslot(3) 参照) でインデックスされています。 wtmp ファイル
は、 utmp 構造体から成るバイナリログファイルであり、ファイルの終端に追記
されていきます。

== ここまでマニュアルからの引用


> このようなバイナリファイルを解析するにはどうすればよいでしょうか?

時刻が記録されている時点でエポックタイムではないかと予想できそうなので、lastコマンドで表示される時刻から数値を作りwtmpx内を検索すればわかったと思います。

ただ、Unixの場合そういったデータフォーマットはほぼマニュアルにありますので解析などせずとも調べが付くはずです。

未知のベンダ依存データなら解析する必要がでてくる事もありますが。

投稿日時 - 2011-08-12 10:19:23

お礼

ありがとうございます。 おかげで方向性が見えてきました。

投稿日時 - 2011-08-13 15:42:21