- ? write(2). , - , , - . , - , -- . , - . - (last_activity) : last_activity = time(NULL) - mod_time, mod_time - . - who(1). , time NULL - . activ . , - .  4-8 . , - - . 10 - , . who -u . cut, 1-17 38-42. , - . ------------------------------------------------------------ : info ------------------------------------------------------------ info  /etc/ passwd .   info login_name [ login_name ... ]   info russ , russ   1 : 2 # @(#) info v1.0 Display password info on a user Author: Russ Sage 2 4 for NAME in $@ 5 do 6 USER=`grep "^${NAME}:" /etc/passwd` 7 echo "$NAME:\t`echo ${USER}|cut -d: -f6`\t` echo ${USER}|cut -d: -f5`" 8 done   NAME , USER /etc/passwd  info? UNIX . - /etc/group, /etc/passwd /etc/inittab. . Berkeley finger, - . System V , - , . info? Info - , - /etc/passwd. : ------------------- | | name: home dir comments | : | , . "" - : grep login_name /etc/passwd . Info . . .  $ for NAME in `cat /etc/passwd | cut -d: -f1` > do > NAMELIST="$NAMELIST $NAME" > done; info $NAMELIST . info, . : " - ".  4-8 - for, , - . 6 7. 6 USER grep, (`). ( ^), grep , - (:). . 7 echo, echo. - , - , , . , , . - echo . , - . (\t). . , USER, - . , echo , . - . , - - . , , shell. - awk , , , - shell. shell , . , . ----------------------------------------------------------- : uchk ----------------------------------------------------------- uchk ,  , -   uchk [-a] login_name [...]   uchk -a ,   1 : 2 # @(#) uchk v1.0 Check processes of another user Author: Russ Sage 2 4 trap "rm /tmp/ps$$ 2> /dev/null" 0 1 2 3 15 6 if [ $# -eq 0 ] 7 then echo "uchk: argument error" >&2 8 echo "usage: uchk [-a] login_name [ ... ]" >&2 9 exit 1 10 fi 12 if [ "`echo $1 | cut -c1`" = "-" -a "$1" != "-a" ] 13 then echo "uchk: invalid argument $1" >&2 14 echo "usage: uchk [-a] login_name [ ... ]" >&2 15 exit 1 16 fi 18 ADMIN="administrators names go here" 19 if [ "$1" = "-a" ] 20 then shift 21 set $ADMIN $@ 22 fi 24 ps -ef > /tmp/ps$$ 25 for NAME 26 do 27 echo 28 fgrep "$NAME" /tmp/ps$$ 29 done   ADMIN , NAME ,  uchk? UNIX , . - ps. Ps - , (/dev/mem) - . , - . , - root. , - ps, . Uchk . - , , . , , ps, , . uchk? Uchk - , , , . , . - . , uchk . UNIX . Shell - . , - trap shell'. - trap , - . , - . uchk - , - . Uchk ADMIN, - . , ADMIN, , - . . - , -a . . , . , , - , .  $ uchk -a russ uucp , , - uucp . - , .  4 - trap. , , - . - . rm , . , , , . trap (program exit, 0), (hangup, 1), (interrupt, 2), (quit, 3) - (software termination, 15). 6-10 , - . uchk , uchk . 12-16 , - -a - . - , . - , "-". , , - -a. - AND, "" . , uchk . ? , , - . , - , . , : " , , ?" 18 ADMIN , . , - . , - - vi , - . ADMIN . 19-22 , -a. , - . 21 set , - ADMIN . set ADMIN, , . for , . 24 ps . f . - , . . , , - , ps. 25-29 for, $1 $x, x - . : - ( 27), fgreps ( ) , . fgrep , . , , , - trap, - . ------------------------------------------------------------- : watch ------------------------------------------------------------- watch  , , .   watch [-k] [login_name ...]   watch , LIST   1 : 2 # @(#) watch v1.0 Watch for specific logins Author: Russ Sage 2 4 if [ "`echo $1 | cut -c1`" = "=" -a "$1" != "-k" ] 5 then echo "watch: invalid argument $1" >&2 6 echo "usage: watch [-k] [login_name ...]" >&2 7 echo " -k kill background process" 8 exit 1 9 fi 11 if [ "$1" = "-k" ] 12 then if [ -s $HOME/.watch ] 13 then echo "killed `cat $HOME/.watch`" 14 kill `cat $HOME/.watch` 15 rm $HOME/.watch 16 exit 0 17 fi 18 fi 20 echo $$ > $HOME/.watch 22 LIST="root sys bin administrator1 administrator2 $*" 24 while : 25 do 26 for NAME in `who | cut -d" " -f1` 27 do 28 for PERSON in $LIST 29 do 30 if [ "$NAME" = $PERSON" ] 31 then echo ONLINE: $NAME 32 fi 33 done 34 done 35 sleep 10 36 done &   HOME LIST , NAME PERSON LIST  watch? . - - . , , . watch? , watch , , . , , , , . , , . - , , , .. root . watch . , . watch uchk, - -a . watch , , - " " - watch - . , . , , - , . - - watch kill. - $HOME/.watch. kill - . watch, -k .  1. $ LIST="root bin" watch daemon LIST - watch, shell', watch. watch : root, bin daemon , watch , , - LIST. , - watch, . 2. echo "Watch (y/n): \c" read ANS if [ "$ANS" = "y" ] then watch fi , .profile. , watch. "y", watch - ( LIST). , y, watch .  4-9 - . , "-k". - , . 11-16 , - -k. , - watch. , - , , . 12 , .watch. , , - watch - , watch , "-k" . .watch , 14 kill watch. , -k , watch , $HOME/.watch - watch. 15 watch 16 . watch . 20 , -k .watch. ( , , , .) -k , , watch , - . , .watch. , watch. 22 LIST. - , . LIST - . - . - , LIST $*. - LIST , . 24-36 . - who - , for 26. for - , - who. , . , while - . , - . 29-33 , , , - , who. , who ( ) , , - . , watch - 10 ( 35). , - while. - . , watch. , watch -k "kill `cat $HOME/.watch`".  Watch - . - (sleep), watch . , sleep(60). - - ? --------------------------------------------------------------- : whox --------------------------------------------------------------- whox who  who who .   whox [-f] [-n] [-m] [-p] [-t] [-w] [-x] -f -n who -m -p -t who () -w -x   whox -w ( )   1 : 2 # @(#) whox v1.0 Who with expanded options Author: Russ Sage 2 who 4 XTRA="no" 5 SORT="sort -b +2" 6 DISPLAY="norm" 8 CUT1="cut -d' ' -f1" 9 CUT5="cut -d: -f5" 10 CUT6="cut -d: -f6" 12 for ARG in $@ 13 do 14 case $ARG in 15 -f) DISPLAY="finger" 16 COMMAND="finger \$NAME; echo";; 17 -n) SORT="sort";; 18 -m) DISPLAY="mail";; 19 -p) DISPLAY="pass" 20 COMMAND="grep \"^\$NAME:\" /etc/passwd";; 21 -t) SORT="sort -b +2";; 22 -w) DISPLAY="write";; 23 -x) XTRA="yes";; 24 *) echo "whox: invalid option $ARG" 25 echo "usage: whox [-f] [-n] [-m] [-p] [-t] [-w] [-x]" 26 echo " -f finger users" 27 echo " -n sort by name" 28 echo " -m mail to each user" 29 echo " -p password info on users" 30 echo " -t sort by time (default)" 31 echo " -w show writeability of devices" 32 echo " -x extra home dir and gcos info" 33 exit 1;; 34 esac 35 done 37 if [ "$XTRA" = "yes" ] 38 then EXTRA="| while read LINE; do \ 39 NAME=\`echo \$LINE | cut -d' ' -f1\`;\ 40 ENTRY=\`grep \"^\$NAME:\" /etc/passwd\`;\ 41 echo \"\$LINE\t\`echo \$ENTRY|\$CUT6\`\t\`echo \$ENTRY|\$CUT5\` \";done" 42 else EXTRA="" 43 fi 45 case $DISPLAY in 46 norm) eval "who | $SORT $EXTRA";; 47 finger|pass) for NAME in `who | $SORT | cut -d' ' -f1` 48 do 49 eval $COMMAND 50 done;; 51 mail) who | cut -d' ' -f1 | while read NAME 52 do 53 echo "mail to $NAME (y/n): \c" 54 KB=`line < /dev/tty` 55 if [ "$KB" = "y" ] 56 then mail $NAME < /dev/tty 57 fi 58 done;; 59 write) ls -il `who | sed "s/...........\(.......\).* /\/dev\/\1/"`;; 60 esac   ARG COMMAND , who CUT1 CUT5 CUT6 DISPLAY , ENTRY EXTRA shell-, KB , NAME SORT XTRA , ,  whox? , UNIX - . , UNIX . , , . , - . , , . - who, , - . , , who - , . - , - . whox? Whox - , - who. , who, , , - , , . whox who . -x - . -x , , , info, . Whox . who. Whox . -n , -t ( , ) . , -f -p. - , who , , . . , - , - . ( finger Berkeley UNIX , . , - , .) - , - - . , . . -m. - . (- -w) - . , UNIX' write. , , . , - , , - , "mesg n". , - write. , "echo hello > /dev/tty00". . - . - - , , , . ( , . - .) , . -f. -f . -w -f, "whox -f -w", . whox , -f. , , - . , - .  1. $ sh -x whox -x shell , - whox , -x whox. - . ( .) 2. $ whox -n -x who, .  4-10 . XTRA "no". -x. XTRA "no" , - - . - . , (+2) (-b) 5. - -t. -t , . -n , , . 6 , - who. , DISPLAY. 8,9 10 , . - , - . CUT1 , , . , . , . , . - , . 12-35 . for ARG case ARG. -f, 15 DISPLAY . COMMAND finger, . , , , , , . - , . , - . 16, - $ . , , COMMAND $NAME, , NAME . - NAME . 17 -n. , - - who, . who, sort , sort . 18 -m . . , , mail, - . 19 20 -p. , , . - grep /etc/passwd. - , 20 - . . , - shell-. 21 -t. , -t . , - . - sort , 5. 22 -w . , - - . 23 -x. - , XTRA, , - . 24 - . * - , . , whox . 37-43 , - . 37 , - XTRA "yes", , - -x. , EXTRA , . EXTRA , . EXTRA - . , - -x. , - , , . - , . , - . 38-41 EXTRA. . , , - . 38 EXTRA (|) while. 38 , shell, (- ). 39 NAME , , while. , EXTRA. , - CUT1 , . - CUT1 cut, shell . , - - , . cut , -