ある大学でシステム管理をしているのですが、リモートで監視をしているときに、
lastコマンドを使ってログインの情報をみているのですが、情報が多いので当日と
昨日の結果を表示させたいのですが、簡単に設定できようにはできないでしょうか。ご教授お願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

No.1 の補足です。

(あれだけではちょっと不親切なので…)

実際にこちらで動作している Perl スクリプトを載せておきます。
このスクリプトの名前が today だとすると、last | today でお望みの結果が得られます。

----------
#!/usr/local/bin/perl
use Time::Local;
@monstr = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
@ltime = localtime(time);
$p_today = sprintf("%s %2d", $monstr[$ltime[4]], $ltime[3]);
@ltime = localtime(time - 86400);
$p_yesterday = sprintf("%s %2d", $monstr[$ltime[4]], $ltime[3]);
while (<>) {
  last unless (/$p_today|$p_yesterday/);
  print;
}
----------

この回答への補足

何度も書いていたらすみません。
私も一応書いてみたのですが、プログラミングは初心者なので
うまくいきません。どこがおかしいのか、教えていただけないでしょうか。
micworld% more day.pl
#!/usr/local/bin/perl

@list = localtime(time - (24*60*60));

print "$list[3]\n";

micworld% more mon.pl
#!/usr/local/bin/perl

@list = localtime(time - (24*60*60));

$list[4]++;
print "$list[4]\n";

moicworld% more fwscript
#!/bin/csh
set mon=`./mon.pl`
set day=`./day.pl`
switch ($mon)
case 1:
echo Jan
breaksw
;;
case 2:
echo Feb
breaksw
;;
.
.
case 12:
echo Dec
breaksw
;;
endsw
set val=`date '+ %b %e '`
last | grep "$mon $day"
last | grep "$val"

補足日時:2002/01/29 15:36
    • good
    • 0

> うまくいきません。

どこがおかしいのか、教えていただけないでしょうか。

う~ん、見てて頭が痛くなってきた(失礼!)
Perl をご存じなのでしたら、もう一歩頑張って全部 Perl で書かれればよろしいのに…

それはともかくとして、

fwscript で月の数値を文字列に変換していますが、switch-case のところの echo は何でしょう?
これでは、単に Jan などの文字を表示しているだけで、$mon には代入されませんよね?
ここは、「set mon='Jan'」のようにしないと…

それから、「grep "$mon $day"」ですが、これでは、日が1日~9日の時に1桁ずれてしまいます。
つまり、「J a n sp sp 1」となるべきところが「Jan sp 1」になってしまいます。
これではマッチしませんね。

取りあえず気づいたのは、こんなところです。

(なお、このスクリプトでは昨日の分が先に表示されますが、私の書いたものだと今日が先になります。これはおわかりですよね?)
    • good
    • 0
この回答へのお礼

大変参考になりました。
ありがとうございました。

お礼日時:2002/01/30 15:55

簡単かどうかはわかりませんが…


「last の出力のうち、今日と昨日のものだけを通過させるスクリプトを Perl 等で書いて、last の出力をパイプでそのスクリプトに流す」というのが、多分正攻法なのではないでしょうか?

スクリプトの内容(処理手順)は、大体次のようになるはずです。

 (1) 今日の日付を取得。

 (2) それを元に昨日の日付を計算し、「今日」と「昨日」の文字列パターンを準備。
   (毎月1日の場合の処理がやっかいなので、一度 UTC(通算秒数)に直してから
    1日(=86400sec)を引き、それから昨日の日付を求めるのが楽だと思います。)

 (3) 読み込まれた last の出力を順に見ていき、今日か昨日のものであれば print、
   それ以外のものが来たところで Stop。

スクリプトの言語は、やはり Perl がお薦めですね。そんなに大げさなプログラムにはならないと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qlastコマンドの結果が更新されない

OSは、Solaris2.6(SPARC)です。
lastコマンドをたたくと、
毎日使っているにもかかわらず、一番新しいものが、
root pts/1 192.168.1.1 Fri Mar 26 19:16 - 19:16 (00:00)
と、はるか昔のものしか出でません。
何度lastをたたいても、更新されません。
ちなみに、/var/adm/wtmp、/var/adm/wtmpx は
更新されています。(ls -lで確認)

原因と対処方法(どちらかだけでもかまいません)を
よろしくお願いいたします。

Aベストアンサー

ログインやログアウトするたびに /var/adm/wtmp ファイルが増加しているこ
とは確認されていますか?

last する前と後で、ls -lu してみて、参照時刻が変わるかどうか確認してみ
てください。last することで現在時刻がセットされるようでしたら、一応
/var/adm/wtmp をちゃんと読みに行っていることが確認できます。
もし読んでないようなら last -f /var/adm/wtmp としてみてください。

それから、wtmp ファイルが壊れていて、うまく読めてない可能性もあるので、
必要ならどこかにバックアップしてから、サイズを 0 にしてから始めてみて
ください。

あとは、last コマンドがおかしいかですね。システムの標準の last コマン
ドが使われてない場合もそうですし、外部からの侵入者が last コマンドを取
り替えて出て行ったという可能性も考慮した方がいいでしょう。

QLASTコマンド、wtmpについて

はじめまして。
AIX4.2.1でWTMPを退避するプログラムを作成しました。その退避方法は、wtmpをfwtmpでASCIIに変換し、その内容から新しいログか古いログかを判別し、新しいものはそのままwtmpとして、古いものはwtmp.0へ保存する方法です。実際に実行してみると、たしかにwtmpとwtmp.0に分類することは成功したものの、LASTコマンドでwtmp.0を指定してログを見てみると、一部のログ(退避したログの一番新しいもの)がログアウト完了後のものにもかかわらず「ログイン中です。」と表示されてしまいました。
私の認識ではログアウト情報はwtmpが持っているものだと思っていたのですが、違うのでしょうか?ご存知の方がいらっしゃったらぜひ教えてください。できれば対策もご存知でしたらあわせてお願いします。

Aベストアンサー

wtmpには、ログインした記録とログアウトした記録が、ほぼ同じフォーマットで別々に追加記録されていきます。wtmpファイルをある時点で分割すると、そのときログインしていたユーザのログイン記録とログアウト記録は分断されてしまいます。lastに古い方のファイルだけを与えた場合はログアウト記録がないために、当然ログイン中と認識されます。

対策としては、分割時に、ログイン中の端末があるかどうか調べ、あるなら新しいほうから該当する端末のログアウト記録を探し出して、古い方にマージすることになるでしょうか。またはログアウト記録を分割時点で新たに作成し、新しい方のファイルではその時点で再度ログインしたことにしてしまうなどでしょうか。

利用時間を自動的に正確に算出したいというなら、さまざまな条件を考えて、対策しないといけませんが、人間が参考のために見る程度でしたら、あえて無視するという方法もあります。

Q[HP-UX 11.23] du コマンドの出力結果をソート

よろしくお願いします。

QNo.4011758「HP-UX 11.23 におけるディスク使用率確認方法」
でアドバイスいただき、duコマンドの存在を知りました。
manやWebサイトで使い方を確認中です。

<質問>
duコマンドの出力結果を使用量でソートする方法はありますでしょうか?

どうぞよろしくお願い致します。

Aベストアンサー

パイプでsortに投げる
du -ks * | sort -k 2
duの出力フィールドとsortのオプションをきちんと覚えていないので後は調べてください

Qユーザのログインを禁止する方法は?

ユーザ(とその環境)を削除せずに、FTPもTelnetもMailも使用禁止
つまり、凍結してしまうような方法はあるでしょうか。

どこかで
「ユーザを削除してしまうよりもログイン禁止の対応をとった方が良い」
というような内容を読んだ記憶があるのです。
確かパスワードを無効にする...ような方法だったような。
それなりに検索してみたのですが、見つかりませんでした。

RedHatLinux6.2を使用しています。
いわゆる「サーバモード」で使用していて
基本的なコマンドは扱えます。
(ので、そういう前提で回答していただいて理解出来ると思います)

そもそもその記事の記憶自体が誤りなのでしょうか...
どなたかご教授いただければ幸いです。
よろしくお願いします。

Aベストアンサー

下記サイトにユーザアカウントを無効化する方法があります。
ページ内検索(IEならCTRL+F)で「ユーザアカウントの無効化」を検索してください。

参考URL:http://www.jp.redhat.com/support/manuals/RHL62/ref-guide/ch-sysconfig.html#S2-SYSCONFIG-KILL-USER-ACCT

Qwindowsからtelnetでログインし自動処理

windowsからUNIXサーバーへtelnetでログインし
その後、様々な処理を行い、ログアウトするまでの一連の操作をバッチファイル化したいのですが、上手くログインできません。

WINODWSで telnet.batというバッチファイルをダブルクリックするとその中の
telnet
open
192.168.1.1
user
passwd
cd usr
cp a.tar b tar
exit
といった処理を実行させたいのですが、
TELNETを呼び出したまでは良かったのですが、
上手くログインできず止っています。
宜しくお願いします。

Aベストアンサー

TeraTermが、あんまり気に入らないとなると、

1) Expectを使う。
http://www-6.ibm.com/jp/developerworks/linux/020614/j_l-sc1.html
2) perlのNet::Telnetを使う。
man Net::Telnet
3) sshでパスワードなしの鍵を使って、コマンドを実行。
man ssh
4) CGI経由でコマンドをキック。

――とか。
expect、sshはcygwinのものが、PerlはActivePerlが使えます。
sshはサーバー側でsshdが動いている必要があります。
CGIは、大抵、管理権限の無いユーザーで動いてますので、setuidする必要があるかも。


人気Q&Aランキング

おすすめ情報