' , ' - -f. -f , cut , - . CUT1 cut, . , . shell -x, , . , CUT1 , - , cut, . : sh -x whox -x. : XTRA=no SORT=sort -b +2 DISPLAY=norm CUT1=cut -d' ' -f1 <- . . CUT5=cut -d: -f5 CUT6=cut -d: -f6 XTRA=yes + who + read LINE + sort -b +2 + echo russ console Jun 20 14:11 + cut -d -f1 <- . . . , cut, . - CUT1, . , , cut . - . , . , , shell: | while read LINE do NAME=`echo $LINE | cut -d' ' -f1` ENTRY=`grep "^$NAME:" /etc/passwd` echo "$LINE\t\`echo $ENTRY|$CUT6\`\t\`echo $ENTRY|$CUT5\`\" done , . 45-60 - case, - . 46 - who. EXTRA, eval, - . , eval - , . , eval. eval . EXTRA - . 47-50 . . for NAME , who. , who, - eval COMMAND ( case, ). , - COMMAND. COMMAND finger, COMMAND - grep. 51-58 . - who, for . who cut ( CUT1 ), while. , - . who . , , . , . 54 UNIX' line. ? read . read , - . - line, /dev/tty. - . 55 , y. , - UNIX' mail, /dev/tty ( .) - shell-, mail. mail /dev/null, whox. 59 - . - ls , - , who. who. who, sed. sed , , \( \). - - \1. . , , . , who /dev/, . sed , who. ls - - . .   . - , . - , , . , , , , . , . , , . . ( , ), , - . . . . , . , - . , - , , . , - , . , , UNIX. , , - , , , . , ( ) , , . acme, inuse lock. Acme - UNIX' acctcom. Acctcom - , . Acme - . , , , acctcom - . , inuse, "", - . . - , - shell. , lock, - - chmod. ------------------------------------------------------------ : acme ------------------------------------------------------------ acme  , , .   acme [-l] [-u]   acme -u $LOGNAME   1 : 2 # @(#) acme v1.0 Give accounting info on me Author: Russ Sage 2 4 if [ "$1" != "-l" -a "$1" != "-u" ] 5 then echo "usage: acme [-l] [-u]" >&2 6 echo " -l for ttyline" >&2 7 echo " -u for user name" >&2 8 exit 0 9 fi 11 OPT="" 12 for ARG in $* 13 do 14 case $ARG in 15 -l) OPT="$OPT -l `basename \`tty\``";; 16 -u) OPT="$OPT -u $LOGNAME";; 17 *) OPT="$OPT $ARG";; 18 esac 19 done 21 echo "acctcom $OPT" 22 acctcom $OPT   ARG , LOGNAME , OPT  acme? UNIX . - /usr/adm/pacct. . . , , acct(2). (accton(1M)) (acctcom(1)). , , , . Acctcom - , , - . ( , setuid), , , .. - . , . acctcom , , . , - , . acme. acme? Acme - acctcom(1). - , - . acme , . acme - , acctcom . acctcom . - , . , acme, -l -u. -l, acme . -u, acme . . - acctcom, acme , fcctcom, acctcom, acme. , acme , . , acctcom, - , - , acme. - , , .  1. $ acme . , . ! 2. $ acme -u -b - . - . 3. $ acme -l , - . , , (- setuid, ), .  4-9 . - -l -u, . - . 11 OPT . acctcom . 12-19 for, . case . -l ( 15), - OPT , , -l , UNIX' tty. tty /dev, . , . -u, OPT -u - . , OPT. , acme acctcom. , - . , acctcom. , - , . 21 - , , , . 22 acctcom. acctcom(1). ------------------------------------------------------------- : inuse ------------------------------------------------------------- inuse  . - , .   inuse   inuse mypasswd ,   1 : 2 # @(#) inuse v1.0 Disable terminal and alert if used Author: Russ Sage 2 4 trap "echo you\'re BUSTED!!; stty echo; kill $$" 2 15 6 PATH=/bin:/usr/bin 7 SECRET="secret" 9 stty -echo 10 echo "Lock string: \c" 11 read BUF1 12 echo 14 while : 15 do 16 BUF2=`line < /dev/tty` 17 if [ "$BUF2" = "$BUF1" ] 18 then break 19 elif [ "$BUF2" = "$SECRET" ] 20 then break 21 fi 22 echo "^G\c" 23 done 24 stty echo  inuse? : , , - . , - ? , . , , . , , , , . , - - "" "" . - - , . inuse? Inuse . , - . , , . inuse, . - , . , - inuse - , - /dev/tty, . , . inuse , - - . , - - - , . , . inuse: shell, , . . , , . , -.  4 trap. - trap . trap - . , . -, , , - . . , - . " " kill - $$, shell-. - 2 15, . , ( 3) . . 6 , inuse. inuse " " -, ( " "). 7 - "secret", - . - . , shell-, . - . 9 -, 10 - , 11 , , BUF1. 14-23 while, . 16 . 17 , - , , . , BUF2 . - , break while, . , 22 . , 24 -- . , trap. .   . - , , . - trap, inuse. , - , . , , , (- DEL). , "you're busted", - - ( 15). - , , . - , . , , . - , - , . trap, . trap, . , - shell , - , = . - stty(1). . : speed 9600 baud; intr = DEL; quit = ^|; erase = ^h; kill = ^u; eof = ^d; "stty intr z", z , . - , , . , . , , , . . inuse 1 char id[] = "@(#) inuse v1.0 Disable terminal Author: Russ Sage"; 3 #include 4 #include 5 #include 7 #define SSIZ 7 8 #define BSIZ 512 9 #define BELL "\07" 10 #define LF "\n" 12 main() 13 { 14 register int fd, sig, n; 15 char secret[SSIZ]; 16 char buf1[BSIZ], buf2[BSIZ]; 17 struct sgttyb sav_tty, chg_tty; 19 secret[0] = 's'; 20 secret[1] = 'e'; 21 secret[2] = 'c'; 22 secret[3] = 'r'; 23 secret[4] = 'e'; 24 secret[5] = 't'; 25 secret[6] = '\n'; 27 buf1[0] = buf2[0] = '\0'; 28 if ((fd = open("/dev/tty",O_RDONLY)) == -1) 29 exit(1); 31 for (sig = 2; sig <= 15; sig++) 32 signal(sig, SIG_IGN); 34 if (gtty(0, &sav_tty)) 35 exit(2); 36 chg_tty = sav_tty; 37 chg_tty.sg_flags &= ~ECHO; 38 if (stty(0, &chg_tty)) 39 exit(3); 41 write(1,"Lock string: ",13); 42 read(fd, buf1, BSIZ); 43 write(1, LF, 1); 45 for (;;) { 46 n = read(fd, buf2, BSIZ); 47 buf2[n] = '\0'; 49 if (strcmp(buf2, buf1) == 0) 50 break; 51 if (strcmp(buf2, secret) == 0) 52 break; 53 write(1, BELL, 1); 54 } 55 stty(0, &sav_tty); 56 close(fd); 57 }  inuse ()? inuse , shell. , shell (1), (2) (3). inuse ()? , shell-. ( - , strings(1) - ), , - , - . - - , . , - . , . , . - "kill -9". 9 , - . , , .  1 . what(1) - , . 3 fcntl.h. - , , . 4 signal.h. - SIG_IGN, (signal_ignore). 5 sgtty.h, - , ioctl(2). 7 . - , . . 8 , - . 512 , - . . 9 10 . 14 . - , . - . , . . fd - /dev/tty, sig - , n - . 15 . - , . 16 , . Buf1 , buf2 - , , - . 17 , - (ioctl). , - , - , , - . 19-25 . , . - . 27 . 28 29 /dev/tty. -1, - . 31 32 . for , 2 15. signal . 34-39 - - . 34 - sav_tty. gtty - ioctl(get_values). , . 36 sav_tty chg_tty. 37 sg_flags - ECHO, " -". 38 39 - . stty - ioctl(set_values). 41 . - 1 , 13 - - . 42 BSIZ /dev/tty. . , - , . . 45-54 , . 46 - . buf2, buf1. , buf2 (n). , 1, n , , , - . , read . stdio. - (3) , (2). , . 49 , , , . , strcmp , - . break for, - . 51 . , . , 53 - read for. for, 55. - , -. 56 /dev/tty, . , , , shell, . , kill -9. - . . ----------------------------------------------------------------- : lock ----------------------------------------------------------------- lock  , .   lock [-u] file [...]   lock $HOME / - .   1 : 2 # @(#) lock v1.0 Lock and unlock files Author: Russ Sage 2 4 if [ $# -eq 0 ] 5 then echo "lock: incorrect argument count" >&2 6 echo "usage: lock [-u] file [...]" >&2 7 exit 1 8 fi 10 if [ "`echo $1 | cut -c1`" = "-" -a "$1" != "-u" ] 11 then echo "lock: invalid argument $1" >&2 12 echo "usage: lock [-u] file [...]" >&2 13 exit 1 14 fi 16 MODE1="go-rw" 17 MODE2="u-w" 19 if [ "$1" = "-u" ] 20 then shift 21 MODE1="go+r" 22 MODE2="u+w" 23 fi 25 chmod $MODE1 $@ 26 chmod $MODE2 $@   MODE1 , MODE2 ,  lock? UNIX . - , . - , . 644, - 755. - . , chmod(1). (, 777), - , , (, ugo+rwx). - , . , - , . lock? Lock - , , - . - . , . lock . . . - . lock - . -u . chmod , - .  1. $ lock -u $HOME/src *.c - . - . 2. $ lock $HOME/bin bin , . , - cd, x. ls, "filename not found" ( "filename" ). - , , .  4-8 . , . . 10-14 , - "" - -u. , . 16 17 . MODE1 - "" "". MODE2 - (.. ) . . , . - chmod . 19-23 , -u. , shift - . 21 . 22 . , lock x, s t. - , x , . x - , , . , - . - , , - . 25 26