- 締切済み
バイナリファイルの解析方法
Unixでのlastコマンドをつくろうと思っています。 lastコマンドはwtmpxというバイナリファイルを参照しているらしいと分かり、 wtmpxを分析してlastコマンドと同じ出力結果を出そうとスクリプトを書いてます。 ただ、分析するため od -c wtmpx というコマンドが良いと思ったのですが、これではlastで得られるような時間(いつログインしたか)までは分かりませんでした。 このようなバイナリファイルを解析するにはどうすればよいでしょうか?
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- saijyo_739
- ベストアンサー率53% (119/222)
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の場合そういったデータフォーマットはほぼマニュアルにありますので解析などせずとも調べが付くはずです。 未知のベンダ依存データなら解析する必要がでてくる事もありますが。
お礼
ありがとうございます。 おかげで方向性が見えてきました。