質問

Linuxの/ ifshomeの下に多くのホームディレクトリがあります。過去6か月間ログインしていないユーザーを確認したいのですが、私の解決策は/ifshome/user/.lastloginファイルを解析することです。各.lastloginファイルの形式は同じで、1行です。

Last Login: Fri Mar 09 18:06:27 PST 2001

各ユーザーのホームディレクトリにある.lastloginファイルを解析し、所有者が過去6か月間ログインしていないディレクトリを出力できるシェルスクリプトを作成する必要があります。

役に立ちましたか?

解決

わかりました、ファイルを解析する純粋なシェルスクリプトを使用した私の愚かな方法(テストされていません!)

date コマンドは、日付文字列を解析し、1970年以降の秒数を出力できます。現在の秒数から減算し、1か月にかかる秒数で割ります。その値をユーザーのパスと一緒に印刷します。

for i in /ifshome/*/.lastlogin; do
    dates=$(cat $i | grep "Last Login:" | cut -d: -f 2-)
    if [ ! -z "$dates" ]; then
      months=$(( ($(date +%s) - $(date -d "$dates" +%s)) / (60*60*24*31) ))
      echo $months $i
    fi
done

sort -n を使用して出力をソートし、それを less にパイプすると、ユーザーとそのアクティビティのリストを参照できます。

非ハック的な方法として、Juanのlastlogのアイデアを検討してください。私のLinuxにもあります。

他のヒント

last コマンドが役立つ場合があります。ログインした最後のN人のユーザー、または特定の時間にログインしたユーザーなどがリストされます。マニュアルページ

さて、純粋なシェルスクリプトでは、フィールドsepとしてブランクを使用してsort(1)を使用することができます。

のようなもの
$ find /ifshome/user/ -name .lastlogin -print |
  xargs sort --key=8,8 --key=4,4 --key=5,5 

(警告、テストなし)

日付処理オプトインの方が優れているため、pythonまたはperlを使用する方が簡単な場合があります。

最新の時刻は、ファイルの変更時刻にほぼ等しいと仮定するのは正しいですか?その場合、 find コマンドを使用して、6か月前より新しいファイルを簡単に見つけることができます。

これらのファイルを「オリジナル」リストから削除すると、古いファイルが生成されます。

ファイルの内容がファイルの変更タイムスタンプをエコーする可能性が高いため、はるかに簡単なコマンドを使用できます:

 find /ifshome -name .lastlogin -mtime +182 -print

.lastloginと呼ばれるすべてのファイルを、182日以上前の修正時間で印刷します(6か月の概算を選択してください)。

.lastloginファイルはどこから来たのですか? Linux標準ではないのですか?

" lastlog"を見つけました。指定した日数前に最後にログインしたすべての人に与えることができる私のシステム上のコマンド:

       -b, --before DAYS
           Print only lastlog records older than DAYS.

次のコードを使用すると、PERLで比較的簡単に実行できます。

#!/usr/bin/perl

use strict;
use Time::Local ();

my $dir = "/ifshome";

my $month = {
  'Jan' => 0, 'Feb' => 1, 'Mar' => 2, 'Apr' => 3, 'May' => 4, 'Jun' => 5,
  'Jul' => 6, 'Aug' => 7, 'Sep' => 8, 'Oct' => 9, 'Nov' => 10, 'Dec' => 11,
};

my $expire = time() - (86400 * 30 * 6);

foreach my $home (<$dir/*>) {
  open(F,"$home/.lastlogin");
  chomp(my $line = <F>);

  if ($line =~ /^Last Login:\s+\w{3}\s+(\w{3})\s+(\d{2})\s+(\d{2}):(\d{2}):(\d{2})\s+\w+\s+(\d{4})/) {
    my $ts = Time::Local::timelocal($5,$4,$3,$2,$month->{$1},$6-1900);
    if ($ts < $expire) {
      my($user) = (split(/\//,$home))[-1];
      print "$user account is expired\n";
    }
  }
}

litb のコードにいくつかのマイナーな変更があります。パラメーターとして#か月かかることがあり、厳密にユーザー名とそれに続く変更後の月を出力します。

oldusers.sh:

echo "Purpose: Parse /ifshome and find dates in .lastlogin files that are older than MONTHS months."
echo "Usage: ./oldusers.sh [MONTHS=6]"
echo ""

case $# in
1)
monthmin=$1
;;
*)
monthmin=6
;;
esac

if [ "${monthmin//[^0-9]/}" != $monthmin ]; then echo "$monthmin is NaN";
else
 for i in ./*/.lastlogin; do
    dates=$(cat $i | grep "Last Login:" | cut -d: -f 2-)
    if [ ! -z "$dates" ]; then
      months=$(( ($(date +%s) - $(date -d "$dates" +%s)) / (60*60*24*30) ))
      user=$(echo $i | cut -d/ -f 2- | cut -d/ -f -1)
      if test $months -ge $monthmin; then echo "$user: $months months ago"; fi
    fi
 done
fi
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top