#!/usr/local/bin/perl # # oldsessions [-u user] # # find login sessions idle longer than $OLD days # print a list of kill commands that can be sent to the shell # -u flag allows for specifying a user, otherwise all users are checked # The simple ways are shorter but less flexible # #!/bin/sh # t1=/tmp/t1_$$ # t2=/tmp/t2_$$ # finger | sort > $t1 # who -u | sort > $t2 # join -1 4 -2 2 -o 2.7 2.1 1.5 2.2 $t1 $t2 # How old is old? One user (tbob) says he leaves terms running for up to # 7 days. For Fred (fjones) and Vicki (vlb), anything over a day idle is moldy # due to autologouts. # minimum days for an idle session to be considered "old" my $OLD = 1; my %old = ( tbob => 7, ); my @a; my $pty; my %name, %days, %pid; my $user; while (@ARGV and $ARGV[0] =~ /^-/) { $_ = shift; if (/^-u(.*)/) { $user = $1; $user = shift unless($user); } } # fjones Fred Jones pts/1 3d Tue 06:59 208.193.8.188 # fjones Fred Jones pts/10 42d Fri 08:37 64.94.242.12 # fjones Fred Jones pts/19 3d Mon 13:40 208.193.8.188 $pid = open(FINGER, "finger | sort |") or die "couldn't fork finger"; while () { @a = split; next if ($user and ($a[0] ne $user)); my $idle = $a[4]; if ($idle =~ /(\d+)d/) { my $d = $1; my $n = $a[0]; $pty = $a[3]; if ( (defined ($old{$n}) and $d > $old{$n}) or (!defined ($old{$n}) and $d > $OLD) ) { $name{$pty} = $n; $days{$pty} = $d; } } } close(FINGER); # fjones pts/1 Jul 3 06:59 old 26897 (208.193.8.188) # fjones pts/10 May 25 08:37 old 11211 (64.94.242.12) # fjones pts/19 Jul 2 13:40 old 20000 (208.193.8.188) $pid2 = open(WHO, "who -u | sort |") or die "couldn't fork who"; while () { @a = split; $pty = $a[1]; if (defined($name{$pty})) { $pid{$pty} = $a[6]; } } close(WHO); # join -1 4 -2 2 -o 2.7 2.1 1.5 2.2 $t1 $t2 print "#Kill -9 PID\tName\tPTY\tIdle Time\n" if (%name); for my $key (keys (%name)) { print "kill -9 $pid{$key}\t# $name{$key}\t$key\t$days{$key} d\n" }