Скрипт оболочки для сравнения дат из нескольких файлов в Linux - PullRequest
1 голос
/ 30 декабря 2008

У меня есть много домашних каталогов в / ifshome в Linux. Я хочу узнать, какие пользователи не входили в систему в течение последних 6 месяцев, и мое решение состоит в том, чтобы проанализировать файл /ifshome/user/.lastlogin. Каждый файл .lastlogin имеет одинаковый формат, 1 строка:

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

Мне нужно создать сценарий оболочки, который сможет анализировать файл .lastlogin в домашнем каталоге каждого пользователя и выводить те каталоги, владельцы которых не входили в систему в течение последних 6 месяцев.

Ответы [ 8 ]

4 голосов
/ 30 декабря 2008

Возможно, команда last окажется для вас полезной. В нем будут перечислены последние N пользователей, которые вошли в систему или пользователи, которые вошли в определенное время и т. Д. man page

3 голосов
/ 30 декабря 2008

Хорошо, в чистом сценарии оболочки вы, вероятно, захотите использовать sort (1) с пробелом в качестве поля sep. что-то вроде

$ find /ifshome/user/ -name .lastlogin -print |
  xargs sort --key=8,8 --key=4,4 --key=5,5 

(предупреждение, не проверено.)

Возможно, вам будет проще использовать python или perl, так как они имеют лучшие опции для обработки дат.

1 голос
/ 02 февраля 2009

Мне кажется, что содержимое файла, скорее всего, будет отражать метку времени изменения файла, поэтому вы можете использовать гораздо более простую команду:

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

Распечатайте все файлы с именем .lastlogin со временем модификации более 182 дней (выберите собственное приближение до 6 месяцев).

1 голос
/ 30 декабря 2008

Хорошо, вот мой глупый способ (не проверенный!) С использованием чистого сценария оболочки для анализа вашего файла.

Команда date может проанализировать строку даты и вывести секунды с 1970 года. Вычесть их из текущих секунд и разделить на количество секунд, которое занимает один месяц. Выведите это значение вместе с путем пользователя.

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, после чего вы сможете просмотреть список пользователей и их активность.

Для нехакерского пути рассмотрите идею последнего журнала Хуана. Это тоже на моем linux.

1 голос
/ 30 декабря 2008

Правильно ли предположить, что последнее время должно более или менее равняться времени изменения файла? Если это так, вы можете легко использовать команду find, чтобы найти файлы более новые, чем шесть месяцев назад.

Удаление этих файлов из «оригинального» списка приведет к более старым.

0 голосов
/ 31 декабря 2008

Вот некоторые незначительные изменения в коде 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
0 голосов
/ 30 декабря 2008

Это может быть относительно легко выполнено в 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";
    }
  }
}
0 голосов
/ 30 декабря 2008

Откуда берется файл .lastlogin? Это стандарт Linux, потому что у меня его нет?

Я только что нашел команду "lastlog" в моей системе, которая может дать вам всех, кто последний раз заходил в систему указанное количество дней назад:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...