in reply to wrapping any given shell

If I were in your situation, I would just run a nightly job that appended their history file to a central file ('/tmp/user_logs/user.history').
@users = qw(fred wilma barney); #watch these users foreach $user (@users) { open(LOG,">>$user.history"); open(HSTRY,"/$user/.bash_history"); while(<HSTRY>) { print LOG $_; } }
If that wouldn't work for you and you really don't want to write a simple shell (which would amount to a bunch or fork's and exec's, really); you could try to write a daemon that would run and when a specified user logged in, it would dup() his STDIN to a file. (Note: the following code does not do this, but is an example of dup() ).
open(LOG, ">>/tmp/$user.logfile"); open(STDIN, ">&LOG");
But, again, you would have to make that a daemon that would watch people logging in, grab their username, expect the username, and then permanently dup() their STDIN.

Good Luck,
Jeremy

Replies are listed 'Best First'.
Re: Re: wrapping any given shell
by dkubb (Deacon) on Feb 07, 2001 at 10:49 UTC

    You could use something like Unix::ConfigFile to fetch a list of users on your system, pull out each home directory using Unix::ConfigFile::home(), then use File::Tail to read their history files in, real-time.

    From here, you could either write the information to write-only media, or log it to files that are read/writeable only as root.