いますぐ実践! Linuxシステム管理

[バックナンバーのトップへ] [Linux システム管理のトップへ]


いますぐ実践! Linux システム管理 / Vol.026 / 読者数:459名

こんばんは,うすだです.

今週後半は,遅い夏休みをとって,長野県あたりを旅行してきました.

家族がそれぞれ行きたいところ,やりたいことを詰め込んだため, かなりハードなスケジュールとなりました.
それでも,長年の夢だった美ヶ原高原美術館や,栗のメッカである小布施など, 行きたいところへ行くことができ,満足しています.

一応ノートパソコンを持っていき, 電話回線経由でネットにつなげられる準備はしていきましたが, する気がなかったり,つながらなかったりで, 結局一度もネットにつなぐことなく,旅を過ごしました.

1日1回はネットにアクセスしないと死んでしまうのではないか,と思っていましたが, まったくそんなことはありませんでした.
たまには,そんな日々があってもよいのではないか,と思います.

そんなわけで,完全に準備不足の状態で,お届けをいたしております.
そ,それでは,今日も,はりきってまいりましょう!

今週のお題 - ログイン情報をでっちあげる

はい,先週は,ログイン情報が記録されている wtmp について, ご紹介をしました.

Vol.025 - ログイン情報を知る
http://www.usupi.org/sysad/025.html

詳しくは,上記を見ていただくとして,乱暴にまとめますと, ログインと呼べる行為やそれに準ずることを行うと, wtmp に記録されるようになっている,というお話でした.

しかし,それは,既存のサービスが wtmp に記録するように, 実装されているからなわけですね.そうなっていないサービスや, 自作したものなどに対しても,wtmp に記録を残せると, last コマンドなどで確認することができ,便利になります.

というわけで,今週は,wtmp に記録するものを作ってみようと思います.

ただし,さすがに,いきなり /var/log/wtmp に書き込んで, なにか問題が発生すると,責任問題が発生したりなどしますと,お互い, 非常にまずい状況に陥ってしまいます.
ですので,どうなってもいいテスト環境上か,wtmp をコピーしたもので, まず試していただければと思います.(いや,是非そうしてください.)

さて,いつもの如く,結論から申し上げますと,
updwtmp() という関数を用いれば,ログイン情報を追加できます.

  #include <utmp.h>

  void updwtmp(const char *wtmp_file, const struct utmp *ut);

すみません,今回は,ご覧の通り,C 言語を使います.
(Perl で updwtmp を呼べるようにしようと思いましたが, 準備不足のため見合わせていただきます.申し訳ありません…)

まず,第1引数 wtmp_file は,wtmp のパスを指定します.
/var/log/wtmp であれば,_PATH_WTMP を指定すればいいです.
コピーした wtmp を使うなら,そのパス名を指定します.

第2引数 ut は,utmp 構造体のポインタを指定します.
utmp 構造体は,Linux(glibc)の場合,/usr/include/bits/utmp.h で定義されています.例を以下に示します.

  struct utmp
  {
    short int ut_type;           /* ログインの型(後述) */
    pid_t ut_pid;                /* プロセスID */
    char ut_line[UT_LINESIZE];   /* デバイス名(tty名など) */
    char ut_id[4];               /* inittab のID */
    char ut_user[UT_NAMESIZE];   /* ユーザ名 */
    char ut_host[UT_HOSTSIZE];   /* ホスト名 */
    struct exit_status ut_exit;  /* 終了の状態 */
    long int ut_session;         /* セッションID */
    struct timeval ut_tv;        /* このエントリの生成時間 */
    int32_t ut_addr_v6[4];       /* リモートホストのアドレス */
    char __unused[20];           /* 予約(未使用) */
  };

これが,wtmp の1つのエントリの情報です.
だいたい見ての通りですが,ut_type に対しては,ログイン時には USER_PROCESS を, ログアウト時には DEAD_PROCESS を指定するようです.

では,サンプルプログラムを以下に示します.
リストを全部載せると暴動が起こりそうですので,以下をご覧ください.

ソースコードを覗き見るだけ
http://www.usupi.org/sysad/026-1_c.txt
ソースコード一式を得る
http://www.usupi.org/sysad/026.tgz

一式を得た方は,以下のようにコンパイルしてください.
tar コマンドで伸長すると,026 というディレクトリの下に一式ができています. make コマンドを実行すれば,wtmpset という実行形式ファイルが作成されます.

  % tar xfz 026.tgz
  % cd 026
  % make

これをとりあえず動かしてみるには,以下のように実行してください.
/var/log/wtmp をカレントディレクトリにコピーし,それに対して記録を行います.

  % cp /var/log/wtmp .
  % ./wtmpset
  Usage: ./wtmpset wtmpfile {i|o} pid line user
  % ./wtmpset ./wtmp i 1234 test1 usu
  (数分待ちます)
  % ./wtmpset ./wtmp o 1234 test1 usu

wtmpset の引数は,以下の通りです.
第1引数は,記録する wtmp ファイルを指定します. /var/log/wtmp を指定するときは,緊張しながら行ってください.
第2引数は,i だとログイン,o だとログアウトです.安直ですね.
第3引数は,プロセスID です.
第4引数は,デバイス名です.
第5引数は,ユーザ名です.

last コマンドで確認してみましょう.

  % last -f ./wtmp | head
  usu    test1                   Mon Sep  5 00:54 - 00:57  (00:03)
  ...後略

このように記録されていれば,成功です.
ちなみに,ログイン情報だけを記録すると,現在ログイン中だという出力になります.

  % ./wtmpset ./wtmp i 1235 test2 usu
  % last -f ./wtmp | head
  usu    test2                   Mon Sep  5 01:49 - still logged in

ただし,現在動作していないプロセスID を指定すると, ログアウトしていないよという出力になります.

  % ./wtmpset ./wtmp i 9999 test3 usu
  % last -f ./wtmp | head
  usu    test3                   Mon Sep  5 01:57 - gone - no logout

以上,wtmp ファイルへの書き込み方法について,ご紹介しました.
実際に使うことはほとんどないかもしれませんが, こんなふうに記録しているということを知っているだけでも, なにかの時に役に立つのではないかと思います.お暇でしたら,試してみてください.

宿題の答え

先週の宿題は,

  root でログインせずに,一般ユーザでログインして,root の権限で何
  か行う時は,su や sudo を使った方がいい理由は,なんでしょうか?

でした.

root でログインして作業すると, だれが root になって作業したのかがわかりませんので, 何か問題が起こった時に困ります.
ですが,su や sudo を使うと,誰が root になったかということが記録されるため, 問題が起こった時に,状況を聞くことができます.

ですので,普段は一般ユーザで使用し,root の権限が必要になった時にだけ, su や sudo を使って作業を行いましょう.

今週の宿題

今週の宿題は,こちらです.

  wtmp ファイルを読み出すプログラムを作ってみましょう

です.
last コマンドはわかりやすく出力してくれますが,せっかくですので, 各エントリを,そのままに近い状態で出力するものを作ってみましょう.
(C 言語じゃないと,実装しづらいかもしれません….)

あとがき

冒頭でも述べましたが,平日に休みを取得して,旅行に行きました.
平日に…ということは,その間,仕事を放り出して行ってきたわけです.

こんなとき,お客様に,なんと言っていいのか,悩みます.
特にせっぱつまっていなければ,正直に夏休みと言えるのですが, 納期が迫っているような状況ですと,さすがにまずいなと思うわけです.
(そんな状況で夏休みを取得する私は,すでに社会人失格ですが….)

とはいえ,旅館をすでに予約していましたので, 「家族+お金」と「仕事」を天秤にかけた結果,前者へ傾くことに決めました.

ま,結局,何も言わずに行きました.出荷作業は,他の人にお願いして. いちおう,ばれなかったようですが,周囲に迷惑をかけた, という事実は拭えないわけで,未だに,胸のあたりがしっくりきません.

答えなんてない気もしますが,ときには悩むことも大事だろうと思いますので, もう少し,もんもんと苦しんでみたいと思います.

今週も,ここまで読んでいただき,ありがとうございました.
それでは,また来週,お会いしましょう!

「いますぐ実践! Linux システム管理」の解除は,以下からどうぞ.
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは,こちらにほぼ全部そろっています.
http://www.usupi.org/sysad/backno.html

「栗日記」−最初はそんなに栗好きではありませんでしたが,今は!
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本