[ 1Àå, 2Àå, 3Àå, 4Àå, 5Àå, 6Àå, 7Àå, 8Àå, 9Àå, 10Àå, 11Àå, 12Àå, 13Àå, 14Àå, 15Àå, 16Àå, 17Àå, 18Àå, 19Àå, 20Àå, 21Àå, 22Àå, 23Àå, 24Àå, 25Àå, 26Àå, 27Àå, ºÎ·ÏA, ºÎ·ÏB,C, ºÎ·ÏD, GNU C ¶óÀ̺귯¸® ¸ñ·Ï ]

À̱ÛÀº ÇÏÀÌÅÚ ¼ÒÇÁÆ®¿þ¾îµ¿È£È¸ÀÇ ¼Ò¸ðÀÓÀÎ Á÷ÀåÀÎÀ» À§ÇÑ ¾¾¸ðÀÓ¿¡¼­ ÀåÀå 2³â°£ÀÇ ´ëÀåÁ¤À¸·Î ¹ø¿ªµÇ¾îÁø ¹®¼­ÀÔ´Ï´Ù. Áö±ÝÀº Á÷¾¾ÀåÀ» Áö³»°í ÀÖ´Â ±è¼Ò¿µ(flpigy)´Ô°ú Á¶¿øºÀ(thirnine)´Ô, °í¼®°©´Ô(sukgab)ÀÇ °øµ¿¹ø¿ªÀÔ´Ï´Ù.

25.»ç¿ëÀÚ¿Í ±×·ì

½Ã½ºÅÛ¿¡¼­ ·Î±×ÀÎÇϰí ÀÖ´Â ¸ðµç »ç¿ëÀÚ´Â »ç¿ëÀÚ ID(user ID)¶ó°í ºÒ¸®´Â ÇÑ °³ÀÇ ´ÜÀÏÇÑ ¼ýÀÚ¿¡ ÀÇÇØ¼­ ±¸ºÐµÈ´Ù. °¢ ÇÁ·Î¼¼½º´Â ±× ÇÁ·Î¼¼½º¸¦ °¡Áø »ç¿ëÀÚÀÇ ¾ï¼¼½º ±ÇÇÑÀ» ¾Ë¸®´Â À¯È¿ »ç¿ëÀÚ ID¸¦ °®´Â´Ù. »ç¿ëÀÚµéÀº ¾ï¼¼½º Á¦¾î¸¦ ¸ñÀûÀ¸·Î ÇÏ¿© ±×·ìÀ¸·Î ºÐ·ùµÈ´Ù. °¢ ÇÁ·Î¼¼½º´Â ±× ÇÁ·Î ¼¼½º°¡ ÆÄÀϵéÀ» ¾ï¼¼½ºÇϱâ À§Çؼ­ »ç¿ëÇÒ ¼ö ÀÖ´Â ¾î¶² ±×·ìµéÀÌ ÀÖ´ÂÁö¸¦ ¾Ë¸®´Â ÇÑ °³ ÀÌ»óÀÇ ±×·ì ID(group ID)°¡ ÀÖ´Ù. ÇÁ·Î¼¼½ºÀÇ À¯È¿ »ç¿ëÀÚ ID ¿Í À¯È¿ ±×·ì IDµéÀº personaÀÇ ÁýÇÕÀûÀÎ Çü ½ÄÀÌ´Ù. À̰ÍÀº ±× ÇÁ·Î¼¼½º°¡ ¾î¶² ÆÄÀÏÀ» ¾ï¼¼½º ÇÒ ¼ö ÀÖ´ÂÁö¸¦ °áÁ¤ÇÑ´Ù. ÀϹÝÀûÀ¸·Î, ÇÁ·Î¼¼ ½º´Â ºÎ¸ð ÇÁ·Î¼¼½º·ÎºÎÅÍ persona¸¦ »ó¼Ó ¹ÞÁö¸¸, Ưº°ÇÑ »óȲÇÏ¿¡¼­´Â ±× persona¸¦ º¯°æÇؼ­ ¾ï ¼¼½º ±ÇÇÑÀ» º¯°æÇÒ ¼ö ÀÖ´Ù.

½Ã½ºÅÛ¿¡ ÀÖ´Â °¢ ÆÄÀÏÀº ¶ÇÇÑ »ç¿ëÀÚ ID ¿Í ±×·ì ID¸¦ °®´Â´Ù. ¾ï¼¼½ºÁ¦¾î(access control)´Â, ½ÇÇà µÇ°í ÀÖ´Â ÇÁ·Î¼¼½ºÀÇ »ç¿ëÀÚ ID ¿Í ±×·ì ID¸¦ ÆÄÀÏÀÇ »ç¿ëÀÚ ID ¿Í ±×·ì ID¸¦ ºñ±³ÇÔÀ¸·Î½á ¼öÇà µÈ´Ù. ±× ½Ã½ºÅÛÀº µî·ÏµÈ »ç¿ëÀÚµéÀ» ¸ðµÎ µ¥ÀÌÅͺ£À̽º¿¡ ÀúÀåÇϰí, ´Ù¸¥ µ¥ÀÌÅͺ£À̽º¿¡ Á¤ÀÇµÈ ¸ðµç ±×·ìµéÀ» ÀúÀåÇÑ´Ù. ±× µ¥ÀÌÅͺ£À̽º¸¦ ½ÃÇèÇϱâ À§ÇØ »ç¿ëÇÒ ¼ö ÀÖ´Â ¶óÀ̺귯¸® ÇÔ¼öµéÀÌ ÀÖ´Ù.

25.1 »ç¿ëÀÚ¿Í ±×·ì IDµé.

ÄÄÇ»ÅÍ ½Ã½ºÅÛ¿¡ µî·ÏµÈ °¢ »ç¿ëÀÚµéÀº »ç¿ëÀÚ À̸§(user name) °ú »ç¿ëÀÚID(user ID) ¿¡ ÀÇÇØ ±¸ ºÐµÈ´Ù. ÀϹÝÀûÀ¸·Î, °¢ »ç¿ëÀÚ À̸§Àº ÇÑ °³ÀÇ ´ÜÀÏÇÑ »ç¿ëÀÚ ID¸¦ °®Áö¸¸, °°Àº »ç¿ëÀÚ ID¿¡ ¿©·¯ °³ÀÇ ·Î±×ÀÎ À̸§µéÀ» °¡Áú ¼ö ÀÖ´Ù. »ç¿ëÀÚ À̸§°ú ±×¿¡ ÇØ´çÇÏ´Â »ç¿ëÀÚ ID´Â 25.12Àý [User Database] 360 ÆäÀÌÁö¿¡ ¼³¸íµÈ, ´ç½ÅÀÌ ¾ï¼¼½º ÇÒ ¼ö ÀÖ´Â µ¥ÀÌÅͺ£À̽º¿¡ ÀúÀåµÇ¾î ÀÖ´Ù.

»ç¿ëÀÚ´Â ±×·ì¾È¿¡ ºÐ·ùµÈ´Ù. °¢»ç¿ëÀÚ À̸§Àº µðÆúÆ®·Î´Â ÇÑ °³ÀÇ ±×·ìÀÌÁö¸¸, ÇÑ °³ ÀÌ»óÀÇ ±×·ì ¿¡ ¼Ò¼ÓµÈ´Ù. °°Àº ±×·ìÀÇ ¸â¹öÀÎ »ç¿ëÀÚµéÀº ±× ±×·ìÀÇ ¸â¹ö°¡ ¾Æ´Ñ »ç¿ëÀÚ°¡ ¾ï¼¼½ºÇÒ ¼ö ¾ø´Â ÀÚ¿øµé(ÆÄÀϰú °°Àº)À» °øÀ¯ÇÑ´Ù. °¢ ±×·ìÀº ÇÑ °³ÀÇ ±×·ì À̸§°ú ±×·ì ID¸¦ °®´Â´Ù. 25.13Àý [Group Database] 362 ÆäÀÌÁö¿¡, ±×·ì ID ¶Ç´Â ±×·ì À̸§¿¡ ´ëÇÑ Á¤º¸¸¦ ¾î¶»°Ô ã´ÂÁö ³ª¿ÍÀÖ´Ù.

25.2 ÇÁ·Î¼¼½ºÀÇ persona

¾î´À ½Ã°£¿¡, °¢ ÇÁ·Î¼¼½º´Â ÇÁ·Î¼¼½ºÀÇ ±ÇÇÑÀ» °áÁ¤ÇÏ´Â ÇÑ °³°¡ ´ÜÀÏÇÑ »ç¿ëÀÚ ID¿Í ÇÑ °³ÀÇ ±× ·ì ID¸¦ °®´Â´Ù. ±×µéÀº ÇÁ·Î¼¼½ºÀÇ ÁýÇÕÀûÀÎ persona¶ó°í ºÒ¸®´Âµ¥, ¿Ö³ÄÇÏ¸é ±×µéÀº ¾ï¼¼½º Á¦¾î ÀÇ ¸ñÀûÀ» À§ÇÏ¿© "±×°ÍÀº ´©±¸ÀÌ´Ù"¸¦ °áÁ¤Çϱ⠶§¹®ÀÌ´Ù. ±× IDµéÀº ÇÁ·Î¼¼½ºÀÇ À¯È¿ »ç¿ëÀÚ ID(effective user ID) ¿Í À¯È¿ ±×·ì ID(effective group ID) ¶ó°í ºÒ¸°´Ù. ´ç½ÅÀÇ ·Î±×ÀÎ ½©Àº ´ç½ÅÀÇ »ç¿ëÀÚ ID ¿Í ´ç½ÅÀÇ µðÆúÆ® ±×·ì ID·Î ±¸¼ºµÇ´Â persona·Î ½ÃÀÛÇÑ´Ù. ÀϹÝÀûÀΠȯ°æ¿¡¼­, ¸ðµç ´ç ½ÅÀÇ ´Ù¸¥ ÇÁ·Î¼¼½ºµéÀº ±×µéÀÇ °ªµéÀ» »ó¼Ó¹Þ´Â´Ù.

ÇÁ·Î¼¼½º´Â ±× ÇÁ·Î¼¼½º¸¦ ¸¸µé¾ú´ø »ç¿ëÀÚ¸¦ È®ÀÎÇÒ ¼ö ÀÖ´Â ½ÇÁ¦»ç¿ëÀÚ ID(real user ID)¿Í »ç ¿ëÀÚÀÇ µðÆúÆ® ±×·ìÀ» È®ÀÎÇÏ´Â ½ÇÁ¦ ±×·ì ID(real group ID)¸¦ °®´Â´Ù. ±×µéÀÇ °ªµéÀº ¾ï¼¼½º Á¦¾î ÀÇ ¿ªÇÒÀ» ÇÏÁö ¾Ê±â ¶§¹®¿¡, ¿ì¸®´Â ±×µéÀ» personaÀÇ ºÎºÐÀ¸·Î °£ÁÖÇÏÁö ¾Ê´Â´Ù. ÇÏÁö¸¸ ±×µéÀº Áß ¿äÇÏ´Ù. ½ÇÁ¦ ¿Í À¯È¿ »ç¿ëÀÚ ID µÑÀº ¸ðµÎ ÇÁ·Î¼¼½ºÀÇ »ýÁ¸±â°£ µ¿¾È¿¡ º¯°æµÉ ¼ö ÀÖ´Ù. 25.3Àý [Why Change Persona] 354 ÆäÀÌÁö ÂüÁ¶. ºÎ°¡ÀûÀ¸·Î, »ç¿ëÀÚ´Â ¿©·¯°³ÀÇ ±×·ì¿¡ Æ÷Ç﵃ ¼ö Àֱ⠶§ ¹®¿¡, persona¿¡´Â ¾ï¼¼½º ±ÇÇÑ¿¡ ±â¿©ÇÏ´Â ºÎ°¡ÀûÀÎ ±×·ì IDµéÀÌ Æ÷ÇԵȴÙ. ¾î¶»°Ô ÇÁ·Î¼¼½ºÀÇ À¯ È¿ »ç¿ëÀÚ ID¿Í ±×·ì IDµéÀÌ ÆÄÀÏÀ» Á¢±ÙÇÏ´Â ±ÇÇÑ¿¡ ¿µÇâÀ» ¹ÌÄ¡´ÂÁö¿¡ ´ëÇÑ »ó¼¼ÇÑ Á¤º¸µéÀº, 9.8.6Àý [Access Permission]137 ÆäÀÌÁö ÂüÁ¶.

ÇÁ·Î¼¼½ºÀÇ »ç¿ëÀÚ ID´Â kill ÇÔ¼ö¸¦ »ç¿ëÇØ¼­ ½Ã±×³¯µéÀ» º¸³¾ ¼ö ÀÖ´Â

±ÇÇÑ ¶ÇÇÑ Á¦¾îÇÑ´Ù. 21.6.2Àý [Signaling Another Process] 295 ÆäÀÌÁö ÂüÁ¶.

25.3 ¿Ö ÇÁ·Î¼¼½ºÀÇ persona¸¦ º¯°æÇϴ°¡?

ÇÁ·Î¼¼½º¸¦ À§ÇÏ¿© »ç¿ëÀÚ ±×¸®°í/¶Ç´Â ±×·ì IDµéÀ» º¯°æÇÒ Çʿ䰡 ÀÖ´Â °¡Àå ¸í¹éÇÑ »óȲÀÌ ÀÖ´Â °÷Àº ·Î±×ÀÎ ÇÁ·Î±×·¥ÀÌ´Ù. ·Î±×ÀÎÀÌ ½ÇÇàÀ» ½ÃÀÛÇÒ ¶§, ±× »ç¿ëÀÚ ID´Â ·çÆ®ÀÌ´Ù. ÀÛ¾÷Àº ·Î±×ÀÎÇÏ °í ÀÖ´Â »ç¿ëÀÚÀÇ »ç¿ëÀÚ ID¿Í ±×·ì IDµéÀ» °¡Áø ½©À» ½ÃÀÛÇÏ´Â °ÍÀÌ´Ù. (À̰ÍÀ» ¿ÏÀüÈ÷ ¼öÇàÇϱâ À§Çؼ­, ·Î±×ÀÎÀº persona »Ó¸¸ ¾Æ´Ï¶ó ½ÇÁ¦ »ç¿ëÀÚ¿Í ±×·ì IDµéÀ» ¼³Á¤Çؾ߸¸ ÇÑ´Ù. ÇÏÁö¸¸ ÀÌ°Í Àº Ưº°ÇÑ °æ¿ìÀÌ´Ù.) persona¸¦ º¯°æÇÏ´Â ´õ ÀϹÝÀûÀÎ °æ¿ì´Â º¸ÅëÀÇ »ç¿ëÀÚ ÇÁ·Î±×·¥¿¡¼­ ½ÇÁ¦·Î ±× ÇÁ·Î±×·¥À» ½ÇÇà½Ã۰í Àִ»ç¿ëÀÚ¿¡°Ô´Â ¾ï¼¼½º°¡ °¡´ÉÇÏÁö ¾Ê´Â ÀÚ¿øÀ» »ç¿ëÀÚ°¡ ¾ï¼¼½ºÇÒ ÇÊ ¿ä°¡ ÀÖÀ» ¶§ ÀÌ´Ù.

¿¹¸¦µé¾î, ´ç½ÅÀÌ ´ç½ÅÀÇ ÇÁ·Î±×·¥¿¡ ÀÇÇØ Á¦¾îµÇÁö¸¸ ´Ù¸¥ »ç¿ëÀÚ¿¡ ÀÇÇØ¼­ Á÷Á¢ÀûÀ¸·Î Àаųª °» ½ÅµÉ ¼ö ¾ø´Â ¾î¶² ÆÄÀÏÀÌ ÀÖ´Ù°í ÇßÀ» ¶§, ´Ù¸¥ »ç¿ëÀÚ¿¡°Ô´Â °³¹æµÇÁö ¾ÊÀº ¾î¶² Á¾·ùÀÇ ÇÁ·ÎÅäÄÝ ÀÇ ±â´ÉÀ» ¿øÇϰųª, ¶Ç´Â ±×°ÍÀÌ °¡Áö°í ÀÖ´Â Á¤º¸ÀÇ ºñ¹ÐÀ̳ª ¿ÏÀüÀ» º¸ÀåÇϱ⠿øÇÒ ¶§, persona¸¦ º¯°æÇÏ´Â °ÍÀÌ ÇÊ¿äÇÏ´Ù. ÀÌ Á¦ÇÑµÈ ¾ï¼¼½ºÀÇ Á¾·ù´Â ¿øÇÏ´Â ÀÚ¿ø°ú¸ÅÄ¡µÇµµ·Ï À¯È¿ »ç¿ëÀÚ¿Í ±×·ì ID¸¦ ÇÁ·Î±×·¥ÀÌ º¯°æÇÔÀ¸·Î½á °¡´ÉÇÏ´Ù.

±×·¯¸é, ÆÄÀϾȿ¡ Á¡¼ö¸¦ ÀúÀåÇÏ´Â °ÔÀÓ ÇÁ·Î±×·¥À» »ó»óÇØº¸ÀÚ. °ÔÀÓÇÁ·Î±×·¥ ÀÚü´Â ´©°¡ ±×°ÍÀ» ½ÇÇà½ÃŰ´ÂÁö¿¡ »ó°ü¾øÀÌ ÀÌ ÆÄÀÏÀ» °»½ÅÇÒ ¼ö ÀÖµµ·Ï ÇÒ Çʿ䰡 ÀÖÁö¸¸, ¸¸ÀÏ »ç¿ëÀÚ°¡ ±× °ÔÀÓÀ» ½ÇÇà½ÃŰÁö ¾Ê°íµµ ±× Á¡¼öÆÄÀÏ¿¡ ±â·ÏÀÌ °¡´ÉÇÏ´Ù¸é, ±×µéÀº ±×µéÀÌ ÁÁ¾ÆÇÏ´Â ¾î´À Á¡¼ö·Î ±× Á¡¼ö ÆÄÀÏ¿¡ ±×µé Á¡¼ö¸¦ ±â·ÏÇÒ ¼ö ÀÖ´Ù. ¾î¶² »ç¶÷Àº À̰ÍÀ» »ó»óÇÒ ¼öµµ ¾ø°Å³ª, ¾Æ´Ï¸é ºñ³­ÇÒ °ÍÀÌ ´Ù. ÀÌ·¯ÇѰÍÀº Á¡¼ö ÆÄÀÏÀ» ¼ÒÀ¯ÇÏ´Â »õ·Î¿î »ç¿ëÀÚ ID¿Í ·Î±×ÀÎ À̸§À» ¸¸µé°í ÀÌ »ç¿ëÀÚ¿¡ ÀÇÇØ ¼­¸¸ ¿ÀÁ÷ ±â·Ï °¡´ÉÇϵµ·Ï ±× ÆÄÀÏÀ» ¸¸µé¸é ¹æÁöÇÒ ¼ö ÀÖ´Ù. ±×·¯¸é, °ÔÀÓ ÇÁ·Î±×·¥ÀÌ ÀÌ ÆÄÀÏÀ» °»½ÅÇϱ⠿øÇÒ ¶§, ±×°ÍÀº ±× °ÔÀÓÀÇ À¯È¿ »ç¿ëÀÚ ID¸¦ º¯°æÇÒ ¼ö ÀÖ´Ù. ½ÇÁ¦·Î, ÇÁ·Î±×·¥Àº Á¡¼öÆÄ ÀÏ¿¡ ±â·ÏÇÒ ¼ö ÀÖ´Â °ÔÀÓÀÇ persona¸¦ ¹Þ¾Æ µé¿©¾ß¸¸ ÇÑ´Ù.

25.4 ¾î¶»°Ô ÀÀ¿ëÇÁ·Î±×·¥ÀÌ persona¸¦ º¯°æÇÒ ¼ö Àִ°¡?

ÇÁ·Î¼¼½ºÀÇ persoan¸¦ º¯°æÇϱâ À§ÇÑ ´É·ÂÀº ¹«½ÉÇÑ ºñ¹ÐÀÇ Ä§ÇØ³ª, ¶Ç´Â °íÀÇÀûÀÎ ³²¿ëÀÇ ¼Ò½º (source)°¡ µÉ ¼ö ÀÖ´Ù. persona¸¦ º¯°æÇÏ´Â, ÇÁ·Î±×·¥¿¡ Æ÷ÇÔµÈ ¹®Á¦´Â Ưº°ÇÑ »óȲµé¿¡ Á¦ÇÑÀÌ ÀÖ ±â ¶§¹®ÀÌ´Ù.

´ç½ÅÀº Á¦¸Ú´ë·Î ´ç½ÅÀÌ ¿øÇÑ´Ù°í ´ç½ÅÀÇ »ç¿ëÀÚ ID ³ª ±×·ì ID¸¦ º¯°æ ÇÒ ¼ö´Â ¾ø´Ù; ¿ÀÁ÷ Ư±ÇÀÌ ºÎ¿©µÈ ÇÁ·Î¼¼½ºµé¸¸ÀÌ ±×°ÍÀ» ÇÒ ¼ö ÀÖ´Ù. ´ë½Å¿¡, ÇÁ·Î±×·¥À» À§ÇÏ¿© persona¸¦ º¯°æÇϱâ À§ÇÑ ÀÏ ¹ÝÀûÀÎ ¹æ¹ýÀº ¹Ì¸® Ưº°ÇÑ »ç¿ëÀÚ³ª ±×·ìÀ¸·Î º¯°æÇÏ¿© ÇÁ·Î±×·¥ÀÌ ½ÃÀ۵Ǵ °ÍÀÌ´Ù. À̰ÍÀº ÆÄÀÏ ÀÇ ¾ï¼¼½º ¸ðµåÀÇ setuid ¿Í setgid ºñÆ®µéÀÇ ÇÔ¼öÀÌ´Ù. 9.8.5Àý [Permission Bits] 136 ÆäÀÌÁö ÂüÁ¶.

¾ï¼¼½º°¡´ÉÇÑ ÆÄÀÏÀÇ setuid ºñÆ®°¡ ¼³Á¤µÉ ¶§, ±× ÆÄÀÏÀº ÀÚµ¿ÀûÀ¸·Î ±× ÆÄÀÏÀ» ¼ÒÀ¯ÇÑ »ç¿ëÀÚ·Î À¯È¿ »ç¿ëÀÚ ID¸¦ º¯°æÇÏ¿© ½ÇÇàµÈ´Ù. ±×¿Í°°ÀÌ, setgid ºñÆ®°¡ ¼³Á¤µÈ ÆÄÀÏÀº ÆÄÀÏÀÇ ±×·ìÀ¸·Î À¯ È¿»ç¿ëÀÚ ID¸¦ º¯°æÇÏ¿© ½ÇÇàµÈ´Ù. 23.5Àý [Executing a File] 327 ÆäÀÌÁö ÂüÁ¶. Ưº°ÇÑ »ç¿ëÀÚ³ª ±× ·ì ID·Î º¯°æÇÏ¿© ¸¸µé¾îÁø ÆÄÀÏÀº »ç¿ëÀÚ³ª ±×·ì ID¿¡°Ô ¿ÏÀüÇÑ ¾ï¼¼½º¸¦ º¸ÀåÇÑ´Ù. ÆÄÀÏ ¸ðµå¿Í ¾ï¼¼½º°¡´É¼º¿¡ ´ëÇÑ ÀϹÝÀûÀÎ ³»¿ëÀº 9.8Àý [File Attributes]131 ÆäÀÌÁö¸¦ ÂüÁ¶Ç϶ó.

ÇÁ·Î¼¼½º´Â À¯È¿ »ç¿ëÀÚ(¶Ç´Â ±×·ì) ID´Â ½ÇÁ¦ ID·Î ¾ðÁ¦µçÁö ´Ù½Ã º¯°æÇÒ ¼ö ÀÖ´Ù. ÇÁ·Î±×·¥À» Á»´õ °ß°íÇÑ ÇÁ·Î±×·¥À¸·Î ¸¸µé±â À§Çؼ­, ±×µéÀÌ ÇÊ¿äÄ¡ ¾ÊÀ» ¶§´Â ±×µé¿¡ ´ëÇÑ Æ¯º°ÇÑ ±ÇÇÑÀ» ¾ø ¾Ö¾ß(turn off) ÇÑ´Ù.

25.5 ÇÁ·Î¼¼½ºÀÇ persona Àбâ.

´ÙÀ½Àº ½ÇÁ¦¿Í À¯È¿ »ç¿ëÀÚ¿Í ±×·ì IDµéÀ» ÀбâÀ§ÇÑ ÇÔ¼öµéÀÇ »ó¼¼ÇÑ ¼³¸íÀÌ´Ù. ±× ±â´ÉµéÀ» »ç¿ë Çϱâ À§Çؼ­´Â ´ç½ÅÀº Çì´õÆÄÀÏ `sys/types.h'¿Í `unistd.h'¸¦ Æ÷ÇÔ½ÃÄѾ߸¸ ÇÑ´Ù.

µ¥ÀÌÅÍŸÀÔ : uid__t

À̰ÍÀº »ç¿ëÀÚ IDµéÀ» ³ªÅ¸³»´Âµ¥ »ç¿ëµÇ´Â Á¤¼ö µ¥ÀÌÅÍ Å¸ÀÔÀÌ´Ù. GNU ¶óÀ̺귯¸®¿¡¼­, À̰ÍÀº unsigned int ¿Í °°´Ù.

µ¥ÀÌÅÍŸÀÔ : gid__t

À̰ÍÀº ±×·ì IDµéÀ» ³ªÅ¸³»±â À§Çؼ­ »ç¿ëµÇ´Â Á¤¼ö µ¥ÀÌÅÍŸÀÔÀÌ´Ù. GNU ¶óÀ̺귯¸®¿¡¼­, À̰ÍÀº unsigned int ¿Í °°´Ù.

ÇÔ¼ö : uid_t getuid (void)

getuid ÇÔ¼ö´Â ÇÁ·Î¼¼½ºÀÇ ½ÇÁ¦ »ç¿ëÀÚ ID¸¦ ¸®ÅÏÇÑ´Ù.

ÇÔ¼ö : gid_t getgid (void)

getgid ÇÔ¼ö´Â ÇÁ·Î¼¼½ºÀÇ ½ÇÁ¦ ±×·ì IDµéÀ»¸®ÅÏÇÑ´Ù.

ÇÔ¼ö : uid_t geteuid (void)

geteuid ÇÔ¼ö´Â ÇÁ·Î¼¼½ºÀÇ À¯È¿ »ç¿ëÀÚ ID¸¦ ¸®ÅÏÇÑ´Ù.

ÇÔ¼ö : gid_t getegid (void)

getegid ÇÔ¼ö´Â ÇÁ·Î¼¼½ºÀÇ À¯È¿ »ç¿ëÀÚ ID ¸¦ ¸®ÅÏÇÑ´Ù.

ÇÔ¼ö : int getgroups (int count, gid_t *groups)

getgroups ÇÔ¼ö´Â ÇÁ·Î¼¼½ºÀÇ ºÎ°¡ÀûÀÎ ±×·ì IDµé¿¡ ´ëÇØ¼­ ¹¯´Âµ¥ »ç¿ëµÈ´Ù. ±×µé ±×·ì IDµéÀÇ °³ ¼ö±îÁöµµ ¹è¿­ groups¿¡ ÀúÀåµÈ´Ù; ÇÔ¼ö·ÎºÎÅÍÀÇ ¸®ÅϰªÀº ½ÇÁ¦·Î ÀúÀåµÈ ±×·ì IDµéÀÇ °³¼öÀÌ´Ù. ¸¸ ÀÏ count°¡ ºÎ°¡ÀûÀÎ ±×·ì IDµéÀÇ Àüü °³¼öº¸´Ù ÀÛ´Ù¸é, getgroups´Â -1ÀÇ °ªÀ» ¸®ÅÏÇϰí errno¸¦ EINVAL·Î ¼³Á¤ÇÑ´Ù. ¸¸ÀÏ count °¡ 0À̸é, getgroups´Â ´ÜÁö ºÎ°¡ÀûÀÎ(supplementary) ±×·ì IDµéÀÇ Àüü °³¼ö¸¦ ¸®ÅÏÇÑ´Ù. ºÎ°¡ÀûÀÎ ±×·ìµéÀ» Áö¿øÇÏÁö ¾Ê´Â ½Ã½ºÅÛ¿¡¼­´Â, À̰ÍÀº Ç×»ó 0ÀÌ µÉ °ÍÀÌ ´Ù. ´ÙÀ½Àº getgroups°¡ ¾î¶»°Ô ¸ðµç ºÎ°¡ÀûÀÎ ±×·ì IDµéÀ» Àо »ç¿ëÇÏ´ÂÁö¿¡ ´ëÇÑ °ÍÀÌ´Ù.

gid_t *

read_all_groups (void)

{

int ngroups = getgroups (NULL, 0);

gid_t *groups

= (gid_t *) xmalloc (ngroups * sizeof (gid_t));

int val = getgroups (ngroups, groups);

if (val < 0)

{

free (groups);

return NULL;

}

return groups;

}

25.6 »ç¿ëÀÚ ID ¼³Á¤Çϱâ.

ÀÌÀýÀº ÇÁ·Î¼¼½ºÀÇ »ç¿ëÀÚ ID(½ÇÁ¦ ±×¸®°í/¶Ç´Â À¯È¿)¸¦ º¯°æÇϱâ À§ÇÑ ÇÔ¼öµéÀ» ¼³¸íÇϰí ÀÖ´Ù. ±× ±â´ÉµéÀ» »ç¿ëÇϱâ À§Çؼ­, ´ç½ÅÀº Çì´õÆÄÀÏ `sys/types.h'¿Í `unistd.h'¸¦ Æ÷ÇÔÇØ¾ß¸¸ ÇÑ´Ù.

ÇÔ¼ö : int setuid (uid_t newuid)

ÀÌ ÇÔ¼ö´Â Àû´çÇÑ Æ¯±ÇÀ» °¡Áö°í Á¦°øµÈ ÇÁ·Î¼¼½º¿¡¼­,±× ÇÁ·Î¼¼½ºÀÇ ½ÇÁ¦ »ç¿ëÀÚ ID ¿Í À¯È¿»ç¿ëÀÚ ID¸¦ newuid·Î ¼³Á¤ÇÑ´Ù. ¸¸ÀÏ ÇÁ·Î¼¼½º°¡ Ư±ÇÀÌ ¾ø´Ù¸é, newuid´Â ½ÇÁ¦ »ç¿ëÀÚ ID¶Ç´Â ÀúÀåµÈ »ç ¿ëÀÚ ID(¸¸ÀÏ ½Ã½ºÅÛÀÌ _POSIX_SAVED_IDS ¸¦ Áö¿øÇÑ´Ù¸é)ÁßÀÇ Çϳª°¡ µÇ¾î¾ß¸¸ ÇÑ´Ù. ÀÌ °æ¿ì, setuid´Â ¿ÀÁ÷ À¯È¿ »ç¿ëÀÚ ID¸¸À» ¼³Á¤ÇÏ°í ½ÇÁ¦ »ç¿ëÀÚ ID´Â ¼³Á¤ÇÏÁö ¾Ê´Â´Ù. setuid ÇÔ¼ö´Â ¼º°ø Çϸé 0ÀÇ °ªÀ» ¸®ÅÏÇÏ°í ¿¡·¯°¡ ¹ß»ýÇϸé -1ÀÇ °ªÀ» ¸®ÅÏÇÑ´Ù. ´ÙÀ½ÀÇ errno´Â ÀÌ ÇÔ¼ö¸¦ À§ÇØ Á¤ ÀÇµÈ ¿¡·¯»óȲÀÌ´Ù.

EINVAL

newuid ÀμöÀÇ °ªÀÌ À¯¿ëÇÏÁö ¾Ê´Ù.

EPERM

±× ÇÁ·Î¼¼½º°¡ Àû´çÇÑ Æ¯±ÇÀ» °¡ÁöÁö ¾Ê´Â´Ù; ´ç½ÅÀº Á¤ÇØÁø ID·Î º¯°æÇϱâ À§ÇÑ ±ÇÇÑÀ» °¡ÁöÁö ¾Ê ¾Ò´Ù.

ÇÔ¼ö : int setreuid (uid_t ruid, uid_t euid)

ÀÌ ÇÔ¼ö´Â ruid·Î ÇÁ·Î¼¼½ºÀÇ ½ÇÁ¦ »ç¿ëÀÚ ID¸¦ ¼³Á¤Çϰí euid·Î À¯È¿ »ç¿ëÀÚ ID¸¦ ¼³Á¤ÇÑ´Ù. ¸¸ÀÏ ruid°¡ -1À̸é, ±×°ÍÀº ½ÇÁ¦ »ç¿ëÀÚ ID¸¦ º¯°æÇÏÁö ¾ÊÀ½À» ÀǹÌÇÑ´Ù; ±×ó·³ ¸¸ÀÏ euid°¡ -1À̸é À¯ È¿»ç¿ëÀÚ ID¸¦ º¯°æÇÏÁö ¾ÊÀ½À» ÀǹÌÇÑ´Ù.

setreuid ÇÔ¼ö´Â ÀúÀåµÈ ID(saved IDs)µéÀ» Áö¿øÇÏÁö ¾Ê´Â 4.3 BSD À¯´Ð½º¿ÍÀÇ È£È¯¼ºÀ» À§Çؼ­ Á¸ ÀçÇÑ´Ù. ´ç½ÅÀº ÇÁ·Î¼¼½ºÀÇ À¯È¿¿Í ½ÇÁ¦ »ç¿ëÀÚ IDµéÀ» ±³È¯Çϱâ À§Çؼ­ ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖ ´Ù. (Ư±ÇÀ» °¡Áø ÇÁ·Î¼¼½º´Â ÀÌ Æ¯º°ÇÑ »ç¿ë¿¡ ´ëÇØ¼­ Á¦ÇÑÀÌ ¾ø´Ù.) ¸¸ÀÏ ÀúÀåµÈ IDµéÀÌ Áö¿øµÈ´Ù ¸é, ´ç½ÅÀº ÀÌ ÇÔ¼ö´ë½Å¿¡ 25.8Àý [Enable/Disable Setuid] 357 ÆäÀÌÁö¿¡ ÀÖ´Â ÇÔ¼öµéÀ» »ç¿ëÇÏ´Â °Í ÀÌ ÁÁ´Ù.

¸®ÅϰªÀº ¼º°øÇϸé 0ÀÌ°í ½ÇÆÐÇϸé -1ÀÌ´Ù. ´ÙÀ½ÀÇ errno´Â ÀÌ ÇÔ¼ö¸¦ À§ÇØ Á¤ÀÇµÈ ¿¡·¯»óȲÀÌ´Ù.

EPERM

±× ÇÁ·Î¼¼½º°¡ Àû´çÇÑ Æ¯±ÇÀ» °¡ÁöÁö ¾Ê¾Ò´Ù;´ç½ÅÀº Á¤ÇØÁø ID·Î º¯°æÇϱâ À§ÇÑ ±ÇÇÑÀÌ ¾ø´Ù.

25.7 ±×·ì IDµéÀ» ¼³Á¤Çϱâ

ÀÌ ÀýÀº ÇÁ·Î¼¼½ºÀÇ ±×·ì IDµé(½ÇÁ¦ ¿Í À¯È¿)À» º¯°æÇϱâ À§ÇÑ ÇÔ¼öµéÀ» ¼³¸íÇϰí ÀÖ´Ù. ÀÌ ±â´É µéÀ» »ç¿ëÇϱâ À§Çؼ­, Çì´õÆÄÀÏ `sys/types.h'¿Í `unistd.h'¸¦ Æ÷ÇÔÇØ¾ß¸¸ ÇÑ´Ù.

ÇÔ¼ö : int setgid (gid_t newgid)

ÀÌ ÇÔ¼ö´Â Àû´çÇÑ Æ¯±ÇÀ» °¡Áö°í Á¦°øµÈ ÇÁ·Î¼¼½ºÀÇ ½ÇÁ¦¿Í À¯È¿ ±×·ì ID¸¦ newgid·Î ¼³Á¤ÇÑ´Ù. ¸¸ÀÏ ±× ÇÁ·Î¼¼½º°¡ Ư±ÇÀÌ ¾ø´Ù¸é, newgid´Â ¹Ýµå½Ã ½ÇÁ¦ ±×·ì ID ¶Ç´Â ÀúÀåµÈ ±×·ì IDÁßÀÇ Çϳª ¿Í µ¿ÀÏÇØ¾ß¸¸ ÇÑ´Ù. ÀÌ °æ¿ì, setgid´Â ¿ÀÁ÷ À¯È¿ ±×·ì ID¸¸ ¼³Á¤ÇÏ°í ½ÇÁ¦ ±×·ì ID´Â ¼³Á¤ÇÏÁö ¾Ê ´Â´Ù. setgid¸¦ À§ÇÑ ¸®Åϰª°ú ¿¡·¯ »óȲµéÀº setuid¿Í °°´Ù.

ÇÔ¼ö : int setregid (gid_t rgid, fid_t egid)

ÀÌ ÇÔ¼ö´Â rgid·Î ÇÁ·Î¼¼½ºÀÇ ½ÇÁ¦ ±×·ì ID ¸¦ ¼³Á¤Çϰí egid·Î À¯È¿ ±×·ì ID¸¦ ¼³Á¤ÇÑ´Ù. ¸¸ÀÏ rgid°¡ -1À̸é, ±×°ÍÀº ½ÇÁ¦ ±×·ì ID¸¦ º¯°æÇÏÁö ¾ÊÀ½À» ÀǹÌÇÑ´Ù; ±×¿Í°°ÀÌ ¸¸ÀÏ egid°¡ -1À̸é, À¯ È¿ ±×·ì ID¸¦ º¯°æÇÏÁö ¾ÊÀ½À» ÀǹÌÇÑ´Ù.

setregid ÇÔ¼ö´Â ÀúÀåµÈ IDµéÀ» Áö¿øÇÏÁö ¾Ê´Â, 4.3 BSD À¯´Ð½º¿ÍÀÇ È£È¯¼ºÀ» À§Çؼ­ Á¦°øµÇ¾ú´Ù. ´ç½ÅÀº ÇÁ·Î¼¼½ºÀÇ À¯È¿¿Í ½ÇÁ¦ ±×·ì IDµéÀ» ±³È¯Çϱâ À§Çؼ­ ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù( Ư±ÇÀ» °¡ Áø ÇÁ·Î¼¼½ºµéÀº ÀÌ »ç¿ë¿¡ ´ëÇØ¼­ Á¦ÇÑÀÌ ¾ø´Ù.). ¸¸ÀÏ ÀúÀåµÈ IDµéÀÌ Áö¿øµÈ´Ù¸é, ÀÌ ÇÔ¼ö¸¦ »ç¿ë ÇÏ´Â ´ë½Å¿¡ 25.8Àý [Enable/Disable Setuid] 357 ÆäÀÌÁö¿¡ ÀÖ´Â ÇÔ¼öµéÀ» »ç¿ëÇ϶ó. setregid ¸¦ À§ÇÑ ¸®Åϰª°ú ¿¡·¯»óȲµéÀº setreuid¿Í °°´Ù.

GNU ½Ã½ºÅÛÀº Ư±ÇÀ» °¡Áø ÇÁ·Î¼¼½º°¡ ±×µéÀÇ ºÎ°¡ÀûÀÎ ±×·ì IDµéÀ» º¯°æÇÏ´Â °ÍÀ» Çã¿ëÇÑ´Ù. setgroups ³ª initgroups¸¦ »ç¿ëÇϱâ À§Çؼ­, ´ç½ÅÀº Çì´õÆÄÀÏ `grp.h'¸¦ Æ÷ÇÔÇØ¾ß¸¸ ÇÑ´Ù.

ÇÔ¼ö : int setgroups (size_t count, gid_t *groups)

ÀÌ ÇÔ¼ö´Â ÇÁ·Î¼¼½ºÀÇ ºÎ°¡ÀûÀÎ ±×·ì IDµéÀ» ¼³Á¤ÇÑ´Ù. ±×°ÍÀº ¿ÀÁ÷ Ư±ÇÀ» °¡Áø ÇÁ·Î¼¼½º·ÎºÎÅÍ È£ ÃâµÉ ¼ö ÀÖ´Ù. count Àμö´Â ¹è¿­ groups¾È¿¡ ÀÖ´Â ±×·ì IDµéÀÇ °³¼ö¸¦ ÁöÁ¤ÇÑ´Ù. ÀÌ ÇÔ¼ö´Â ¼º°øÇÏ ¸é 0À» ¸®ÅÏÇÏ°í ¿¡·¯°¡ ¹ß»ýÇϸé -1À» ¸®ÅÏÇÑ´Ù. ´ÙÀ½ÀÇ errno ´Â ÀÌ ÇÔ¼ö¸¦ À§ÇØ Á¤ÀÇµÈ ¿¡·¯»óȲ ÀÌ´Ù.

EPERM

È£ÃâÇÑ ÇÁ·Î¼¼½º°¡ Ư±ÇÀÌ ¾ø´Ù.

ÇÔ¼ö : int initgroups (const char *user, gid_t gid)

initgroups ÇÔ¼ö´Â »ç¿ëÀÚ À̸§ user¸¦ À§Çؼ­, µðÆúÆ®°¡ µÇµµ·Ï ÇÁ·Î¼¼½ºÀÇ ºÎ°¡ÀûÀÎ ±×·ì IDµéÀ» ¼³Á¤Çϱâ À§Çؼ­ setgroups¸¦ È£ÃâÇÑ´Ù. ±×·ì ID gid ¶ÇÇÑ Æ÷ÇԵȴÙ.

25.8 Setuid ¾ï¼¼½º¸¦ °¡´ÉÇÏ°Ô Çϰųª ºÒ°¡´ÉÇÏ°Ô Çϱâ.

ÀüÇüÀûÀÎ setuid¸¦ »ç¿ëÇÏ´Â ÇÁ·Î±×·¥¿¡¼­ Ç×»ó Æ¯º°ÇÑ ¾ï¼¼½º°¡ ÇÊ¿äÇÑ °ÍÀº ¾Æ´Ï´Ù. ±×·¡¼­ ÇÊ¿ä ÇÏÁö ¾ÊÀ» ¶§ ÀÌ ¾ï¼¼½º¸¦ ²¨¹ö¸®¸é, ¹«ÀǽÄÀûÀÎ ¾ï¼¼½º¿¡ ´ëÇÑ ºô¹Ì¸¦ Á¦°øÇÏÁö ¾Ê°Ô µÈ´Ù. ¸¸ÀÏ ½Ã ½ºÅÛÀÌ ÀúÀåµÈ »ç¿ëÀÚ ID ±â´ÉÀ» Áö¿øÇÏÁö ¾Ê´Â´Ù¸é, ´ç½ÅÀº setuid·Î À̰ÍÀ» ¼öÇàÇÒ ¼ö ÀÖ´Ù. °ÔÀÓ ÇÁ·Î±×·¥ÀÌ ½ÃÀÛÇÒ ¶§, ±×°ÍÀÇ ½ÇÁ¦ »ç¿ëÀÚ ID´Â jdoeÀ̰í, À¯È¿ »ç¿ëÀÚ ID´Â gamesÀ̰í, ±×°ÍÀÇ Àú ÀåµÈ »ç¿ëÀÚ ID ¶ÇÇÑ gamesÀÌ´Ù. ±× ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°ÀÌ, ½ÃÀÛÇÒ ¶§ ÀÏ´Ü »ç¿ëÀÚ ID°ªµéÀ» ±â ·ÏÇÏ°Ô µÈ´Ù.

user_user_id = getuid ();

game_user_id = geteuid ();

±×·¯¸é setuid (user_user_id); ·Î °ÔÀÓ ÆÄÀÏ ¾ï¼¼½º¸¦ ²ø ¼ö ÀÖ°í setuid (game_user_id); ·Î ´Ù½Ã ÄÓ ¼ö ÀÖ´Ù. ÀÌ ÇÁ·Î¼¼½º¸¦ ÅëÇØ¼­, ½ÇÁ¦ »ç¿ëÀÚ ID¸¦ jdoe·Î ³²°í ÀúÀåµÈ »ç¿ëÀÚ ID´Â games·Î Àú ÀåµÇ±â ¶§¹®¿¡, ÇÁ·Î±×·¥Àº Ç×»ó ´Ù¸¥ °ÍÀ¸·Î À¯È¿ »ç¿ëÀÚ ID¸¦ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù.

ÀúÀåµÈ »ç¿ëÀÚ ID ±â´ÉÀ» Áö¿øÇÏÁö ¾Ê´Â ´Ù¸¥ ½Ã½ºÅÛ¿¡¼­, ´ç½ÅÀº ÇÁ·Î¼¼½ºÀÇ ½ÇÁ¦ »ç¿ëÀÚ ID ¿Í À¯ È¿ »ç¿ëÀÚ ID¸¦ ±³È¯Çϱâ À§Çؼ­´Â setreuid¸¦ »ç¿ëÇØ¼­ setuid ¾ï¼¼½º¸¦ ÄÑ°í ²ø ¼ö ÀÖ´Ù. ´ÙÀ½Ã³ ·³;

setreuid (geteuid (), getuid ());

À̰ÍÀº ½ÇÆÐÇÏÁö ¾Ê°í_Ç×»ó Çã¿ëµÇ´Â Ưº°ÇÑ °æ¿ìÀÌ´Ù.

¿Ö À̰ÍÀº setuid ¾ï¼¼½º¸¦ Åä±Û¸µÇÏ´Â È¿°ú¸¦ °®´Â°¡? °ÔÀÓ ÇÁ·Î±×·¥ÀÌ ´ÜÁö ½ÃÀ۵Ǿî ÀÖ´Ù°í °¡ Á¤Çϰí, À¯È¿ »ç¿ëÀÚ ID°¡ games Àϵ¿¾È ½ÇÁ¦ »ç¿ëÀÚ ID´Â jdoe¶ó°í °¡Á¤ÇÏÀÚ. ÀÌ °æ¿ì, °ÔÀÓÀº Á¡ ¼ö ÆÄÀÏÀ» ±â·ÏÇÒ ¼ö ÀÖ´Ù. ¸¸ÀÏ µÎ °³ÀÇ À¯È¿ »ç¿ëÀÚ ID ¿Í ½ÇÁ¦ »ç¿ëÀÚ ID¸¦ ±³È¯ÇÑ´Ù¸é, ½ÇÁ¦ »ç¿ëÀÚ ID´Â games°¡ µÇ°í À¯È¿ »ç¿ëÀÚ ID´Â jdoe°¡ µÈ´Ù; ÀÌÁ¦ ÇÁ·Î±×·¥Àº ¿ÀÁ÷ jdoe¸¸ ¾ï¼¼½º¸¦ °®´Â´Ù. ´Ù¸¥ ±³È¯Àº À¯È¿ »ç¿ëÀÚ ID¸¦ ´Ù½Ã games·Î µÇµ¹¸®°í Á¡¼ö ÆÄÀÏ¿¡ ¾ï¼¼½º¸¦ ÀúÀåÇÑ´Ù.

½Ã½ºÅÛÀÇ µÎ Á¾·ù¸¦ ´Ù·ç±â À§Çؼ­´Â, ´ÙÀ½Ã³·³ ÇÁ¸®ÇÁ·Î¼¼½º¸¦ »ç¿ëÇØ¼­ ÀúÀåµÈ »ç¿ëÀÚ ID ±â´ÉÀ» Áö¿øÇÏ´ÂÁö Å×½ºÆ®Çغ¸¾Æ¾ßÇÑ´Ù.

#ifdef _POSIX_SAVED_IDS

setuid (user_user_id);

#else

setreuid (geteuid (), getuid ());

#endif

25.9 setuid ÇÁ·Î±×·¥ ¿¹Á¦.

´ÙÀ½Àº À¯È¿ »ç¿ëÀÚ ID¸¦ º¯°æÇÏ´Â ÇÁ·Î±×·¥À» ¾î¶»°Ô ÁغñÇÏ´ÂÁö º¸¿©ÁÖ´Â ¿¹Á¦ÀÌ´Ù. À̰ÍÀº caber-toss¶ó°í ºÒ¸®´Â °ÔÀÓ ÇÁ·Î±×·¥ÀÇ ÀϺκÐÀ¸·Î½á ±× °ÔÀÓ ÇÁ·Î±×·¥Àº ¿ÀÁ÷ °ÔÀÓ ÇÁ·Î±×·¥ ±× ÀÚü¿¡ ÀÇÇØ¼­¸¸ Á¡¼ö ÆÄÀÏÀ» ´Ù·ê¼ö ÀÖµµ·Ï µÇ¾îÀÖ´Ù. ±× °ÔÀÓ ÇÁ·Î±×·¥Àº ½ÇÇàÆÄÀÏÀÌ set-user-ID ºñÆ®·Î ÀνºÅçµÉ°ÍÀÌ°í ½ÇÇàÆÄÀÏÀÌ Á¡¼öÆÄÀϰú °°Àº »ç¿ëÀÚ¿¡ ÀÇÇØ ¼ÒÀ¯µÈ´Ù°í °¡Á¤ÇÑ´Ù. ÀüÇüÀûÀ¸ ·Î, ½Ã½ºÅÛ °ü¸®ÀÚ´Â ÀÌ ¸ñÀûÀ» À§Çؼ­ °ÔÀÓ°ú °°Àº °èÁ¤À» ÁغñÇÒ °ÍÀÌ´Ù.

½ÇÇà°¡´ÉÆÄÀÏÀº ¸ðµå 4755°¡ ÁÖ¾îÁö°í, ±×·¡¼­ `ls -l'À» ÇÏ¸é ´ÙÀ½°ú °°Àº Ãâ·ÂÀ» ¾ò°ÔµÈ´Ù.

-rwsr-xr-x 1 games 184422 Jul 30 15:17 caber-toss

set-user-ID ºñÆ®´Â ÆÄÀÏ ¸ðµå¿¡¼­ `s'·Î ³ªÅ¸³­´Ù. Á¡¼ö ÆÄÀÏÀ» ¸ðµå 644·Î ÁÖ¾îÁö°í, `ls -l'ÇÏ¸é ´ÙÀ½°ú °°Àº °á°ú¸¦ ¾ò´Â´Ù.

´ÙÀ½Àº ¾î¶»°Ô º¯°æµÈ »ç¿ëÀÚ ID¸¦ ÁغñÇÒ°ÍÀÎÁö¸¦ º¸¿©ÁÖ´Â ÇÁ·Î±×·¥ÀÇ ÀϺκÐÀÌ´Ù. ÀÌ ÇÁ·Î±×·¥ Àº ¸¸ÀÏ ½Ã½ºÅÛÀÌ ÀúÀåµÈ ID ±â´ÉÀ» Áö¿øÇÑ´Ù¸é ±×°ÍÀ» »ç¿ëÇϰí, ±×·¸Áö¾Ê´Ù¸é setreuid¸¦ »ç¿ëÇØ¼­ À¯È¿ »ç¿ëÀÚ ID¿Í ½ÇÁ¦ »ç¿ëÀÚ ID¸¦ ±³È¯ÇÑ´Ù.

#include <stdio.h>

#include <sys/types.h>

#include <unistd.h>

#include <stdlib.h>

/* À¯È¿¿Í ½ÇÁ¦ »ç¿ëÀÚ IDµéÀ» ÀúÀåÇ϶ó. */

static uid_t euid, ruid;

/* ¿ø·¡ÀÇ °ªÀ¸·Î À¯È¿ »ç¿ëÀÚ ID¸¦ ¹ÝȯÇ϶ó. */

void

do_setuid (void)

{

int status;

#ifdef _POSIX_SAVED_IDS

status = setuid (euid);

#else

status = setreuid (ruid, euid);

#endif

if (status < 0) {

fprintf (stderr, "Couldn't set uid.\n");

exit (status);

}

}

/* ½ÇÁ¦ »ç¿ëÀÚ ID·Î À¯È¿ »ç¿ëÀÚ ID¸¦ ¼³Á¤Ç϶ó. */

void

undo_setuid (void)

{

int status;

#ifdef _POSIX_SAVED_IDS

status = setuid (ruid);

#else

status = setreuid (euid, ruid);

#endif

if (status < 0) {

fprintf (stderr, "Couldn't set uid.\n");

exit (status);

}

}

/* ¸ÞÀÎ ÇÁ·Î±×·¥ */

int

main (void)

{

/* ½ÇÁ¦¿Í À¯È¿ »ç¿ëÀÚ IDµéÀ» ÀúÀåÇ϶ó. */

ruid = getuid ();

euid = geteuid ();

undo_setuid ();

/* °ÔÀÓÀ» Çϰí Á¡¼ö¸¦ ±â·ÏÇ϶ó. */

. . .

}

¸ÞÀÎ ÇÔ¼ö¿¡¼­ ù°·Î ¾î¶»°Ô ½ÇÁ¦ »ç¿ëÀÚ ID·Î À¯È¿ »ç¿ëÀÚ ID¸¦ µÇµ¹·Á ¼³Á¤ÇÏ´ÂÁö¿¡ ´ëÇØ¼­ ÁÖ ¸ñÇ϶ó. À̰ÍÀº »ç¿ëÀÚ°¡ °ÔÀÓÀ» ½ÇÇàÇϰí ÀÖÀ» µ¿¾È ¼öÇàµÇ´Â ÆÄÀÏ ¾ï¼¼½ºµé·Î½á ±ÇÇÑÀ» °áÁ¤Çϱâ À§Çؼ­ ½ÇÁ¦ »ç¿ëÀÚ ID¸¦ »ç¿ëÇÑ´Ù. ¿ÀÁ÷ ÇÁ·Î±×·¥ÀÌ Á¡¼ö ÆÄÀÏÀ» °³¹æÇÒ Çʿ丸 ÀÖÀ» ¶§ ´ÙÀ½Ã³ ·³, ¿ø·¡ÀÇ À¯È¿ »ç¿ëÀÚ ID·Î µÇ¹Ù²Û´Ù.

/* Á¡¼ö¸¦ ±â·ÏÇ϶ó. */

int

record_score (int score)

{

FILE *stream;

char *myname;

/* Á¡¼öÆÄÀÏÀ» °³¹æÇ϶ó. */

do_setuid ();

stream = fopen (SCORES_FILE, "a");

undo_setuid ();

/* ÆÄÀÏ¿¡ ±× Á¡¼ö¸¦ ±â·ÏÇ϶ó. */

if (stream)

{

myname = cuserid (NULL);

if (score < 0)

fprintf(stream, "%10s: Couldn't lift the caber.\n", myname);

else

fprintf (stream, "%10s: %d feet.\n", myname, score);

fclose (stream);

return 0;

}

else

return -1;

}

25.10 setuid ÇÁ·Î±×·¥À» ¸¸µé±â À§ÇÑ ÆÁ.

setuid ÇÁ·Î±×·¥Àº ¿ø·¡ ÀǵµÇÏÁö ¾Ê¾Ò´ø »ç¿ëÀÚ ¾ï¼¼½º¸¦ ºÎ¿©ÇÏ´Â ¿À·ù¸¦ ¹üÇϱ⠽±´Ù_½ÇÁ¦·Î, ¸¸ ÀÏ ´ç½ÅÀÌ ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇÇÇϱ⸦ ¿øÇÑ´Ù¸é, °¢º°ÇÑ ÁÖÀǸ¦ ÇØ¾ß¸¸ ÇÑ´Ù. ´ÙÀ½Àº ÀǵµµÇÁö ¾ÊÀº ¾ï ¼¼½º¸¦ ¸·°í, ¸¸ÀÏ ±×°ÍÀÏ ¹ß»ýÇßÀ» ¶§ ±× ¿µÇâ·ÂÀ» ÃÖ¼ÒÈ­ÇϱâÀ§ÇÑ ¾È³»ÁöħÀÌ´Ù.

둁 Àý´ëÀûÀÎ Çʿ䰡 ¾ø´ÂÇÑ root ¿Í °°Àº Ư±ÇÀ» °¡Áø »ç¿ëÀÚ IDµéÀº setuid ÇÁ·Î±×·¥À» °¡Á®¼­´Â ¾È µÈ´Ù. ¸¸ÀÏ ÀÚ¿ø(resource)ÀÌ ´ç½ÅÀÇ Æ¯Á¤ÇÑ ÇÁ·Î±×·¥¿¡°Ô ƯÁ¤ÇÑ °ÍÀ̶ó¸é, Ư±ÇÀ» °¡ÁöÁö ¾ÊÀº »ç ¿ëÀÚ ID ¶Ç´Â ±×·ì ID°¡ ´ÜÁö ±× ÀÚ¿øÀ» ´Ù·ç±â¸¸ Çϵµ·Ï, »õ·Ó°Ô Á¤ÀÇÇÏ´Â °ÍÀÌ ÁÁ´Ù.

둁 À¯È¿ »ç¿ëÀÚ ID¸¦ º¯°æÇϴ°Ͱú ÇÔ²² system ÇÔ¼ö¿Í exec ÇÔ¼ö¸¦ »ç¿ëÇϴ°Ϳ¡ ´ëÇØ¼­´Â ÁÖÀǸ¦ ÇØ¾ß¸¸ ÇÑ´Ù. ´ç½Å ÇÁ·Î±×·¥ÀÇ »ç¿ëÀÚ°¡ º¯°æµÈ »ç¿ëÀÚ ID¸¦ »ç¿ëÇÏ¿© ÇÁ·Î±×·¥À» ½ÇÇà½ÃŰ´Â °ÍÀ» Çã°¡ÇÏÁö ¸»¾Æ¶ó. execlp ¿Í execvp ÇÔ¼öµéµµ À§ÇèÀ» ³»Æ÷Çϰí ÀÖ´Ù (±×µéÀº »ç¿ëÀÚÀÇ PATH ȯ°æº¯ ¼ö¿¡ ÀÇÁ¸ÇÏ¿© ½ÇÇàµÇ±â ¶§¹®ÀÌ´Ù.) ¸¸ÀÏ º¯°æµÈ ID·Î ´Ù¸¥ ÇÁ·Î±×·¥À» ½ÇÇàÇØ¾ß¸¸ ÇÑ´Ù¸é, ½ÇÇà°¡´É ÆÄÀÏÀ» Àý´ë ÆÄÀÏ À̸§( 6.2.2Àý [File Name Resolution] 59 ÆäÀÌÁö ÂüÁ¶.) À¸·Î ÁöÁ¤Çϰí, ½ÇÇà°¡´É ÆÄ Àϰú ¿ø·¡ÀÇ users ¿Í °°Àº ¸ðµç Æ÷ÇÔµÈ µð·ºÅ丮µéÀÌ ´Ù¸¥ ÇÁ·Î±×·¥°ú ÇÔ²² ±×°ÍÀÇ À§Ä¡¸¦ º¯°æÇÏ Áö ¸øÇϵµ·Ï º¸È£¸¦ ÇØ¾ß¸¸ ÇÑ´Ù.

둁 ½ÇÁ¦·Î ÀÚ¿øÀ» »ç¿ëÇÏ´Â ÇÁ·Î±×·¥ÀÇ ÀϺκп¡¼­ ÀÚ¿øÀ» Á¦¾îÇϰí ÀÖ´Â »ç¿ëÀÚ ID¸¸À» »ç¿ëÇ϶ó. ´ç½ÅÀÌ ±× ÀÛ¾÷À» ¸¶ÃÆÀ» ¶§, ½ÇÁ¦ »ç¿ëÀÚÀÇ »ç¿ëÀÚ ID·Î À¯È¿ »ç¿ëÀÚ ID¸¦ ¹ÝȯÇ϶ó. 25.8Àý [Enable/Disable Setuid] 357 ÆäÀÌÁö ÂüÁ¶.

둁 ¸¸ÀÏ ´ç½ÅÀÇ ÇÁ·Î±×·¥¿¡¼­ setuid ºÎºÐÀÌ Á¦¾îÇÒ ¼ö ÀÖ´Â ÀÚ¿øÀ̿ܿ¡ ´Ù¸¥ ÆÄÀÏÀ» ¾ï¼¼½ºÇÒ ÇÊ¿ä °¡ ÀÖ´Ù¸é, ±×¿Í °°Àº ÆÄÀÏÀ» ¾ï¼¼½ºÇÒ ¼ö ÀÖ´Â ±ÇÇÑÀ» °¡Áø ½ÇÁ¦ »ç¿ëÀÚ¸¦ Á¶È¸Çؾ߸¸ ÇÑ´Ù. ´ç½ÅÀº ±×¿Í °°Àº ÀÏÀ» À§Çؼ­ access ÇÔ¼ö ( 9.8.6Àý [Access Permission] 137 ÆäÀÌÁö ÂüÁ¶.)¸¦ »ç¿ëÇÒ ¼ö ÀÖ ´Ù; ±×°ÍÀº À¯È¿ IDµéº¸´Ù´Â ½ÇÁ¦ »ç¿ëÀÚ¿Í ±×·ì IDµéÀ» »ç¿ëÇÑ´Ù.

25.11 ´©°¡ ·Î±×ÀÎ Çß´ÂÁö È®ÀÎÇϱâ.

ÀÌÀý¿¡ ¼³¸íµÈ ÇÔ¼öµéÀ» »ç¿ëÇØ¼­ ÇÁ·Î¼¼½º¸¦ ½ÇÇà½Ã۰í ÀÖ´Â »ç¿ëÀÚÀÇ À̸§°ú ÇöÀç ¼¼¼Ç¿¡ ·Î±× ÀÎµÈ »ç¿ëÀÚÀÇ À̸§À» ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù. getuid¿Í friends ÇÔ¼ö( 25.5Àý [Reading Persona] 354 ÆäÀÌ Áö ÂüÁ¶.)¸¦ ¶ÇÇÑ ÂüÁ¶Ç϶ó. getlogin ÇÔ¼ö´Â `unistd.h'¿¡ ¼±¾ðµÇ¾î ÀÖ°í cuserid ¿Í L_cuserid´Â `stdio.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.

ÇÔ¼ö : char *getlogin (void)

getlogin ÇÔ¼ö´Â ÇÁ·Î¼¼½º°¡ Á¦¾îÇϰí ÀÖ´Â Å͹̳¯¿¡ ·Î±×ÀεǾî ÀÖ´Â »ç¿ëÀÚÀÇ À̸§ÀÌ Æ÷ÇÔµÈ ¹®ÀÚ ¿­À» °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ ¸®ÅÏ Çϰųª, ¸¸ÀÏ ±× Á¤º¸¸¦ °áÁ¤ÇÒ ¼ö ¾ø´Ù¸é ³Î Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. ¹®ÀÚ ¿­Àº Á¤ÀûÀ¸·Î ÇÒ´çµÇ°í ÀÌ ÇÔ¼ö³ª cuserid ÇÔ¼öÀÇ ¿¬¼ÓÀûÀΠȣÃâ¿¡ ÀÇÇØ¼­ µ¡¾º¿öÁø´Ù.

ÇÔ¼ö : char * cuserid (char *string)

cuserid ÇÔ¼ö´Â ÇÁ·Î¼¼½ºÀÇ À¯È¿ ID¿Í ¿¬°üµÈ »ç¿ëÀÚ À̸§ÀÌ Æ÷ÇÔµÈ stringÀ» °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ ¸® ÅÏÇÑ´Ù. ¸¸ÀÏ stringÀÌ ³Î Æ÷ÀÎÅͰ¡ ¾Æ´Ï¶ó¸é, ±× stringÀº Àû¾îµµ L_cuserid°³ÀÇ ¹®ÀÚ¸¦ ÀúÀåÇÒ ¼ö ÀÖ´Â ¹è¿­ÀÌ µÈ´Ù; »ç¿ëÀÚÀÇ À̸§ÀÌ Æ÷ÇÔµÈ ¹®ÀÚ¿­À» ÀÌ string¿¡ ¸®ÅϵȴÙ. ±×·¸Áö¾Ê´Ù¸é, Á¤ÀûÀÎ Áö¿ª¿¡ ÀÖ´Â ¹®ÀÚ¿­À» °¡¸®Å°´Â Æ÷ÀÎÅͰ¡ ¸®ÅϵȴÙ. ÀÌ string´Â Á¤ÀûÀ¸·Î ÇÒ´çµÇ°í ÀÌ ÇÔ¼ö³ª getlogin ÇÔ¼öÀÇ ¿¬¼ÓÀûÀΠȣÃâ¿¡ ÀÇÇØ¼­ µ¡¾º¿öÁú °ÍÀÌ´Ù.

¸ÅÅ©·Î : int L__cuserid

»ç¿ëÀÚÀÇ À̸§À» ÀúÀåÇϱ⿡ ÇÊ¿äÇÑ ¹è¿­ÀÌ ¾ó¸¶³ª ±æ¾î¾ß ÇÏ´ÂÁö¸¦ ÁöÀûÇÏ´Â Á¤¼ö »ó¼öÀÌ´Ù.

±× ÇÔ¼öµéÀº ÀÌ ¼¼¼Ç¿¡ ·Î±×ÀÎµÈ »ç¿ëÀÚ³ª ÇÁ·Î¼¼½º¸¦ ½ÇÇà½Ã۰í ÀÖ´Â »ç¿ëÀÚ¸¦ ¸íÈ®ÇÏ°Ô È®ÀÎÇÏ µµ·Ï Çã¿ëÇÑ´Ù. (±×µéÀº setuid ÇÁ·Î±×·¥ÀÌ Æ÷ÇÔ µÇ¾úÀ»¶§´Â ´Ù¸¦ ¼ö ÀÖ´Ù; 25.2Àý [Process Persona] 353 ÆäÀÌÁö ÂüÁ¶.) »ç¿ëÀÚ´Â ±× ÇÔ¼öµéÀ» ¼ÓÀϼö ÀÖ´Â ¹æ¹ýÀÌ ¾Æ¹«°Íµµ ¾ø´Ù.

´ëºÎºÐÀÇ °æ¿ì¿¡, »ç¿ëÀÚ¸¦ ã¾Æ³»´Â ȯ°æº¯¼ö LOGNAME¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ´õ¿í À¯¿ëÇÏ´Ù. ÀÌ°Í Àº »ç¿ëÀÚ°¡ Á¦¸Ú´ë·Î LOGNAME À» ¼³Á¤ÇÒ ¼ö Àֱ⠶§¹®¿¡ Á¤¹ÐÇÔ¿¡ À־´Â Á»´õ À¯¿¬¼ºÀÌ ÀÖ ´Ù. 22.2.2Àý [Standard Environment] 318 ÆäÀÌÁö ÂüÁ¶.

25.12 »ç¿ëÀÚ µ¥ÀÌŸº£À̽º

ÀÌ ÀýÀº µî·ÏµÈ »ç¿ëÀÚÀÇ µ¥ÀÌÅͺ£À̽º¸¦ °Ë»öÇϰí ã±âÀ§ÇÑ ¸ðµç °Í¿¡ ´ëÇØ¼­ ¼³¸íÇÑ´Ù. µ¥ÀÌÅÍ º£À̽º ÀÚü´Â °ÅÀÇ ´ëºÎºÐÀÇ ½Ã½ºÅÛ¿¡¼­ `/etc/passwd'¿¡ º¸Á¸µÇ¾î ÀÖÁö¸¸, ¾î¶² ½Ã½ºÅÛ¿¡¼­´Â Ư º°ÇÑ ³×Æ®¿÷ ¼­¹ö¿¡°Ô ±×°ÍÀ» ¾ï¼¼½ºÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù.

25.12.1 »ç¿ëÀÚÀÇ Á¤º¸¸¦ ´ã°í ÀÖ´Â µ¥ÀÌŸ±¸Á¶Ã¼.

½Ã½ºÅÛ »ç¿ëÀÚ µ¥ÀÌÅͺ£À̽º¸¦ ¾ï¼¼½ºÇϱâÀ§ÇÑ ÇÔ¼ö¿Í µ¥ÀÌÅͱ¸Á¶Ã¼µéÀº Çì´õÆÄÀÏ `pwd.h'¿¡ ¼±¾ð µÇ¾î ÀÖ´Ù.

µ¥ÀÌÅÍŸÀÔ : struct passwd

passwd µ¥ÀÌÅͱ¸Á¶Ã¼´Â ½Ã½ºÅÛ »ç¿ëÀÚ µ¥ÀÌÅͺ£À̽º ¾È¿¡ ¿£Æ®¸®µé

¿¡ ´ëÇÑ Á¤º¸¸¦ ÀúÀåÇϴµ¥ »ç¿ëµÈ´Ù. ±×°ÍÀº Àû¾îµµ ´ÙÀ½°ú °°Àº

¸â¹öµéÀ» °®°í ÀÖ´Ù.

char *pw_name

»ç¿ëÀÚ ·Î±×ÀÎ À̸§.

char *pw_passwd.

¾ÏȣȭµÈ ºñ¹Ð¹øÈ£(password) ¹®ÀÚ¿­.

uid_t pw_uid

»ç¿ëÀÚ ID ¹øÈ£.

gid_t pw_gid

»ç¿ëÀÚÀÇ µðÆúÆ® ±×·ì ID ¹øÈ£.

char *pw_gecos

ÀÌ ¹®ÀÚ¿­Àº ÀüÇüÀûÀ¸·Î »ç¿ëÀÚÀÇ ½ÇÁ¦ À̸§À» Æ÷ÇÔÇϰí, °¡´ÉÇϸé ÀüÈ­¹øÈ£¿Í °°Àº ´Ù¸¥ Á¤º¸µµ Æ÷ ÇԵȴÙ.

char *pw_dir

»ç¿ëÀÚÀÇ È¨ µð·ºÅ丮(home directory), ¶Ç´Â Ãʱâ ÀÛ¾÷ µð·ºÅ丮. À̰Ϳ¡ ´ëÇÑ ÇØ¼®ÀÌ ½Ã½ºÅÛ-ÀÇÁ¸ ÀûÀÎ °æ¿ì¿¡´Â ³Î Æ÷ÀÎÅͰ¡ µÇ¾î¾ßÇÑ´Ù.

char *pw_shell

»ç¿ëÀÚÀÇ µðÆúÆ® ½©, À̳ª »ç¿ëÀÚ°¡ ·Î±×ÀÎÇÒ ¶§ ½ÇÇàµÇ´Â Ãʱâ ÇÁ·Î±×·¥. ½Ã½ºÅÛ¿¡¼­ µðÆúÆ®·Î Áö Á¤µÈ °ÍÀÌ »ç¿ëµÇ´Â °æ¿ì¿¡´Â, ³Î Æ÷ÀÎÅͰ¡ µÇ¾î¾ßÇÑ´Ù.

25.12.2 ÇѸíÀÇ »ç¿ëÀÚ¿¡´ëÇØ ÀÚ¼¼È÷ ¾Ë¾Æº¸±â.

ƯÁ¤ÇÑ »ç¿ëÀÚ¿¡ ´ëÇÑ Á¤º¸¸¦ ¾Ë¾Æ³»±â À§Çؼ­´Â, getpwuid ¶Ç´Â getpwnamÀ» »ç¿ëÇØ¼­ ½Ã½ºÅÛ »ç ¿ëÀÚ µ¥ÀÌÅͺ£À̽º¸¦ °Ë»öÇÒ ¼ö ÀÖ´Ù. ±× ÇÔ¼öµéÀº Çì´õÆÄÀÏ `pwd.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.

ÇÔ¼ö : struct passwd * getpwuid (uid_t uid)

ÀÌ ÇÔ¼ö´Â »ç¿ëÀÚ ID°¡ uidÀÎ »ç¿ëÀÚ¿¡ ´ëÇÑ Á¤º¸¸¦ ´ã°í ÀÖ´Â Á¤ÀûÀ¸·Î ÇÒ´çµÈ ±¸Á¶Ã¼¸¦ °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. ÀÌ ±¸Á¶Ã¼´Â getpwuidÀÇ ¿¬¼ÓÀûÀΠȣÃâ¿¡ ÀÇÇØ¼­ µ¡¾º¿öÁø´Ù. ³Î Æ÷ÀÎÅͰªÀº µ¥ÀÌÅͺ£À̽º¿¡ »ç¿ëÀÚ ID°¡ uidÀÎ »ç¿ëÀÚ°¡ ¾ø´Ù´Â ¸»ÀÌ´Ù.

ÇÔ¼ö : struct passwd *getpwnam (const char *name)

ÀÌ ÇÔ¼ö´Â »ç¿ëÀÚ À̸§ÀÌ nameÀÎ »ç¿ëÀÚ¿¡ ´ëÇÑ Á¤º¸¸¦ ´ã°í ÀÖ´Â Á¤ÀûÀ¸·Î ÇÒ´çµÈ ±¸Á¶Ã¼¸¦ °¡¸® Ű´Â Æ÷ÀÎÅ͸¦¸®ÅÏÇÑ´Ù. ÀÌ ±¸Á¶Ã¼´Â getpwnamÀÇ ¿¬¼ÓÀûÀΠȣÃâ·Î µ¡¾º¿öÁú °ÍÀÌ´Ù. ³Î Æ÷ÀÎÅͰª Àº »ç¿ëÀÚÀÇ À̸§ÀÌ nameÀÎ »ç¿ëÀÚ°¡ µ¥ÀÌÅͺ£À̽º¿¡ ¾ø´Ù´Â ¸»ÀÌ´Ù.

25.12.3 ¸ðµç »ç¿ëÀÚ ¸®½ºÆ®¸¦ °Ë»öÇϱâ.

ÀÌ ÀýÀº ÇÑ ¹ø¿¡ ÇÑ »ç¿ëÀÚ¾¿, ½Ã½ºÅÛ¿¡ ÀÖ´Â ¸ðµç »ç¿ëÀÚµéÀÇ ¸®½ºÆ®¸¦ ÀÐÀ» ¼ö ÀÖ±â À§Çؼ­´Â ÇÁ ·Î±×·¥¿¡¼­ ¾î¶»°Ô ÇØ¾ßÇÏ´ÂÁö¸¦ ¼³¸íÇÑ´Ù. À̰÷¿¡ ¼³¸íµÈ ÇÔ¼ö´Â Çì´õÆÄÀÏ `pwd.h'¿¡ ¼±¾ðµÇ¾î ÀÖ ´Ù. ´ç½ÅÀº ƯÁ¤ÇÑ ÆÄÀϷκÎÅÍ »ç¿ëÀÚ ¿£Æ®¸®µéÀ» ÀбâÀ§Çؼ­ fgetpwent ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

ÇÔ¼ö : struct passwd * fgetpwent (FILE *stream)

ÀÌ ÇÔ¼ö´Â stream À¸·ÎºÎÅÍ ´ÙÀ½ »ç¿ëÀÚ ¿£Æ®¸®¸¦ ÀÐ°í ±× ¿£Æ®¸®¸¦ °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. ±× ±¸Á¶Ã¼´Â Á¤ÀûÀ¸·Î ÇÒ´çµÇ¾ú°í, fgetpwentÀÇ ¿¬¼ÓÀûÀΠȣÃâ·Î µ¡¾º¿öÁø´Ù. ±×·¯¹Ç·Î, ¸¸ÀÏ ´ç½Å ÀÌ ±× Á¤º¸¸¦ ÀúÀåÇÏ±æ ¿øÇÑ´Ù¸é ±¸Á¶Ã¼ÀÇ ³»¿ëÀ» ´Ù¸¥°÷¿¡ º¹»çÇØ ³õ¾Æ¾ß¸¸ ÇÑ´Ù. streamÀº Ç¥ÁØ password µ¥ÀÌÅͺ£À̽º ÆÄÀϰú °°Àº Çü½ÄÀÇ ÆÄÀÏÀ̾î¾ß¸¸ ÇÑ´Ù.ÀÌ ÇÔ¼ö´Â ½Ã½ºÅÛ V ·ÎºÎÅÍ ¿Ô´Ù.

»ç¿ëÀÚ µ¥ÀÌÅͺ£À̽ºÀÇ ¸ðµç ¿£Æ®¸®µéÀ» °Ë»öÇÏ´Â ¹æ¹ý¿¡´Â setpwent, getpwent, ±×¸®°í endpwent °¡ ÀÖ´Ù.

ÇÔ¼ö : void setpwent (void)

ÀÌ ÇÔ¼ö´Â getpwent °¡ »ç¿ëÀÚ µ¥ÀÌÅͺ£À̽º¸¦ Àбâ À§Çؼ­ »ç¿ëÇÏ´Â ½ºÆ®¸²À» ÃʱâÈ­ÇÑ´Ù.

ÇÔ¼ö : struct passwd * getpwent (void)

getpwent ÇÔ¼ö´Â setpwent ¿¡ ÀÇÇØ ÃʱâÈ­µÈ streamÀ¸·ÎºÎÅÍ, ´ÙÀ½ ¿£Æ®¸®¸¦ ÀÐ°í ¿£Æ®¸®¸¦ °¡¸®Å° ´Â Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. ±× ±¸Á¶Ã¼´Â Á¤ÀûÀ¸·Î ÇÒ´çµÇ¾ú°í getpwentÀÇ ¿¬¼ÓÀûÀº È£Ãâ¿¡ ÀÇÇØ¼­ µ¡¾º ¿öÁø´Ù. ±×·¡¼­ ¸¸ÀÏ ´ç½ÅÀÌ ±× Á¤º¸¸¦ ÀúÀåÇϱ⸦ ¿øÇÑ´Ù¸é ±¸Á¶Ã¼ÀÇ ³»¿ëÀ» ´Ù¸¥°÷À¸·Î º¹»çÇØ³õ ¾Æ¾ß¸¸ ÇÑ´Ù.

ÇÔ¼ö : void endpwent (void)

ÀÌ ÇÔ¼ö´Â getpwent¿¡ ÀÇÇØ »ç¿ëµÈ ³»ºÎ ½ºÆ®¸²À» ´Ý´Â´Ù.

25.12.4 »ç¿ëÀÚ ¿£Æ®¸®¸¦ ±â·ÏÇϱâ.

ÇÔ¼ö : int putpwent (const struct passwd *p, FILE *stream)

ÀÌ ÇÔ¼ö´Â Ç¥ÁØ »ç¿ëÀÚ µ¥ÀÌÅͺ£À̽º ÆÄÀÏ¿¡¼­ »ç¿ëµÈ Çü½ÄÀ¸·Î, ½ºÆ®¸² stream¿¡ »ç¿ëÀÚ ¿£Æ®¸® *p ¸¦ ±â·ÏÇÑ´Ù. ¼º°øÇÏ¸é ¸®ÅϰªÀº 0ÀÌ°í ½ÇÆÐÇϸé 0ÀÌ ¾Æ´Ñ°ªÀÌ´Ù. SVID ¿ÍÀÇ È£È¯¼ºÀ» À§Çؼ­ ÀÌ ÇÔ¼ö´Â Á¸ÀçÇÑ´Ù. ¿ì¸®´Â ±¸Á¶Ã¼ struct passwd °¡ À§¿¡ ¼³¸íµÈ Ç¥ÁØÀûÀÎ °ÍÀ» Á¦¿ÜÇϰí´Â ºÎ°¡Àû À¸·Î ¾Æ¹«·± ¸â¹öµéÀ» °¡ÁöÁö ¾Ê¾Ò´Ù°í ¿¹»óÀÌ µÇ´Â °æ¿ì¿¡¸¸ ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇϰí, ±×·¸Áö ¾ÊÀº °æ ¿ìµé¿¡´Â ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÏÁö ¸» °ÍÀº ±ÇÀåÇÑ´Ù; ÀüÇüÀûÀÎ À¯´Ð½º µ¥ÀÌÅͺ£À̽º¿Í ´õºÒ¾î »ç¿ëÀÚ¿¡ ´ëÇÑ ´Ù¸¥ È®ÀåµÈ Á¤º¸¸¦ ÇÕº´ÇÏ´Â ½Ã½ºÅÛ¿¡¼­, ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇØ¼­ ¿£Æ®¸®¸¦ ´õÇÏ´Â °ÍÀº Áß¿äÇÑ Á¤º¸¸¦ »ý·«ÇÏ°Ô µÇ´Â °ÍÀÌ´Ù.

ÇÔ¼ö putpwent ´Â `pwd.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.

25.13 ±×·ì µ¥ÀÌŸº£À̽º

ÀÌ ÀýÀº µî·ÏµÈ ±×·ìµéÀÇ µ¥ÀÌÅͺ£À̽º¸¦ ¾î¶»°Ô °Ë»öÇϰí ãÀ»°ÍÀÎÁö¿¡ ´ëÇÑ ¸ðµç °ÍÀÌ ¼³¸íµÇ¾î ÀÖ´Ù. ´ëºÎºÐÀÇ ½Ã½ºÅÛ¿¡¼­ µ¥ÀÌÅͺ£À̽º ±× ÀÚü´Â `/etc/group'¿¡ º¸Á¸µÇ°í Àִµ¥, ¾î¶² ½Ã½ºÅÛ¿¡ ¼­ ƯÁ¤ÇÑ ³×Æ®¿÷ ¼­ºñ½º´Â ±×°Í¿¡ ´ëÇÑ ¾ï¼¼½º¸¦ Á¦°øÇÑ´Ù.

25.13.1 ±×·ìÀ» À§ÇÑ µ¥ÀÌŸ±¸Á¶Ã¼.

½Ã½ºÅÛ ±×·ì µ¥ÀÌÅͺ£À̽º¸¦ ¾ï¼¼½ºÇϱâ À§ÇÑ ÇÔ¼ö¿Í µ¥ÀÌÅͱ¸Á¶Ã¼´Â Çì´õÆÄÀÏ `grp.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.

µ¥ÀÌÅÍ Å¸ÀÔ : struct group

group ±¸Á¶Ã¼´Â ½Ã½ºÅÛ ±×·ì µ¥ÀÌÅͺ£À̽º ¾È¿¡ ¿£Æ®¸®¿¡ ´ëÇÑ Á¤º¸¸¦ ÀúÀåÇϱâ À§Çؼ­ »ç¿ëµÈ´Ù. ±× ±¸Á¶Ã¼´Â Àû¾îµµ ´ÙÀ½°ú °°Àº ¸â¹öµéÀ» °®°í ÀÖ´Ù.

char *gr_name

±×·ìÀÇ À̸§.

gid_t gr_gid

±×·ìÀÇ ±×·ì ID

char **gr_mem

±×·ì¿¡ ÀÖ´Â »ç¿ëÀÚµéÀÇ À̸§À» °¡¸®Å°´Â Æ÷ÀÎÅÍÀÇ º¤ÅÍ. °¢ »ç¿ëÀÚ À̸§Àº ³Î¹®ÀÚ·Î ³¡³ª´Â ¹®ÀÚ ¿­À̰í, º¤ÅÍ ÀÚü´Â ³¡ÀÌ ³Î Æ÷ÀÎÅÍ·Î ³¡³­´Ù.

25.13.2 ÇÑ °³ÀÇ ±×·ì¿¡ ´ëÇÑ »ó¼¼ÇÑ Á¤º¸¸¦ ¾Ë¾Æ³»±â.

getgrgid ³ª getgrnam À» »ç¿ëÇØ¼­ Á¤ÇØÁø ±×·ì¿¡ ´ëÇÑ Á¤º¸¸¦ ±×·ì µ¥ÀÌÅͺ£À̽º¿¡¼­ ã¾Æ³¾ ¼ö ÀÖ´Ù. ±× ÇÔ¼öµéÀº `grp.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.

ÇÔ¼ö : struct group * getgrgid (gid_t gid)

ÀÌ ÇÔ¼ö´Â ±×·ì ID ·Î gid¸¦ °®°í ÀÖ´Â ±×·ì¿¡ ´ëÇÑ Á¤º¸¸¦ °®°í ÀÖ´Â Á¤ÀûÀ¸·Î ÇÒ´çµÈ ±¸Á¶Ã¼¸¦ °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. ÀÌ ±¸Á¶Ã¼´Â getgrgid ÀÇ ¿¬¼ÓÀûÀΠȣÃâ¿¡ ÀÇÇØ¼­ µ¡¾º¿öÁú °ÍÀÌ´Ù. ³Î Æ÷ÀÎÅÍ´Â ±×·ì ID·Î gid ¸¦ °¡Áø ±×·ìÀÌ ¾ø´Ù´Â ¸»ÀÌ´Ù.

ÇÔ¼ö : struct group * getgrnam (const char *name)

ÀÌ ÇÔ¼ö´Â ±×·ì À̸§À¸·Î nameÀ» °¡Áø ±×·ì¿¡ ´ëÇÑ Á¤º¸¸¦ ´ã°í ÀÖ´Â Á¤ÀûÀ¸·Î ÇÒ´çµÈ ±¸Á¶Ã¼¿¡ ´ë ÇÑ Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. ÀÌ ±¸Á¶Ã¼´Â getgrnamÀÇ ¿¬¼ÓÀûÀΠȣÃâ¿¡ ÀÇÇØ¼­ µ¡¾º¿öÁø´Ù. ³Î Æ÷ÀÎÅÍ´Â ±×·ìÀ̸§À¸·Î nameÀ» °¡Áø ±×·ìÀÌ ¾ø´Ù´Â ¸»ÀÌ´Ù.

25.13.3 ¸ðµç ±×·ì¿¡ ´ëÇÑ ¸®½ºÆ®¸¦ °Ë»öÇϱâ.

ÀÌ ÀýÀº ÇÁ·Î±×·¥¿¡¼­ ÇÑ ¹ø¿¡ ÇÑ ±×·ì¾¿, ½Ã½ºÅÛ¿¡ÀÖ´Â ¸ðµç ±×·ì¿¡ ´ëÇÑ ¸®½ºÆ®¸¦ ¾î¶»°Ô ÀÐÀ» ¼ö ÀÖ´ÂÁö¸¦ ¼³¸íÇÑ´Ù. À̰÷¿¡ ¼³¸íµÈ ÇÔ¼öµéÀº Çì´õÆÄÀÏ `grp.h'¿¡ ¼³¸íµÇ¾î ÀÖ´Ù. ƯÁ¤ÇÑ ÆÄÀÏ·Î ºÎÅÍ ±×·ì ¿£Æ®¸®µéÀ» Àбâ À§Çؼ­ fgetgrent ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

ÇÔ¼ö : struct group * fgetgrent (FILE *stream)

fgetgrent ÇÔ¼ö´Â streamÀ¸·ÎºÎÅÍ ´ÙÀ½ ¿£Æ®¸®¸¦ Àаí, ±× ¿£Æ®¸®¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. ±× ±¸ Á¶Ã¼´Â Á¤ÀûÀ¸·Î ÇÒ´çµÇ¾ú°í fgetgrent ÀÇ ¿¬¼ÓÀûÀΠȣÃâ¿¡ ÀÇÇØ µ¡¾º¿öÁö±â ¶§¹®¿¡ ¸¸ÀÏ ´ç½ÅÀÌ ±× Á¤º¸¸¦ ÀúÀåÇϱ⸦ ¿øÇÑ´Ù¸é ±× ±¸Á¶Ã¼ÀÇ ³»¿ëÀ» ´Ù¸¥°÷À¸·Î º¹»çÇØ³õ¾Æ¾ß¸¸ ÇÑ´Ù. streamÀº Ç¥ÁØ ±×·ì µ¥ÀÌÅÍÆÄÀϰú °°Àº Çü½ÄÀ» °¡Áø ÆÄÀÏÀ̾î¾ß¸¸ ÇÑ´Ù.

±×·ì µ¥ÀÌÅͺ£À̽º¿¡ ÀÖ´Â ¸ðµç ¿£Å͸®µéÀ» °Ë»öÇÏ´Â ¹æ¹ýÀº setgrent, getgrent, ±×¸®°í endgrent °¡ ÀÖ´Ù.

ÇÔ¼ö : void setgrent (void)

ÀÌ ÇÔ¼ö´Â ±×·ì µ¥ÀÌÅͺ£À̽º·ÎºÎÅÍ Àбâ À§ÇÑ ½ºÆ®¸²À» ÃʱâÈ­ÇÑ´Ù. getgrent ÇÔ¼öÀÇ È£Ãâ¿¡¼­ ÀÌ ½ºÆ®¸²ÀÌ »ç¿ëµÈ´Ù.

ÇÔ¼ö : struct group * getgrent (void)

getgrent ÇÔ¼ö´Â setgrent ¿¡ ÀÇÇØ ÃʱâÈ­µÈ ½ºÆ®¸²À¸·ÎºÎÅÍ ´ÙÀ½ ¿£Æ®¸®¸¦ ÀÐ°í ±× ¿£Å͸®¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. ±× ±¸Á¶Ã¼´Â Á¤ÀûÀ¸·Î ÇÒ´çµÇ¾ú°í getgrentÀÇ ¿¬¼ÓÀûÀΠȣÃâ¿¡ ÀÇÇØ¼­ µ¡¾º¿ö Áø´Ù. ±×·¡¼­ ¸¸ÀÏ ´ç½ÅÀÌ ±× Á¤º¸¸¦ ÀúÀåÇϱ⸦ ¿øÇÑ´Ù¸é ±× ±¸Á¶Ã¼ÀÇ ³»¿ëÀ» ´Ù¸¥°÷À¸·Î º¹»çÇØ ³õ¾Æ¾ß¸¸ ÇÑ´Ù.

ÇÔ¼ö : void entgrent (void)

ÀÌ ÇÔ¼ö´Â getgrent ¿¡ ÀÇÇØ »ç¿ëµÈ ³»ºÎ½ºÆ®¸²À» ´Ý´Â´Ù.

25.14 »ç¿ëÀÚ¿Í ±×·ì µ¥ÀÌÅͺ£À̽º¿¡ ´ëÇÑ ¿¹Á¦.

´ÙÀ½Àº ½Ã½ºÅÛ µ¥ÀÌÅͺ£À̽º ÁúÀÇ ÇÔ¼öµéÀ» »ç¿ëÇÏ´Â ¿¹¸¦ º¸¿©ÁÖ´Â ¿¹Á¦ ÇÁ·Î±×·¥ÀÌ´Ù. ´ÙÀ½ ÇÁ ·Î±×·¥Àº ÇÁ·Î±×·¥À» ½ÇÇà½Ã۰í ÀÖ´Â »ç¿ëÀÚ¿¡ ´ëÇÑ ¾î¶²Á¤º¸¸¦ Ãâ·ÂÇÑ´Ù.

#include <grp.h>

#include <pwd.h>

#include <sys/types.h>

#include <unistd.h>

#include <stdlib.h>

int

main (void)

{

uid_t me;

struct passwd *my_passwd;

struct group *my_group;

char **members;

/* »ç¿ëÀÚ ID¿¡ ´ëÇÑ Á¤º¸¸¦ ¾ò¾î¶ó. */

me = getuid ();

my_passwd = getpwuid (me);

if (!my_passwd)

{

printf ("Couldn't find out about user %d.\n", (int) me);

exit (EXIT_FAILURE);

}

/* Á¤º¸¸¦ Ãâ·ÂÇ϶ó. */

printf ("I am %s.\n", my_passwd->pw_gecos);

printf ("My login name is %s.\n", my_passwd->pw_name);

printf ("My uid is %d.\n", (int) (my_passwd->pw_uid));

printf ("My home directory is %s.\n", my_passwd->pw_dir);

printf ("My default shell is %s.\n", my_passwd->pw_shell);

/* µðÆúÆ® ±×·ì ID¿¡ ´ëÇÑ Á¤º¸¸¦ ¾ò¾î¶ó. */

my_group = getgrgid (my_passwd->pw_gid);

if (!my_group)

{

printf ("Couldn't find out about group %d.\n",

(int) my_passwd->pw_gid);

exit (EXIT_FAILURE);

}

/* Á¤º¸¸¦ Ãâ·ÂÇ϶ó. */

printf ("My default group is %s (%d).\n",

my_group->gr_name, (int) (my_passwd->pw_gid));

printf ("The members of this group are:\n");

members = my_group->gr_mem;

while (*members)

{

printf (" %s\n", *(members));

members++;

}

return EXIT_SUCCESS;

}

´ÙÀ½Àº ÀÌ ÇÁ·Î±×·¥À» ÅëÇÑ Ãâ·ÂÀÌ´Ù.

I am Throckmorton Snurd.

My login name is snurd.

My uid is 31093.

My home directory is /home/fsg/snurd.

My default shell is /bin/sh.

My default group is guest (12).

The members of this group are:

friedman

tami