BBSˮľÇ廪վ¡Ã¾«»ªÇø
·¢ÐÅÈË: wshu (Ê÷ÉϵÄÀÏ»¢), ÐÅÇø: Unix
±ê Ìâ: UNIX FAQ ÖÐÎİæ(ËÄ)
·¢ÐÅÕ¾: BBS ˮľÇ廪վ (Mon May 19 10:12:11 1997)
±¾ÆªÎÄÕ»شðÒÔÏÂÎÊÌâ:
4.1) ÒªÈçºÎÔÚʹÓÃÕß²»±Ø°´ RETURN µÄÇé¿öÏÂ´Ó terminal ¶Á½ø¶«Î÷£¿
4.2) ÎÒÒªÈçºÎÔÚÎ´ÔøÕæµÄ¶Á½ø¶«Î÷µÄÇé¿öϼì²éÊÇ·ñÓÐ×ÖÔªµÈ´ý¶ÁÈ¡£¿
4.3) ÒªÔõÑù²ÅÄܵÃÖªÒ»¸öÒÑopen µµ°¸Ö®µµÃû£¿
4.4) Ò»¸öÖ´ÐÐÖеijÌʽÈçºÎÖªµÀ×Ô¼ºµÄ pathname?
4.5) ÈçºÎÓà popen() ¶ÔÒ»¸ö process ×ö¶ÁдµÄ¶¯×÷£¿
4.6) ÔÚ C ³ÌʽÖÐÒªÔõôÓà sleep() ²ÅÄܹ» sleep СÓÚÒ»Ã룿
4.7) ÈçºÎÈà setuid µÄ shell script ¿ÉÒÔʹÓã¿
4.8) ÎÒÒªÈçºÎµÃÖªÓÐÄÄЩ process ¿ªÁËijһµµ°¸£¬»òijһ process ÕýÔÚʹÓÃÄÄ
Ò»¸ö fileystem(ÒÔÖÁÓÚÎÒÎÞ·¨ unmount Õâ¸ö filesystem)?
4.9) ÎÒÒªÔõô֪µÀÊÇËÔÚ finger ÎÒ°¡£¿
4.10) Äܲ»ÄÜÔÚÒ»¸ö process ºÍ terminal µÄÁ¬½ÓÒѾ¶ÏµôÖ®ºóÔÙ½Ó»ØÀ´£¬ÀýÈç
ÔÚ background ÅÜÒ»¸ö³ÌʽȻºó¾Í logout ¶ø¶ÏµôµÄ³Ìʽ£¿
4.11) ÓÐûÓа취¿ÉÒÔ͵ÌýÒ»¸ö terminal£¬¾ÍÊÇ˵½«ÆäÊä³ö¸´ÖÆÒ»·ÝÖÁÆäËûµÄ
terminal¡£
4.1) ÒªÈçºÎÔÚʹÓÃÕß²»±Ø°´ RETURN µÄÇé¿öÏÂ´Ó terminal ¶Á½ø¶«Î÷£¿
ÔÚ BSD ÖÐÓà cbreak ģʽ£¬ÔÚ SysV ÖÐÔòÓà ~ICANON ģʽ¡£
Èç¹ûÄãÀÁµÃÓà "ioctl(2)" À´É趨 terminal µÄ²ÎÊý£¬Ò²¿ÉÒÔÓà stty À´×ö£¬
²»¹ýÓеãÂýÓÖûÓÐЧÂʾÍÊÇÁË¡£µ×ϵijÌʽ×Ô¼º¿´Öø°ì°É£º
#include <stdio.h>
main()
{
int c;
printf("Hit any character to continue\n");
/*
* ioctl() would be better here; only lazy
* programmers do it this way:
*/
system("/bin/stty cbreak"); /* or "stty raw" */
c = getchar();
system("/bin/stty -cbreak");
printf("Thank you for typing %c.\n", c);
exit(0);
}
Óкü¸¸öÈËË͸øÎÒ¸üÕýÈ·µÄ½â·¨¡£²»¹ýºÜ±§Ç¸ÎÒ²»Ïë°ÑËüÃǼӽøÈ¥£¬ÒòΪÕâÒѾ
³¬³öÕâ·ÝÎļþµÄ·¶Î§ÁË¡£
ͨ³£¶ÔÕâ¸öÎÊÌâÓÐÐËȤµÄÈË£¬¶¼ÊÇÏëÒª×öһЩ¿ØÖÆÓ©Ä»ÏÔʾ֮ÀàµÄÊÂÇé¡£Èç¹ûÄã
Ò²Êǵϰ£¬ÄÇÇë²Î¿¼ "curses" µÄÏà¹ØÎļþ¡£ "curses" ÊÇÒ»¸ö portable µÄÓ©
Ä»¿ØÖƺ¯Êý¿â¡£
4.2) ÎÒÒªÈçºÎÔÚÎ´ÔøÕæµÄ¶Á½ø¶«Î÷µÄÇé¿öϼì²éÊÇ·ñÓÐ×ÖÔªµÈ´ý¶ÁÈ¡£¿
һЩ°æ±¾µÄ UNIX ÌṩÁ˼ì²éij¸ö file descriptor ĿǰÊÇ·ñÓж«Î÷´ý¶ÁÈ¡µÄ
·½·¨¡£ÔÚ BSD ÖУ¬¿ÉÒÔÓà "select(2)£¬Ò²¿ÉÒÔÓà FIONREAD ioctl£¬¼ì²éÓм¸
¸ö×ÖÔªµÈ´ý¶ÁÈ¡£¬²»¹ýÕâÖ»¶Ô terminal, pipe, Óë socket ÓÐÓá£ÔÚ System
V Release 3 ÖпÉÒÔÓà poll(2)£¬²»¹ýÖ»¶Ô stream ÓÐÓá£ÔÚ Xenix Óë Sys V
r3.2 ¼°ÆäÒÔºóµÄ°æ±¾ÀÓÐÒ»¸öÃû½Ð rdchk() µÄ system call ¿ÉÒÔÓÃÀ´¼ì²é
¶ÔÒ»¸ö file descriptor ×ö read() »á²»»á¿¨×¡¡£
ûÓз½·¨¿ÉÒÔÓÃÀ´ÅжÏÊÇ·ñÓÐ×ÖÔªÔÚ FILE pointer Öдý¶ÁÈ¡¡£(Äã¿ÉÒÔÖ±½Ó²é
¿´ stdio µÄ×ÊÁϽṹ£¬¿´¿´ÊÇ·ñ input buffer Êǿյ쬵«ÊÇÕâ·½·¨ÓÐʱ»áʧ
Ч£¬ÒòΪÄãûÓа취֪µÀµ±ÄãÏÂÒ»´ÎÒªÌîÂúÕâ¸ö buffer ʱ»á·¢ÉúʲôÊ¡£)
ÓÐʱÈËÃÇÎÊÕâ¸öÎÊÌâÊÇÒòΪÏëд
if (characters available from fd)
read(fd, buf, sizeof buf);
ÒÔ´ï³É nonblocking read¡£Õâ²»ÊÇÒ»ÖֺõÄ×ö·¨£¬ÒòΪ¿ÉÄܲâµÄʱºòÓж«Î÷£¬
Òª¶ÁµÄʱºò£¬ÒѾûÓж«Î÷¿É¶ÁÁË¡£ÕýÈ·µÄ×ö·¨Ó¦¸ÃÊÇÓà fcntl(2) ÀïµÄ
F_SETFL É趨 O_NDELAY¡£±È½Ï¾ÉµÄϵͳ(Version 7, 4.1 BSD) ûÓÐ
O_NDELAY£¬ÄǾ͵ÃÓà alarm(2) À´É趨 read µÄ timeout£¬ÒÔ´ï³É½üËÆ
nonblocking read µÄ¹¦ÄÜ¡£
4.3) ÒªÔõÑù²ÅÄܵÃÖªÒ»¸öÒÑ open µµ°¸Ö®µµÃû£¿
Õâ¸öÊǷdz£À§Äѵġ£ÈôÊÇÕâ¸ö file descriptor ÊǶÔÓ¦µ½ pipe »ò pty ¾Íû
ÓÐÃû×ÖÁË¡£Õâ¸ö file descriptor ¶ÔÓ¦µÄµµ°¸Ò²ÓпÉÄÜÒѱ»É¾³ý¡£ÈôÊÇÓÐ
symbolic link »ò hard link£¬Ôò¿ÉÄÜÓÐÐí¶à¸öÃû×Ö¡£
Èç¹ûÄã¾¹ýÒ»ÔÙ¿¼ÂǺó±ðÎÞÑ¡ÔñÒ»¶¨ÒªÕâô×öµÄ»°£¬¿ÉÒÔÓà find µÄ -inum Óë
-xdev Ñ¡Ï»òÓà ncheck£¬»òÓÃ×Ô¼ºÐ´ÀàËÆµÄ³ÌʽÀ´×ö¡£ÔÚÕâô×öʱҪÄÍÐĵÄ
µÈ£¬ÒòΪÔÚÒ»¸ö¼¸°Ù megabyte ÉõÖÁ¼¸ gigabyte µÄ file systemÖÐÕÒÒ»¸öµµ
°¸£¬Ò»¶¨µÃ»¨²»ÉÙʱ¼ä¡£
4.4) Ò»¸öÖ´ÐÐÖеijÌʽÈçºÎÖªµÀ×Ô¼ºµÄ pathname?
Èô¹û argv[0] ÊÇÒÔ "/" ¿ªÊ¼µÄ×Ö£¬Ëü¿ÉÄܾÍÊÇÄãµÄ³ÌʽËùÔڵصľø¶Ô·¾¶¡£
Èç¹û²»ÊÇÄǾ͵ÃÕÕ˳Ðò¼ì²é PATH ÀïµÄÿһ¸öĿ¼¿´¿´ÀïÃæÊÇ·ñÓÐÓë argv[0]
Ò»ÑùµÄ³Ìʽ¡£Èç¹ûÕҵõ½µÄ»°½«ÄǸöĿ¼Óë³ÌʽÃû³Æ¶µÆðÀ´¿ÉÄܾÍÊÇÄãÒªµÄ
pathname ÁË¡£
²»¹ýÉÏÊö·½·¨ÕÒµ½µÄ²¢²»Ò»¶¨ÊÇÕýÈ·µÄ£¬ÒòΪÔÚ³ÌʽÖÐÓõ½ exec() ʱ£¬
argv[0] ÊÇ¿ÉÒÔËæ±ã¸øµÄ¡£½« argv[0] ÉèΪÓëÒªÖ´ÐеijÌʽÃû³ÆÏàֻͬÊÇÒ»
ÖÖ¹ßÓ÷¨°ÕÁË£¡
ÒÔϵÄÀý×Ó¿ÉÄÜ»áʹÄã¸üÇå³þЩ£º
#include <stdio.h>
main()
{
execl("/usr/games/rogue", "vi Thesis", (char *)NULL);
}
Õâ¸ö±»Ö´ÐеijÌʽ¾Í»áÈÏΪËüµÄÃû×Ö(argv[0] Ö®Öµ)ÊÇ "vi Thesis"£©¡£
4.5) ÈçºÎÓà popen() ¶ÔÒ»¸ö process ×ö¶ÁдµÄ¶¯×÷£¿
Óà pipe ½«Ò»¸ö process µÄÊä³ö¡¢ÊäÈëת¸øÈÎÒâµÄ process Ëù¿ÉÄܻᷢÉúµÄ
ÎÊÌâ¾ÍÊÇ deadlock£¬Æ©ÈçÕâÁ½¸ö processes ¸ÕºÃͬʱ¶¼Ôڵȴý¡¸ÉÐδ²úÉú¡¹
µÄÊäÈëʱ¡£Î¨Ò»ÄܱÜÃâ deadlock µÄ·½·¨¾ÍÊÇÔÚ pipe µÄÁ½¶Ë¶¼Òª×ñÑÑϸñµÄ
deadlock-free ж¨£¬µ«ÊÇÐèÒªÕâЩ processes Ö®¼äµÄ»¥ÏàºÏ×÷²ÅÄÜ´ï³É£¬
¶ø¶ÔÓÚÏñ popen() ÕâÀàµÄº¯ÊýÀ´Ëµ²¢²»Ì«Êʺϡ£
ÔÚ 'expect' Õâ¸öÈíÌåÖи½ÓÐÒ»¸öÄܹ»Èà C ³Ìʽֱ½ÓÒýÓõĺ¯Ê½¿â¡£ÆäÖÐÓÐ
Ò»¸öº¯Ê½²»¹ÜÊÇÔÚ¶Á»òд¶¼ÄÜ´ïµ½ºÍ popen ÏàͬµÄ¹¦ÄÜ¡£µ«ÊÇÕâ¸öº¯Ê½Ê¹
¹
Óà ptys ¶ø²»ÊÇ pipes£¬Ò²Ã»ÓÐ deadlock µÄÎÊÌ⣬²¢ÇÒÔÚ BSD »ò SV Öж¼
ÄÜʹÓá£ÈôÏë¶Ô 'expect' ÓнøÒ»²½µÄÁ˽⣬¿É²Î¿¼ÏÂÒ»¸öÎÊÌâµÄ½â´ð¡£
4.6) ÔÚ C ³ÌʽÖÐÒªÔõôÓà sleep() ²ÅÄܹ» sleep СÓÚÒ»Ã룿
Ê×ÏÈҪעÒâµÄÊÇ£¬ÄãÖ»ÄÜÖ¸¶¨ delay µÄ¡¸×î¶Ì¡¹Ê±¼ä£»Êµ¼ÊÉÏ»á delay ¶à¾ÃºÍ
ϵͳµÄ scheduling ·½Ê½Óйأ¬ÀýÈçϵͳµ±Ê±ÓиºÔØ¡£Èç¹ûÄ㵹鹵ϰ£¬Ëü»¹¿É
ÄÜ»á delay Âù³¤µÄʱ¼ä¡£
²¢Ã»ÓÐÒ»¸ö±ê×¼º¯Ê½Äܹ»ÔÚ¡¸Ð¡Ë¯¡¹£¨ºÜ¶ÌµÄ sleep£©ÆÚ¼äÌṩÄã¼ÆÊýµÄ¹¦ÄÜ¡£
ijЩϵͳÓÐÌṩ usleep(n) µÄº¯Ê½£¬ËüÄܹ»ÔÝÍ£Ö´ÐÐ n ΢Ã루microsecond£©
µÄʱ¼ä¡£Èç¹ûÄãËùʹÓõÄϵͳûÓÐÌṩ usleep() º¯Ê½£¬ÄÇôÒÔÏÂÓпÉÔÚ BSD£¬
System V ʹÓÃÖеÄ×÷·¨¡£
½ÓÏÂÀ´µÄÕâ¶Î³ÌʽÂëÊÇ Doug Gwyn ÔÚ System V ÖÐÄ£Äâ 4BSD ²¢ÀûÓà 4BSD
ÖÐµÄ select() ϵͳºô½Ð¡£Doung ×Ô¼º¶¼½ÐËüΪ 'nap()' £»ÄãÒ²¿ÉÒÔ°ÑËü½Ð×ö
"usleep()"£»
/*
usleep -- support routine for 4.2BSD system call emulations
last edit: 29-Oct-1984 D A Gwyn
*/
extern int select();
int
usleep( usec ) /* returns 0 if ok, else -1 */
long usec; /* delay in microseconds */
{
static struct /* `timeval' */
{
long tv_sec; /* seconds */
long tv_usec; /* microsecs */
} delay; /* _select() timeout */
delay.tv_sec = usec / 1000000L;
delay.tv_usec = usec % 1000000L;
return select( 0, (long *)0, (long *)0, (long *)0, &delay );
}
On System V you might do it this way:
/*
subseconds sleeps for System V - or anything that has poll()
Don Libes, 4/1/1991
The BSD analog to this function is defined in terms of
microseconds while poll() is defined in terms of milliseconds.
For compatibility, this function provides accuracy "over the long
run" by truncating actual requests to milliseconds and
accumulating microseconds across calls with the idea that you are
probably calling it in a tight loop, and that over the long run,
the error will even out.
If you aren't calling it in a tight loop, then you almost
certainly aren't making microsecond-resolution requests anyway,
in which case you don't care about microseconds. And if you did,
you wouldn't be using UNIX anyway because random system
indigestion (i.e., scheduling) can make mincemeat out of any
timing code.
Returns 0 if successful timeout, -1 if unsuccessful.
*/
#include <poll.h>
int
usleep(usec)
unsigned int usec; /* microseconds */
{
static subtotal = 0; /* microseconds */
int msec; /* milliseconds */
/* 'foo' is only here because some versions of 5.3 have
* a bug where the first argument to poll() is checked
* for a valid memory address even if the second argument is 0.
*/
struct pollfd foo;
subtotal += usec;
/* if less then 1 msec request, do nothing but remember it */
if (subtotal < 1000) return(0);
msec = subtotal/1000;
subtotal = subtotal%1000;
return poll(&foo,(unsigned long)0,msec);
}
ÔÚ System V »òÆäËû ·Ç-BSD µÄ Unix ÖÐҪʹÓÃÕâÀàµÄ¡¸Ð¡Ë¯¡¹³Ìʽ£¬¿ÉÒÔÓÃ
Jon Zeeff µÄ s5nap£¬ËüÔø±»·¢±íÔÚ comp.sources.misc, volume 4 ÖС£Ëü
ÐèÒª°²×°Ò»¸öÇý¶¯³Ìʽ£¬µ«ÊÇ×°ºÃºó¾Í¿ÉÒÔÅܵúܺᣣ¨ËüµÄ¾«È·¶È»áÊܵ½
kernel ÖÐ HZ Õâ¸ö±äÊýµÄÓ°Ï죬ÒòΪËüÊÇÓõ½ÁË kernel ÖÐµÄ delay() º¯
ʽ¡££©
ÏÖÔںܶà½Ïа汾µÄ Unix ¶¼ÓÐÌṩÕâÀàµÄ¡¸Ð¡Ë¯¡¹¹¦ÄÜÁË¡£
4.7) ÈçºÎÈà setuid µÄ shell script ¿ÉÒÔʹÓã¿
[ Õâ¸öÎÊÌâµÄ»Ø´ðºÜ³¤£¬µ«ÊÇÕâÊÇÒ»¸ö¸´ÔÓÓÖ³£ÎʵÄÎÊÌâ¡£ÔÚ´ËҪлл Maarten
Litmaath ËùÌṩµÄ´ð°¸ºÍÒÔÏÂËùÌáµ½µÄ "indir" ³Ìʽ¡£]
ÏȼÙÉèÄãËùÓÃµÄ UNIX ÊÇÄÜÈϵḿÉÖ´ÐÐµÄ shell script¡¹µÄ±äÒì¹ýµÄ UNIX
£¨Èç 4.3BSD »ò SunOS£©¡£ÕâÀà script µÄµÚÒ»ÐÐÒ»¶¨ÊÇÈçÒÔÏÂÒ»°ã£º
#!/bin/sh
ÕâÑùµÄ script ¾ÍÊÇËùν¿ÉÖ´ÐÐµÄ script£¬ÒòΪËüºÍÒ»°ã¿ÉÖ´ÐеÄbinary µµ
Ò»ÑùÓÐ magic number ×ö¿ªÍ·¡£ÔÚÎÒÃÇËùÓõÄÀý×ÓÖУ¬magic number Ϊ
'#!'£¬OS »á°ÑÕâÐнÓÏÂÀ´µÄ²¿·Ýµ±×÷ÕâÕû¸ö script µÄ½âÒë³Ìʽ£¬Æäºó¿ÉÄÜ»¹
»áÓÐһЩ option È磺
#!/bin/sed -f
¼ÙÉèÕâ¸ö script µÄÃû×Ö½Ð×ö 'foo'£¬²¢ÇÒ·ÅÔÚ /bin Ï£¬ÄÇôÈç¹ûÄãÓãº
foo arg1 arg2 arg3
ÄÇô OS ʵ¼ÊÔÚÖ´ÐÐʱ»á°ÑËü¿´³ÉÊÇ£º
/bin/sed -f foo arg1 arg2 arg3
ÓÐÒ»µã²»Í¬µÄÊÇ£ºÈç¹û 'foo' ±»É趨³É setuid£¬ÄÇô OS »á°ÑËüÒÔµÚÒ»ÖÖ¸ñ
ʽÀ´½âÊÍ£»Èç¹ûÄãÓ²ÊÇÒÔµÚ¶þÖÖ¸ñʽÊäÈ룬ÄÇô OS »áÒÔ /bin/sed µÄ
permission Ϊ׼£¬¶øËüµ±È»²»»áÊÇ setuid¡£
ºÃ°É£¬ÄÇÈç¹ûÎÒµÄ shell script ²¢²»ÊÇÒÔ '#!' ×ö¿ªÍ·£¬»òÊÇÎÒµÄ OS ¸ù±¾¾Í
²»ÈϵÃËüÄØ£¿
àÅ£¬Èç¹ûÕâ¸ö shell£¨»òÊÇÆäËûµÄ½âÒë³Ìʽ£©ÊÔÖøÒªÈ¥Ö´ÐÐËü£¬ÄÇô OS »á´«»Ø
Ò»¸ö´íÎóѶϢ£¬±íʾÕâ¸öµµ°¸²»ÊÇÒԺϷ¨µÄ magic number ×ö¿ªÍ·¡£ÊÕµ½Õâ¸ö´í
ÎóѶϢºó£¬shell »á°ÑÕâ¸öµµ°¸È϶¨³ÉÊÇ shell script£¬²¢ÒÔÁíÒ»ÖÖ·½Ê½À´Ö´ÐУº
/bin/sh shell_script arguments
µ«ÊÇÎÒÃÇÔÚÇ°ÃæÒѾ¿´µ½ÁË£¬ÔÚÕâÑùµÄÇéÐÎÏ£¬±»Éè³ÉΪ setuid µÄ
shell_script ²¢²»»á·¢Éú×÷Óá£
ÄÇô£¬Éè³É setuid µÄ shell script µ½µ×ÓÐʲô°²È«ÉϵÄÎÊÌâÄØ£¿
àÅ£¬¼ÙÉèÕâ¸ö script ½Ð×ö '/etc/shell_script'£¬ËüµÄ¿ªÍ·ÊÇ£º
#!/bin/sh
ÏÖÔÚÎÒÃÇÀ´¿´¿´ÒÔϵÄÃüÁî»á·¢ÉúʲôÊ£º
$ cd /tmp
$ ln /etc/setuid_script -i
$ PATH=.
$ -i
ÎÒÃÇ¿ÉÒÔ¿´³öÀ´£¬ÒÔÉϵÄ×îºóÒ»¸öÃüÁî»á±»½âÊͳɣº
#!/bin/sh -i
¶øÕâÑùµÄÃüÁî»áÈÃÎÒÃǵõ½Ò»¸ö¿ÉÒÔÊäÈëÃüÁîµÄ shell£¬²¢Çһᱻ setuid ³É
Õâ¸ö script µÄÓµÓÐÕß¡£
ÐҺã¬ÕâÑùµÄ°²È«Â©¶´¿ÉÒÔºÜÇáÒ׵طÀÖ¹£¬Ö»ÐèÒª°ÑµÚÒ»Ðиijɣº
#!/bin/sh -
'-' Õâ¸ö·ûºÅ´ú±íÖøËüÊÇÕû¸ö option list µÄ½áβ£ºËùÒÔÈç¹ûÔÙÓÃǰÊöµÄ·½·¨
µÄ»°£¬'-i' ¾Í»áÈç±¾À´ËùÆÚÍûµÄ±»½âÊÍ³É script µµ°¸µÄÃû×Ö¡£
È»¶ø£¬»¹ÓиüÑÏÖØµÄÎÊÌ⣺
$ cd /tmp
$ ln /etc/setuid_script temp
$ nice -20 temp &
$ mv my_script temp
µÚÈý¸öÃüÁî»á±»½âÊͳɣº
nice -20 /bin/sh - temp
¶øÒòΪÕâ¸öÃüÁîµÄÓÅÏÈȨ±»ÉèµÃºÜµÍ£¬ÄÇôµÚËĸöÃüÁî¿ÉÄܾÍÓлú»áÇÀÏÈÔÚ
shell ¿ªÆô 'temp' ֮ǰ¾ÍÓà 'my_script' °Ñ 'temp' ¸ø¸Çµô£¡ÓÐËÄÖÖ·½·¨
¿ÉÒÔÐÞ²¹Õâ¸ö°²È«ÉϵÄ©¶´£º
1) Èà OS ÓÃÁíÒ»¸ö±È½Ï°²È«µÄ·½Ê½Ö´ÐÐ setuid script¡£Èç System V R4 ºÍ
4.4BSD ÀûÓà /dev/fd À´°Ñ¸Ã script µÄ file descriptor ´«¸ø½âÒë³Ìʽ¡£
2) ͸¹ýÒ»¸öǰ¶Ë³ÌʽÀ´¼ä½Ó½âÒëÒªÖ´ÐÐµÄ script£¬ÒÔÈ·¶¨ÔÚÕæÕýµÄ½âÒë³Ìʽ
Æô¶¯Ç°Ò»ÇÐÕý³£¡£ÀýÈ磬Äã¿ÉÒÔÓà comp.sources.unix ÖÐµÄ 'indir' ³Ì
ʽ£¬ÄÇôÄãµÄ script ¿ªÍ·¾Í»áÏñÕâÑù£º
#!/bin/indir -u
#?/bin/sh /etc/setuid_script
3) ÔìÒ»¸ö 'binary wrapper'£ºÒ»¸öÕæÕýµÄ setuid ¿ÉÖ´ÐгÌʽ£¬Õâ¸ö³ÌʽµÄ
Ψһ¹¦ÄܾÍÊÇÓÃÀ´Ö´ÐÐ script ÖÐËùÖ¸¶¨µÄ½âÒë³Ìʽ£¬²¢ÒԸà script µÄµµ
ÃûΪ²ÎÊý´«¸ø½âÒë³Ìʽ¡£
4) ÔìÒ»¸ö 'setuid script server' £¬²¢°ÑһЩҪÓõ½¡¢¼ì²é¹ýµÄ setuid
script ´æ·ÅÔÚ database ÖС£µ±³É¹¦µØ±»ºô½Ðºó£¬»áÈ¥Ö´ÐÐÕýÈ·µÄ½âÒë³Ì
ʽ¼°ÕýÈ·µÄ script¡£
ÏÖÔÚÎÒÃÇÒѾÄÜÈ·¶¨Ëù½âÒëµ½µÄ script ÊÇÕýÈ·µÄ£¬ÄÇô»¹ÓÐÆäËûµÄΣÏÕÂð£¿
ºÜ±§Ç¸£¬µ±È»»¹ÓУ¡ÔÚʹÓà shell scipt µÄʱºò£¬ÄãÒ»¶¨²»ÄÜÍü¼ÇÒª°Ñ PATH
Õâ¸ö±äÊýºÜÃ÷È·µØÉèµ½ÕýÈ·µÄ·¾¶È¥¡£ÄãÄܹ»Ö¸³öÕâÊÇΪʲôÂ𣿳ý´ËÖ®Í⣬
»¹ÓÐ IFS Õâ¸ö±äÊýÈç¹ûûÉèºÃÒ²¿ÉÄÜ»áÔì³ÉÎÊÌâ¡£ÆäËûµÄ»·¾³±äÊýÒ²¿ÉÄÜ»áÐÎ
³É°²È«ÉϵÄÎÊÌ⣬Èç SHELL... ¸üÖØÒªµÄ£¬Äã±ØÐëҪȷ¶¨ÔÚ script ÖÐûÓÐÃü
Áî»áÈÃËü²úÉú³ö¿ÉÏÂÃüÁîµÄ shell£¨interactive shell escape£©£¡»¹ÓоÍÊÇ£¬
umask ¿ÉÄܱ»Éè³ÉÆæ¹ÖµÄÖµµÈµÈ...
³ý´ËÖ®Í⣬ÄãÓ¦¸ÃÒªÖªµÀ setuid script »á¡¸¼Ì³Ð¡¹ËùÓÐËüËùÓõ½µÄÃüÁîµÄ
bug ¼°°²È«ÎÊÌâ¡£
×ܶøÑÔÖ®£¬ÄãÓ¦¸ÃÖªµÀ setuid shell script ÕæµÄÊǼþ·Ç³£Î£ÏÕµÄʰɣ¡
×îºÃ»¹ÊÇд C ³ÌʽÀ²¡£
4.8) ÎÒÒªÈçºÎµÃÖªÓÐÄÄЩ process ¿ªÁËijһµµ°¸£¬»òijһ process ÕýÔÚʹÓÃÄÄ
Ò»¸ö fileystem(ÒÔÖÁÓÚÎÒÎÞ·¨ unmount Õâ¸ö filesystem)?
Äã¿ÉÒÔÓà fuser(system V)£¬fstat(BSD)£¬ofiles(public domain) »òÊÇ pff
(public domain)¡£ÕâЩ³Ìʽ¿ÉÒÔ¸æËßÄãÄÄЩ processes ÕýÔÚʹÓÃÄÄЩµµ°¸¡£
4.3BSD µÄ fstat£¬ÓÐÒ»·Ý Dynix£¬SunOS Óë Ultrix ¶¼¿ÉÒÔÓÃµÄ port¡£Äã¿ÉÒÔ
ÕÒÕÒ·Å comp.sources.unix, volume 18µÄµØ·½¡£
Pff ÊÇ kstuff ÕâÌ×ÈíÌåµÄÒ»²¿·Ö£¬ºÜ¶àϵͳÉ϶¼¿ÉÒÔÓá£ÓûÈ¡µÃ kstuff Çë²Î
¿¼ÎÊÌâ 3.10¡£
4.9) ÎÒÒªÔõô֪µÀÊÇËÔÚ finger ÎÒ°¡£¿
Ò»°ãÀ´Ëµ£¬ÄãÊÇÎÞ·¨ÕÒ³öÔÚÔ¶¶Ë»úÆ÷ finger ÄãµÄÄǸöÈ赀 userid µÄ¡£Äã´ó¸Å
Ö»ÄÜÕÒ³öÔÚ´ÓÄĄ̈»úÆ÷ finger µÄ¡£ÁíÍâÓÐÒ»ÖÖ¿ÉÐеķ½·¨£¬Èç¹ûÄãµÄϵͳ֧Ԯ
²¢ÇÒ¼ÙÉè finger daemon ²»·´¶ÔµÄ»°£¬ÄÇô¿ÉÒÔ°ÑÄãµÄ .plan µµÓà "named
pipe" ¶ø²»ÓÃÒ»°ãµÄÎÄ×Öµµ¡££¨Óà 'mknod' À´Ô죩
½ÓÏÂÀ´£¬ÄãÖ´ÐÐÒ»¸ö³Ìʽȥд£¨open for writing£©ÄãµÄ .plan µµ£»µ«ÊÇÓÉÓÚ
ÄãµÄ .plan ÊÇÒ»¸ö "named pipe"£¬ËùÒÔÕâ¸ö¿ªµµµÄ¶¯×÷ÒªÒ»Ö±µÈµ½ÓÐÆäËûµÄ
process È¥¶Á£¨open for reading£©ÄãµÄ .plan µµÊ±²Å»á³É¹¦¡£ÏÖÔÚÄã¾Í¿ÉÒÔ
ÈÎÒâµØ°ÑÄãËùÏëÈÃÈË finger µ½µÄ .plan ÄÚÈÝдÈëÕâ¸ö pipe¡£ÔÚ
comp.sources.misc, volumn 41 ÖÐÓиö "planner" µÄ³Ìʽ¿ÉÒÔ×öÕâ¼þÊ¡£
µ±È»£¬Èç¹ûÄãµÄϵͳ²»Ö§Ô® "named pipe"£¬»òÊÇÄãËùÓÃµÄ finger ³Ìʽֻ½ÓÊÜ
´¿ÎÄ×ÖµÄ .plan µµ£¬ÄÇôÒÔÉϵķ½·¨¾ÍÐв»Í¨ÁË¡£
ÄãµÄ³ÌʽҲ¿ÉÒÔ½åÓɲ鿴 "netstat" µÄÊä³ö£¬À´ÕÒ³öÕâ´ÎµÄ finger ÊÇ´ÓÄÇÀï
Á¬¹ýÀ´µÄ£¬µ«ÊÇÕâ²¢ÎÞ·¨¿´³öÔ¶¶ËÖ´ÐÐ finger µÄÈËÊÇË¡£
ÏëÒªÖªµÀÔ¶¶ËµÄÈËÊÇË£¬±ØÐëÒªÔ¶¶ËµÄ»úÆ÷ÓÐÅÜÖ§Ô®Èç RFC 931 µÄʶ±ð³Ìʽ²Å
ÐС£
ÏÖÔÚ£¬ÔÚ³£¼ûµÄ BSD ϵͳÉϾÍÓÐÈýÖÖ RFC 931 µÄʵ×ö³Ìʽ£¬Í¬Ê±Ò²ÓÐÐí¶àµÄ
Ó¦ÓóÌʽ£¨Èç wuarchive ftpd£©Ö§Ô®¡£Èç¹ûÄãÏëµÃµ½¸ü¶àÓÐ¹Ø RFC 931 µÄ×Ê
Ѷ£¬¿ÉÒÔ¼ÓÈë rfc931-user µÄ mailing list£¬
rfc931-users-request@kramden.acf.nyu.edu¡£
ÁíÍ⻹ÓÐÈý¸ö×¢ÒâÊÂÏî¡£µÚÒ»£¬ÓÐÐí¶àµÄ NFS ϵͳÎÞ·¨ÕýÈ·µØ´¦Àí "named
pipe"¡£Õâ¸öÒâ˼ÊÇ£¬µ±ÄãҪȥ¶Á·ÅÔÚÁíÒ»²¿»úÆ÷É쵀 pipe ʱ£¬¿ÉÄܻᱻϵͳ
block סֱµ½time out£¬»òÊÇÒòΪ pipe µÄµµ°¸³¤¶ÈÊÇ 0 ËùÒÔϵͳ¾Í²»°ÑËüµÄ
ÄÚÈÝÁгöÀ´¡£
µÚ¶þ£¬ÔÚÐí¶àµÄϵͳÖУ¬fingerd »áÔÚ¶Á .plan µµÖ®Ç°ÏÈÈ¥¼ì²éËüÀïÃæÊÇ·ñÕæ
µÄÓÐ×ÊÁϲ¢ÇÒÊÇ¿ÉÒÔ¶ÁµÄ¡£ÕâÑù¾Í»áÔì³ÉÔ¶¶Ë finger ÄãµÄÈ˸ù±¾¾Í¿´²»µ½Äã
µÄ .plan µµ£¬ÒòΪÄãµÄ .plan ³¤¶ÈÊÇ 0¡£
µÚÈý£¬Ö§Ô® "named pipe" µÄϵͳͨ³£ÔÚͬһ¸öʱ¼äÀïÖ»ÔÊÐíϵͳÖдæÔÚij¸ö¹Ì
¶¨ÊýÄ¿µÄ pipes£¬¼ì²é kernel µÄ config µµºÍ FIFOCNT Ñ¡Ïî¼´¿ÉµÃÖª¡£Èç¹û
ϵͳÖÐµÄ pipe ÊýÄ¿³¬¹ýÁË FIFOCNT£¬ÄÇôϵͳ¾Í»áÔÝÍ£ËùÓÐÐ嵀 pipe Ö±µ½ÓÐ
È˹صôËûÏÈǰù¿ªµÄ pipe¡£ÕâÊÇÒòΪ pipe ËùÓõ½µÄ buffer ÊÇ·ÅÔÚ
non-paged µÄ¼ÇÒäÌåÖС£
4.10) Äܲ»ÄÜÔÚÒ»¸ö process ºÍ terminal µÄÁ¬½ÓÒѾ¶ÏµôÖ®ºóÔÙ½Ó»ØÀ´£¬ÀýÈç
ÔÚ background ÅÜÒ»¸ö³ÌʽȻºó¾Í logout ¶ø¶ÏµôµÄ³Ìʽ£¿
´ó²¿·Ý°æ±¾µÄ Unix ¶¼²»Ïñ VMS ºÍ Multics µÈ×÷ҵϵͳ֧Ԯ "detaching" ºÍ
"attaching" process¡£²»¹ý£¬ÓÐÁ½¸öÃâ·ÑµÄÈíÌåÄܹ»°ïÄã´ï³ÉÕâ¸öÄ¿µÄ¡
£
µÚÒ»¸öÊÇ "screen"£¬ÔÚ comp.sources.unix ÖеıêÌâÊÇ "Screen, multiple
windows on a CRT"¡££¨Äã¿ÉÒÔÔÚ comp.sources.misc, volumn 28 Öз¢±íµÄ
"screen-3.2" ÖÐÕÒµ½£©Õâ¸öÈíÌåÔÚ BSD£¬System V r3.2 ¼° SCO UNIX ½Ô¿ÉÖ´
ÐС£
µÚ¶þ¸öÊÇ "pty"£¬ÔÚ comp.sources.unix ÖеıêÌâÊÇ "Run a program under
a pty session"¡££¨¿ÉÒÔÔÚ volumn 23 ·¢±íµÄ "pty" ÖÐÕÒµ½£©"pty" Ö»ÄÜÔÚ
BSD µÄϵͳÖÐÖ´ÐС£
ÒÔÉÏÕâÁ½¸öÈíÌå¶¼ÓÐËݼ°¼ÈÍùµÄÄÜÁ¦£¬Ò²¾ÍÊÇ˵£¬ÄãÈç¹ûÏë¶Ôij¸ö process
×ö detach »ò attach µÄ¶¯×÷£¬ÄÇô¾Í±ØÐëÒªÏÈÔÚ screen »ò pty ÏÂÆô¶¯Ëü²Å
ÐС£
4.11) ÓÐûÓа취¿ÉÒÔ͵ÌýÒ»¸ö terminal£¬¾ÍÊÇ˵½«ÆäÊä³ö¸´ÖÆÒ»·ÝÖÁÆäËûµÄ
terminal¡£
Óм¸ÖÖ·½·¨¿ÉÒÔ´ï³ÉÕâ¸öÄ¿µÄ£¬²»¹ýûÓÐÒ»¸öÊÇÍêÃÀµÄ£º
* kibitz ÔÊÐíÁ½¸ö£¨»ò¸ü¶à£©µÄÈË͸¹ý shell£¨»òÆäËûµÄ³Ìʽ£©±Ë´Ë¹µÍ¨¡£
ËüµÄÓÃ;ÓУº
- ¼àÊÓ»òÔ®ÖúÁîÒ»È˵Äterminal session£»
- ¼Ç¼ËùÓеÄÊä³öÈëÒÔÓÃÀ´ÄܾíÒ³»ØÈ¥£¬´¢´æÕû¸öÊä³öÈ룬ÉõÖÁÊÇ¿É
ÒÔÖ±½Ó±à¼Ëü¡£
- µ±ÍŶӺÏ×÷ʱ£¬ÈçÖÆ×÷ game¡¢×«Ð´ÎļþµÈ¹¤×÷£¬Ã¿¸öÈ˶¼¸÷ÓÐËù³¤
¸÷ÓÐËù¶Ì£¬¾Í¿ÉÓôËÖÖ·½Ê½±Ë´Ë»¥²¹¡£
kibitz ÊÇ 'expect' ÈíÌåµÄÒ»²¿·Ý£¬Çë²é¿´ÎÊÌâ 3.9¡£
kibitz ÐèÒªÓб»¼àÊÓÈ˵ÄͬÒâ²ÅÄܽøÐС£Èç¹ûÏ벻ȡµÃͬÒâ¾Í½øÐмàÊÓ,ÄÇô¾Í
µÃÓÃһЩ±È½ÏÁîÈËÌÖÑáµÄ·½·¨ÁË£º
* Äã¿ÉÒÔ×Ô¼ºÐ´Ò»¸ö³ÌʽȥËѲéÕû¸ö kernel µÄ½á¹¹£¬¼àÊÓ terminal ËùÓõÄ
output buffer£¬È»ºó°ÑËüËùÊä³öµÄ×ÖȫץÏÂÀ´¡£ºÜÃ÷ÏԵģ¬ÕâÊÇÊìϤ Unix
kernel µÄÈ˲ſÉÄÜ×öµÃµ½µÄ¡£µ«ÊÇ£¬²»ÂÛÄãÊÇÓÃʲô·½·¨´ó¸Å¶¼ÎÞ·¨
Äõ½ÆäËûµÄ Unix È¥Óá£
* Èç¹ûÄãÊÇÏëÒªËæÊ±¼àÊÓÒ»¸öÌØ¶¨¡¢Êµ¼ÊÀÏßÁ¬É쵀 terminal£¨ÀýÈ磬ÄãÏëÈÃ
¹ÜÀíÕßÄܹ»´ÓÆäËû»úÆ÷µÄÖÕ¶Ë»ú²é¿´Ä³²¿»úÆ÷µÄ console£©£¬ÄÇÄã¿ÉÒÔǬ´à
½Óһ̨¼àÊÓÆ÷ÔÚͨÍùÄÇ̨ terminal µÄÏßÉÏ¡£¾ÙÀýÀ´Ëµ£¬°ÑÄãµÄ¼àÊÓÆ÷µÄÊä
³ö½Óµ½Áíһ̨»úÆ÷µÄ serial port£¬È»ºóÖ´ÐÐÒ»¸ö³ÌʽȥÊÕ¼¯ÄǸö port µÄ
ÊäÈë²¢°ÑËüתµ½ÁíÒ»¸ö port È¥£¬¶øÕâ¸ö port ¾ÍÕæµÄÁ¬µ½ÄãËùÒª¼àÊÓµÄ
terminal È¥¡£ÕâÑù×öµÄ»°£¬Äã±ØÐëÈ·¶¨´Ó¸Ã terminal À´µÄÊä³ö»áËæÖøÏß´«
»ØÈ¥£¬¼´Ê¹ÄãÖ»ÊDzå½ÓÔÚµçÄÔºÍ terminal µÄÖм䣬Õâ²¢²»»áÌ«ÄÑ×öµ½¡£ ÓÃ
Õâ¸ö·½·¨£¬¶Ô terminal ²¼Ïß²»Ì«ÊìϤµÄÈËÊÇÎÞ·¨·¢¾õµÄ¡£
* ÔÚ×î½üÒ»°æµÄ screen ÖÐÓÐÒ»ÖÖ multi-user ģʽ¿ÉÒÔÓá£ÈôÏë¶àÁ˽âÒ»
µã screen£¬Çë¿´ÎÊÌâ 4.10¡£
* Èç¹ûÄãËùʹÓõÄϵͳÓÐÌṩ stream£¨Èç SunOS£¬SVR4£©ÄÇôÄã¿ÉÒÔʹÓÃ
·¢±íÔÚ comp.sources.misc, volumn 28 ÖÐµÄ advise ³Ìʽ¡£Ëü²¢²»ÐèÒªÏÈ
Ö´ÐС££¨µ«ÊÇ£¬Äã±ØÐëÒªÊÂÏȰÑÄãµÄϵͳÉ趨³ÉÔÚ¿ªÆô tty »ò pty ʱ»á×Ô
¶¯°Ñ advise Ä£×é·ÅÈë stream ÖС££©
BBSˮľÇ廪վ¡Ã¾«»ªÇø