»·¾³±äÁ¿
ȱʡÇé¿öÏ£¬»·¾³±äÁ¿´Ó½ø³ÌµÄ¸¸½ø³Ì¼Ì³Ð¶øÀ´¡£µ«ÊÇ£¬ÔÚ³ÌÐòÖ´ÐÐÁíÒ»¸ö³ÌÐòʱ£¬µ÷ÓóÌÐò¿ÉÒÔ°Ñ»·¾³±äÁ¿ÉèÖÃΪÈÎÒâÖµ¡£Õâ¶Ôsetuid/setgid³ÌÐò¶øÑÔºÜΣÏÕ£¬ÒòΪÆäÈëÇÖÕß¿ÉÒÔÍêÈ«¿ØÖÆËüÃǵõ½µÄ»·¾³±äÁ¿¡£ÓÉÓÚ»·¾³±äÁ¿Ò»°ãÊǼ̳ÐÀ´µÄ£¬Í¬Ñù¿ÉÒÔ´«µÝʹÓã»°²È«³ÌÐò¿ÉÄܵ÷ÓÃijЩÆäËü³ÌÐò£¬ÔÚûÓÐÌØÊâ´ëÊ©µÄÇé¿öÏ£¬Õâ»á°ÑÓÐDZÔÚΣÏյĻ·¾³±äÁ¿Öµ´«µÝ¸øµ÷ÓõijÌÐò¡£
ÓÐЩ»·¾³±äÁ¿ÊÇΣÏÕµÄ
ÓÐЩ»·¾³±äÁ¿ÊÇΣÏյģ¬ÒòΪºÜ¶à¿âºÍ³ÌÐò±»»·¾³±äÁ¿ÒÔijЩÒþº¬¡¢Ä£ºý»òδ¹«¿ªµÄ·½Ê½Ëù¿ØÖÆ¡£ÀýÈ磬shºÍbash shellʹÓÃIFS±äÁ¿À´¾ö¶¨Äĸö×Ö·û±»ÓÃÀ´·Ö¸ôÃüÁîÐвÎÊý¡£ÓÉÓÚshellÊDZ»Èô¸Éµ×²ãµ÷Óã¨ÈçCÖеÄsystem(3)ºÍpopen(3)£¬»òPerlÖеÄback-tickËã·û£©Ö´Ðеģ¬°ÑIFSÉèÖÃΪ²»Ñ°³£µÄÖµ¾Í»á½ÁÂÒÄÇЩ¿´ÆðÀ´°²È«µÄµ÷Ó᣸ÃÐÐΪÔÚbashºÍshÀïÓÐ˵Ã÷£¬µ«²»ÒýÈËעĿ£»Ðí¶à³¤Ê±¼äµÄÓû§ÖªµÀIFS£¬Ö»²»¹ýÊÇÒòΪÁ˽âIFS¿ÉÓÃÀ´ÆÆ»µ°²È«ÐÔ£¬¶ø²»ÊÇÒòΪÓÐÒâ¾³£Ê¹ÓõÄÔµ¹Ê¡£¸üÔãµÄÊÇ£¬²»ÊÇËùÓеĻ·¾³±äÁ¿¶¼ÓÐÎĵµËµÃ÷£¬¶øÇÒ¼´Ê¹ÓУ¬ÆäËüµÄ³ÌÐòÒ²¿ÉÒԸıäºÍÔö¼ÓΣÏյĻ·¾³±äÁ¿¡£ËùÒÔΨһµÄÕæÕý½â¾ö·½°¸£¨ÏÂÎÄÓÐÃèÊö£©ÊÇֻѡÔñËùÐèÒªµÄ»·¾³±äÁ¿£¬²»Àí»áÆäÓàµÄ»·¾³±äÁ¿¡£
»·¾³±äÁ¿µÄ´æ´¢¸ñʽÊÇΣÏÕµÄ
Ò»°ãÀ´Ëµ£¬³ÌÐòÓ¦¸ÃʹÓñê×¼µÄ·ÃÎÊÀý³ÌÀ´·ÃÎÊ»·¾³±äÁ¿¡£ÀýÈ磬ÔÚCÀïӦʹÓÃgetenv(3)»ñÈ¡»·¾³±äÁ¿µÄÖµ£¬Ê¹ÓÃPOSIX±ê×¼Àý³Ìputenv(3)»òBSDÀ©Õ¹setenv(3)À´ÉèÖû·¾³±äÁ¿µÄÖµ£¬Ê¹ÓÃunsetenv(3)À´Çå³ý»·¾³±äÁ¿¡£ÐèҪ˵Ã÷µÄÊÇ£¬LinuxÏÂҲʵÏÖÁËsetenv(3)¡£µ«ºÚ¿Í²»»áÕâôÉÆÁ¼£»ºÚ¿Í¿ÉÒÔÓÃexecve(2)Ö±½Ó¿ØÖÆ´«µÝ¸ø³ÌÐòµÄ»·¾³±äÁ¿Êý¾ÝÇø¡£Õâ¾Í¿ÉÄܽøÐÐһЩ°¹ÔàµÄ¹¥»÷£¬Ö»ÓÐÄÇЩÁ˽⻷¾³±äÁ¿¹¤×÷ʵÖʵÄÈ˲ÅÄÜÀí½âÕâЩ¹¥»÷¡£ÔÚLinuxÏ¿ÉÒÔÔĶÁenviron(5)À´Á˽⻷¾³±äÁ¿¹¤×÷ʵÖʵĸÅÒª¡£¼ò¶øÑÔÖ®£¬»·¾³±äÁ¿ÔÚÄÚ²¿×÷Ϊһ¸öÖ¸Ïò×Ö·ûµÄÖ¸ÕëÊý×éµÄÖ¸ÕëÀ´´æ´¢£»¸ÃÊý×鰴˳Ðò´æ´¢²¢ÒÔNULLÖ¸Õë½á⣨ÕâÑù¾Í¿ÉÒÔÖªµÀºÎʱÊý×é½áÊø£©¡£Ö¸Ïò×Ö·ûµÄÖ¸Õëÿ¸ö¶¼ÒÀ´ÎÖ¸ÏòÒ»¸öÐÎʽΪ¡°NAME=value¡±µÄÒÔNIL½áβµÄ×Ö·û´®Öµ¡£Õâ°üº¬Èô¸ÉÒâÒ壬ÀýÈ磬»·¾³±äÁ¿Ãû²»ÄÜ°üº¬µÈºÅ£¬¶øÇÒname»òvalue¶¼²»Äܺ¬ÓÐNIL×Ö·û¡£µ«ÊÇ£¬ÕâÖÖ¸ñʽÓÐÒ»¸öºÜΣÏյĺ¬Ò壬¾ÍÊÇÔÊÐí¶à¸öÈë¿ÚʹÓÃͬһ¸ö±äÁ¿Ãû¶øÖµ²»Í¬£¨ÈçSHELLÓжà¸öÖµ£©¡£ËäÈ»µäÐ͵ÄÃüÁîshell½ûÖ¹Õâô×ö£¬±¾µØ²Ù×÷µÄºÚ¿Í¿ÉÒÔʹÓÃexecve(2)ÖÆÔì³öÕâÑùµÄÇé¿öÀ´¡£
ÕâÖÖ´æ´¢¸ñʽ£¨ÒÔ¼°ÉèÖ÷½Ê½£©µÄÎÊÌâÔÚÓÚ³ÌÐò¿ÉÄÜ»á¼ì²éij¸öÖµ£¨¿´¿´ÊÇ·ñºÏ·¨£©¶øʵ¼ÊÉÏʹÓõÄÈ´ÊÇÁíÒ»¸ö²»Í¬µÄÖµ¡£ÔÚLinuxÏ£¬GNUµÄglibc¿âÊÔͼ±£»¤³ÌÐòÃâÊÜ´ËÓ°Ï죺ÔÚʵÏÖglibc 2.1µÄgetenvʱ£¬×ÜÊÇ»ñÈ¡µÚÒ»¸öÆ¥ÅäµÄÈë¿Ú£¬setenvºÍputenv×ÜÊÇÉèÖõÚÒ»¸öÆ¥ÅäµÄÈë¿Ú£¬¶øunsetenvʵ¼ÊÉÏ»áÇå³ýËùÓÐÆ¥ÅäÈë¿ÚµÄÉèÖã¨Ó¦¸Ã×£ºØGNUµÄglibcʵÏÖÕßÈç´ËʵÏÖunsetenv£¡£©¡£µ«ÊÇ£¬ÓÐЩ³ÌÐòÖ±½Ó·ÃÎÊ»·¾³±äÁ¿£¬Öظ´±éÀúËùÓл·¾³±äÁ¿£»ÔÚÕâÖÖÇé¿öÏ£¬ËüÃÇ¿ÉÄÜ»áʹÓÃ×îºóÒ»¸öÆ¥ÅäµÄÈë¿Ú£¬¶ø²»ÊǵÚÒ»¸ö¡£Æä½á¹û¾ÍÊÇÈç¹û¼ì²éµÄÊǵÚÒ»¸öÆ¥ÅäµÄÈë¿Ú£¬µ«Êµ¼ÊʹÓõÄÊÇ×îºóÒ»¸öÆ¥ÅäµÄÈë¿Ú£¬ºÚ¿Í¾Í¿ÉÒÔÒÔ´ËÀ´Èƹý±£»¤Àý³Ì¡£
½â¾ö·½°¸ -- ÌáÈ¡ºÍÇå³ý
¶ÔÓÚ°²È«µÄsetuid/setgid³ÌÐò£¬Ó¦¸ÃСÐÄÌáÈ¡ÐèÒª×÷ΪÊäÈ루Èç¹ûÐèÒªµÄ»°£©µÄ¼ò¶ÌµÄ»·¾³±äÁ¿ÁÐ±í¡£È»ºóÓ¦¸ÃÇå³ýÕû¸ö»·¾³£¬ÔÙÖØÐÂÉèÖÃһС×é±ØÐèµÄ»·¾³±äÁ¿×÷Ϊ°²È«µÄÖµ¡£Èç¹ûµ÷ÓÃÁËÏÂÒ»¼¶µÄ³ÌÐò£¬Õâʵ¼ÊÉϲ¢²»ÊÇʲô¸üºÃµÄ°ì·¨£»ÒòΪûÓпÉÐеİ취À´Áгö¡°ËùÓеÄΣÏÕÖµ¡±¡£¼´Ê¹¶ÔÖ±½Ó»ò¼ä½Óµ÷ÓõÄÿһ¸ö³ÌÐòµÄÔ´Â붼½øÐÐÁË×Ðϸ¼ìÔÄ£¬»¹ÊÇÓÐÈË¿ÉÒÔÔÚÄã±àдÍê´úÂëºó¼ÓÈëеÄδ¹«¿ªµÄ»·¾³±äÁ¿£¬ÆäÖоͿÉÄÜÓÐÒ»¸ö¿ÉÀûÓõĻ·¾³±äÁ¿¡£
Çå³ý»·¾³µÄ¼òµ¥·½Ê½ÊÇ°ÑÈ«¾Ö±äÁ¿environÉèÖÃΪNULL¡£È«¾Ö±äÁ¿environÔÚÖж¨Ò壬C/C++Óû§ÐèÒª#include¸ÃÍ·Îļþ¡£ÔÚ²úÉúÏß³ÌÇ°ÐèÒª´¦Àí¸ÃÖµ£¬µ«Õ⼸ºõ²»³ÉÎÊÌ⣬ÒòΪÔÚ³ÌÐòÖ´ÐеĿªÊ¼½×¶Î¾ÍÐèÒª½øÐÐÕâЩ´¦Àí¡£ÁíÒ»¸öÇå³ý»·¾³µÄ·½Ê½ÊÇʹÓÃδ¹«¿ªµÄº¯Êýclearenv()¡£clearenv()ÓиöÆæ¹ÖµÄÀúÊ·£»ÓÐÈ˽¨ÒéÔÚPOSIX.1Öж¨ÒåËü£¬µ«²»ÖªÊ²Ã´ÔÒòËüûÓнøÈë±ê×¼¡£¾¡¹ÜÈç´Ë£¬POSIX.9£¨°ó¶¨POSIXµÄFortran 77£©Öж¨ÒåÁËclearenv()£¬ËùÒÔËü¾ßÓÐÁË°ë¹Ù·½µÄµØλ¡£clearenv()¶¨ÒåÔÚ£¬µ«ÔÚʹÓÃ#include°üº¬Ëü֮ǰ£¬±ØÐëÈ·¶¨__USE_MISCÒѾ#defined¡£
Ò»¸ö¼¸ºõ¿ÉÒÔÈ·¶¨»á²»¶ÏÌí¼ÓµÄÖµÊÇPATH£¬Ò»¸ö²éÕÒ³ÌÐòµÄĿ¼ÁÐ±í£»PATHÓ¦¸Ã²»°üÀ¨µ±Ç°Ä¿Â¼£¬Ò»°ãÓ¦¸ÃÏñ¡°/bin:/usr/bin¡±ÄÇÑù¼òµ¥¡£Ò»°ã»¹»áÉèÖÃIFS£¨ÆäȱʡֵΪ¡° \t\n¡±£©ºÍTZ£¨Ê±Çø£©¡£Èç¹û²»ÌṩIFS»òTZ£¬LinuxÒ²²»»áËÀ»ú£¬µ«Ã»ÓÐTZֵʱÓÐЩ»ùÓÚSystem VµÄϵͳ»á³öÎÊÌ⣬¶øÇҾݴ«ÑÔijЩshellÐèÒªIFSÖµ±»ÉèÖá£ÔÚLinuxÏ£¬²Î¼ûenviron(5)ÒÔÁ˽â¿ÉÄÜÐèÒªÉèÖõÄͨÓû·¾³±äÁ¿ÁÐ±í¡£
Èç¹ûȷʵÐèÒªÓû§ÌṩµÄÖµ£¬Ê×ÏÈÒª¼ì²éÕâЩֵ£¨ÒÔ±£Ö¤ÕâЩֵÓëºÏ·¨ÖµµÄģʽÏàÆ¥Å䣬¶øÇÒÔÚijЩºÏÀíµÄ×î´ó³¤¶ÈÖ®ÄÚ£©¡£ÀíÏëÇé¿öÊÇÔÚ/etcÏÂÓÐЩ±ê×¼µÄ¿ÉÐÅÀµÎļþ£¬°üº¬¡°±ê×¼µÄ°²È«»·¾³±äÁ¿Öµ¡±µÄÐÅÏ¢£¬µ«ÊÇÏÖÔÚûÓÐΪ´ËÄ¿µÄ¶¨ÒåµÄ±ê×¼Îļþ¡£Óë´ËÏàËÆ£¬¿ÉÄÜÐèÒªÔÚÄÇЩ¾ßÓÐPAMÄ£¿éµÄϵͳÀï¼ì²éPAMÄ£¿éµÄpam_env¡£
Èç¹û²ÉÓò»ÔÊÐíÖ±½ÓÖØÐÂÉèÖû·¾³µÄÓïÑÔ±àдsetuid/setgid³ÌÐò£¬Ò»¸ö·½·¨Êǽ¨Á¢Ò»¸ö¡°°ü¹ü¡±³ÌÐò¡£°ü¹ü³ÌÐò°Ñ»·¾³³ÌÐòÉèÖÃΪ°²È«Öµ£¬È»ºóµ÷ÓÃÆäËü³ÌÐò¡£×¢Ò⣺ȷ¶¨°ü¹ü³ÌÐò»áʵ¼ÊÖ´ÐÐÔ¤ÆڵijÌÐò£»Èç¹ûËüÊǸö½âÊͳÌÐò£¬ÒªÈ·¶¨²»»á³öÏÖ¿ÉÄܵľºÕù״̬£¬Ê¹µÃ½âÊÍÆ÷Äܹ»ÔØÈëÁíÒ»¸öÓëÊÚÓèÁËÌØÊâµÄsetuid/setgidȨÏ޵ijÌÐò²»Í¬µÄ³ÌÐò¡£