Joinc¿Í ÇÔ²²ÇÏ´Â ¸®´ª½º ½Ã½ºÅÛ ÇÁ·Î±×·¡¹Ö 4Àå - À¯Àú ȯ°æ
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

Contents

1 ¸®´ª½º °èÁ¤ ½Ã½ºÅÛ
2 °èÁ¤ Á¤º¸
3 ½´ÆÛÀ¯Àú
4 À¯Àú »ý¼º °úÁ¤
4.1 À¯Àú ÆÄÀϵé
4.2 passwd ÆÄÀÏ
4.3 shadow password
5 »ç¿ëÀÚ Á¤º¸ ¾ò¾î¿À±â
6 »ç¿ëÀÚ ÆÐ½º¿öµå ¾ò¾î¿À±â
7 »ç¿ëÀÚ ·Î±×ÀÎ ±â·Ï
8 ȯ°æº¯¼ö
8.1 Áß¿ä ȯ°æ º¯¼öµé
8.2 ȯ°æº¯¼ö °ª Àбâ
8.3 ȯ°æº¯¼ö °ª ¼³Á¤

Hello-World.jpg

1 ¸®´ª½º °èÁ¤ ½Ã½ºÅÛ

¸®´ª½º´Â ´ÙÁß »ç¿ëÀÚ ¿î¿µÃ¼Á¦´Ù. ÀÌ´Â µ¿½Ã¿¡ ¿©·¯»ç¶÷ÀÌ ÄÄÇ»ÅÍÀÇ ÀÚ¿øÀ» »ç¿ëÇÒ ¼ö ÀÖÀ½À» ÀǹÌÇÑ´Ù. ±×·¯¹Ç·Î ¸®´ª½º ¿î¿µÃ¼Á¦´Â ¿©·¯»ç¶÷À» °ü¸®ÇÒ ¼ö ÀÖ´Â ½Ã½ºÅÛÀ» °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù. À̰ÍÀ» °èÁ¤ ½Ã½ºÅÛÀ̶ó°í ÇÑ´Ù. °èÁ¤À̶õ ÄÄÇ»ÅÍ ÀÚ¿ø¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Â »ç¶÷µé¿¡ ´ëÇÑ Á¤º¸·Î ÀÌÇØÇÏ¸é µÉ °ÍÀÌ´Ù.

¾Æ´Ï´Ù. ¾ö¹ÐÈ÷ µûÁöÀÚ¸é, »ç¶÷À̶ó´Â Ç¥ÇöÀº À߸øµÈ°Í °°´Ù. ¿î¿µÃ¼Á¦ÀÇ °èÁ¤¿¡´Â ½Ã½ºÅÛ °èÁ¤°ú ÀÏ¹Ý »ç¿ëÀÚ °èÁ¤ Å©°Ô µÎ°¡Áö·Î ºÐ·ùÇÒ ¼ö Àִµ¥, »ç¶÷À̶óÇϸé ÀÏ¹Ý »ç¿ëÀÚ °èÁ¤¸¸À» °¡¸®Å°´Â °ÍÀ̱⠶§¹®ÀÌ´Ù. ±×·¯¹Ç·Î »ç¶÷ ´ë½Å °´Ã¼¶ó°í Ç¥ÇöÇÏ´Â°Ô ¿ÇÀº °Í °°´Ù. ´Ù½Ã Á¤¸®ÇÏÀÚ. °èÁ¤À̶õ ÄÄÇ»ÅÍ ÀÚ¿ø¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Â °´Ã¼¿¡ ´ëÇÑ Á¤º¸¸¦ ÀǹÌÇÑ´Ù.

2 °èÁ¤ Á¤º¸

°èÁ¤À̶ó´Â °ÍÀº ÄÄÇ»ÅÍ ÀÚ¿ø¿¡ Á¢±ÙÇϱâ À§ÇÑ °´Ã¼¶ó´Â °ÍÀ» ¾Ë°Ô µÇ¾ú´Ù. ±×·¸´Ù¸é, ÀÌµé °´Ã¼´Â °¢ °´Ã¼ÀÇ Æ¯Â¡À» ³ªÅ¸³»ÁÖ´Â Á¤º¸¸¦ °¡Áö°í ÀÖÀ» °ÍÀÌ´Ù. À̰ÍÀ» °èÁ¤Á¤º¸¶ó°í ÇÏ´Ù. °èÁ¤Á¤º¸´Â ´ÙÀ½°ú °°Àº Á¤º¸µéÀ» Æ÷ÇÔÇϰí ÀÖÀ» °ÍÀÌ´Ù. °èÁ¤Àº À¯Àú¶ó°í ºÎ¸£±âµµ Çϸç, °èÁ¤Á¤º¸´Â À¯ÀúÁ¤º¸¿Í µ¿ÀÏÇÑ Àǹ̷Π»ç¿ëµÈ´Ù.
  • °èÁ¤À̸§
    °èÁ¤À» ´Ù¸¥ °èÁ¤°ú ºÐ¸®½ÃÄÑÁÖ´Â À̸§
  • ±ÇÇÑ
    ÄÄÇ»ÅÍ ÀÚ¿øÀº ±× ÇѰ谡 ÀÖ´Ù. ¹«ÇÑ´ë°¡ ¾Æ´Ï´Ù. ¶ÇÇÑ ´ÙÁß »ç¿ëÀÚ ¿î¿µÃ¼Á¦ÀÎ ¸®´ª½º¿¡ ÀÇÇØ¼­ Á¢±ÙÇÏ°Ô µÉ°æ¿ì, ½Ã½ºÅÛ º¸¾È°ú µ¥ÀÌÅÍ º¸¾ÈÀÇ Â÷¿ø¿¡¼­ Á¢±ÙÁ¦¾î¸¦ ÇØ¾ßÇÒ Çʿ䰡 ÀÖ´Ù. ¸®´ª½º´Â ±ÇÇÑÀ» ÅëÇØ¼­ À̸¦ °ü¸®ÇÑ´Ù. Áï ÀÌ ÆÄÀÏÀº ´©±¸´©±¸´Â Àб⸸ °¡´ÉÇϰí, ¾î¶² ±×·ì¿¡ ´ëÇØ¼­´Â Àбâ/¾²±â°¡ ¸ðµÎ °¡´ÉÇÏ´Ù ¶ó´Â ½ÄÀ¸·Î °ü¸®ÇÑ´Ù.
  • ÆÐ½º¿öµå
    À̸§°ú À̸§¿¡ µû¸¥ ±ÇÇÑÀÌ ÁÖ¾îÁ³´Ù¸é, ÀÌ ±ÇÇÑÀ» ¿äûÇÑ À¯Àú°¡ Á¤¸»·Î ÇÕ¹ýÀûÀÎ À¯ÀúÀÎÁö¸¦ È®ÀÎÇÏ´Â °úÁ¤À» °ÅÃÄ¾ß ÇÒ °ÍÀÌ´Ù. ÀÎÁõ°úÁ¤ÀÎ ¼ÀÀÌ´Ù. °¡Àå ³Î¸® »ç¿ëµÇ´Â ¹æ¹ýÀº ¾ÆÀ̵ð/ÆÐ½º¿öµå¸¦ ÅëÇÑ ÀÎÁõ¹æ¹ýÀÌ´Ù.

À§ÀÇ 3°¡Áö Á¤º¸¸¦ °¡Áö°í ÀÖÀ¸¸é, ¿ÏÀüÇÑ ÇϳªÀÇ °èÁ¤À» ¸¸µé¾î ³¾ ¼ö ÀÖ´Ù. ¸î¸î ºÎ°¡ÀûÀÎ Á¤º¸µéÀÌ ´õ ÇÊ¿äÇÑ °æ¿ì°¡ Àִµ¥, ³ª¸ÓÁö´Â ¸» ±×´ë·Î ºÎ°¡Á¤º¸µéÀÏ »ÓÀÌ´Ù.

3 ½´ÆÛÀ¯Àú

ÄÄÇ»ÅÍ ½Ã½ºÅÛÀº ȸ»ç¿Í ¸Å¿ì ºñ½ÁÇÑ ¸éÀÌ ÀÖ´Ù. ȸ»çó·³ ÀÚ¿ø°ú °èÁ¤(»ç¶÷)ÀÌ ÀÖÀ¸¸ç, ±ÇÇÑÀÌ ºÎ¿©µÈ´Ù. ÀÔÃâÀԽà ÀÎÁõÀ» ¿ä±¸Çϱ⵵ ÇÑ´Ù.

ȸ»ç¿¡ CEO°¡ ÀÖ´Ù¸é, ¿î¿µÃ¼Á¦¿¡´Â ½´ÆÛÀ¯Àú°¡ ÀÖ´Ù. ½´ÆÛÀ¯Àú´Â ¹«¾ùÀ̵çÁö ÇÒ ¼ö ÀÖ´Â ¸·°­ÇÑ ±ÇÇÑÀ» °¡Áø Ưº°ÇÑ À¯Àú¸¦ ĪÇÑ´Ù. ȸ»çÀÇ °æ¿ì CEO¶ó°í ÇÏ´õ¶óµµ, ±ÇÇÑÀ» Çà»çÇÔ¿¡ À־ ¿©·¯°¡Áö Á¦¾àÀÌ ÀÖ´Â ¹Ý¸é, ½´ÆÛÀ¯Àú´Â ¸»±×´ë·Î ½´ÆÛ¸ÇÀÇ ´É·ÂÀ» °¡Áö°í ¸ðµç ´É·ÂÀ» Çà»çÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½°ú °°Àº ¸í·ÉÇϳª·Î ¿î¿µÃ¼Á¦¸¦ ½Ï ³¯·Á¹ö¸± ¼öµµ ÀÖ´Ù.
# rm -rf / 
 

ÀüÅëÀûÀ¸·Î À¯´Ð½º¿¡¼­ ½´ÆÛÀ¯Àú´Â root¶ó´Â °èÁ¤À̸§ÀÌ ºÎ¿©µÈ´Ù. ¸®´ª½º ¿ª½Ã À¯´Ð½ºÀÇ ÀÌ·¯ÇÑ ÀüÅëÀ» µû¸£°í ÀÖ´Ù. ½´ÆÛÀ¯Àú´Â ÆÄÀÏÀ» ¸¸µé°í »èÁ¦Çϰí, ÆÄƼ¼ÇÀ» ³ª´©°í, À¯Àú¸¦ Ãß°¡ÇÏ°í ±ÇÇÑÀ» Á¶Á¤ÇÏ´Â µîÀÇ ¸ðµç ¾÷¹«¸¦ ó¸®ÇÒ ¼ö ÀÖ´Â ±ÇÇÑÀ» °¡Áö°Ô µÈ´Ù. ±× ±ÇÇÑÀÌ ¿ö³« ¸·°­ÇÑ °ü°è·Î, ÃÖ±ÙÀÇ ¸î¸î ¿î¿µÃ¼Á¦µéÀº root ¶óµµ ±× ±ÇÇÑÀ» Á¦ÇѽÃŰ´Â °æ¿ì°¡ ÀÖ´Ù.

4 À¯Àú »ý¼º °úÁ¤

¾Æ¸¶µµ ¿©·¯ºÐÀº adduser(1) ¸í·ÉÀ» ÀÌ¿ëÇØ¼­ À¯Àú¸¦ »ý¼ºÇÏ´Â ¹ýÀ» ¾Ë°í ÀÖÀ» °ÍÀÌ´Ù. ¿©±â¿¡¼­´Â ½ÇÁ¦ À¯Àú¸¦ »ý¼ºÇϱâ À§Çؼ­ ¾î¶² °úÁ¤À» °ÅÃÄ¾ß ÇÏ´ÂÁö¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.

4.1 À¯Àú ÆÄÀϵé

¸®´ª½º¿¡¼­ ¸ðµç Á¤º¸´Â ÆÄÀÏÀ» ÅëÇØ¼­ °ü¸®µÈ´Ù´Â °ÍÀ» ¾Ë°í ÀÖÀ» °ÍÀÌ´Ù. À¯ÀúÁ¤º¸ ¿ª½Ã ¸¶Âù°¡Áö À̸ç, À¯Àú¿Í °ü·ÃµÈ ÆÄÀϵéÀº /etc ¹Ø¿¡ Á¸ÀçÇÑ´Ù. ÀüÅëÀûÀ¸·Î À¯´Ð½º ½Ã½ºÅÛ¿¡¼­ /etc µð·ºÅ丮´Â °¢Á¾ ¼³Á¤ÆÄÀÏÀ» ÀúÀåÇϱâ À§ÇÑ ¸ñÀûÀ¸·Î »ç¿ëµÇ¾îÁö°í ÀÖ´Ù. À¯Àú °ü·Ã ÁÖ¿ä ÆÄÀϵéÀº ´ÙÀ½°ú °°´Ù.
passwd À¯Àú À̸§°ú ÆÐ½º¿öµå°¡ ÀúÀåµÈ´Ù.
shadow passwd¿Í ºñ½ÁÇÏÁö¸¸ º¸¾ÈÀÌ °­È­µÇ¾ú´Ù.
group ±×·ì Á¤º¸°¡ ÀúÀåµÇ¾îÀÖ´Ù.
adduser.conf À¯Àú»ý¼º°ú °ü·ÃµÈ º¯¼öµéÀÌ Á¤ÀǵǾî ÀÖ´Ù.

°¢ ÆÄÀϵ鿡 ´ëÇÑ ³»¿ëÀº ¾Æ·¡¿¡ ´Ù·çµµ·Ï ÇÒ °ÍÀÌ´Ù.

4.2 passwd ÆÄÀÏ

À¯ÀúÀÇ ±âº»ÀûÀÎ Á¤º¸´Â /etc/passwdÆÄÀÏ¿¡ ÀúÀåµÈ´Ù. À¯ÀúÁ¤º¸´Â printable ASCII ¹®ÀÚ·Î ÀÔ·ÂÀÌ µÇ±â ¶§¹®¿¡ vi¿Í °°Àº ¿¡µðÅ͸¦ ÀÌ¿ëÇØ¼­ ³»¿ëÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½Àº passwd ÆÄÀÏ ³»¿ëÀÇ ÀϺκÐÀÌ´Ù.
# cat /etc/passwd 
... 
yundream:x:1000:1000:yundream,,,:/home/yundream:/bin/bash 
mysql:x:110:121:MySQL Server,,,:/var/lib/mysql:/bin/false 
mt-daapd:x:114:65534::/var/cache/mt-daapd:/bin/true 
testyun:x:1004:1004:,,,:/home/testyun:/bin/bash 
myyun:x:115:65534::/home/myyun:/bin/false 
... 
 
:¸¦ ±¸ºÐÀÚ·Î 7°³ÀÇ Çʵå·Î ÀÌ·ç¾îÁø °£´ÜÇÑ ±¸Á¶¸¦ Çϰí ÀÖ´Ù. °¢ Çʵ尡 Æ÷ÇÔÇÏ´Â ³»¿ëÀº ´ÙÀ½°ú °°´Ù.
À¯Àú:ÆÐ½º¿öµå:UID:GID:GECOS:µð·ºÅ丮:½© 
 
  1. À¯Àú : ½Ã½ºÅÛ³»¿¡¼­ »ç¿ëµÇ´Â À¯Àú À̸§
  2. ÆÐ½º¿öµå : À¯Àú°¡ »ç¿ëÇÒ ÆÐ½º¿öµå
  3. UID : À¯Àú¿¡°Ô ºÎ¿©µÇ´Â ID·Î ÀÏ·ÃÀÇ ¼ýÀÚ´Ù.
  4. GID : À¯Àú°¡ Æ÷ÇԵǴ ±×·ìÀÇ ID·Î ÀÏ·ÃÀÇ ¼ýÀÚ´Ù.
  5. GECOS : À¯ÀúÀÇ ºÎ°¡Á¤º¸·Î »ý·«°¡´ÉÇÏ´Ù.
  6. µð·ºÅ丮 : À¯ÀúÀÇ È¨ µð·ºÅ丮
  7. ½© : À¯Àú°¡ »ç¿ëÇÏ°Ô µÉ shell ÇÁ·Î±×·¥

±âº»ÀûÀ¸·Î /etc/passwd ¸¦ ÆíÁýÇÒ ¼ö ÀÖ´Ù¸é, ¾î·ÆÁö ¾Ê°Ô À¯Àú¸¦ Ãß°¡½ÃŰ´Â ÇÁ·Î±×·¥À» »ý¼ºÇÒ ¼ö ÀÖ´Ù. ¸¶Âù°¡Áö·Î /etc/passwd ÆÄÀÏÀ» ÀоîµéÀÌ´Â °ÍÀ¸·Î, »ç¿ëÀÚÀÇ Á¤º¸¸¦ ¾ò¾î¿Ã ¼öµµ ÀÖ´Ù. ÆÄÀÏÀÇ ±ÇÇѼ³Á¤µî¿¡ »ç¿ëµÇ´Â °ªÀº À¯Àú À̸§ÀÌ ¾Æ´Ñ UIDÀ̱⠶§¹®¿¡, /etc/passwd ÆÄÀÏÀº ÀÚÁÖ ºÐ¼®µÉ Çʿ䰡 ÀÖ´Ù. ÀÌ·¯ÇÑ ºÐ¼® ÇÁ·Î±×·¥Àº ÇÁ·Î±×·¡¸Ó°¡ Á÷Á¢ ÀÛ¼ºÇÒ ¼öµµ ÀÖÁö¸¸ ¸î¸î ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¸é ½±°Ô À¯ÀúÁ¤º¸¸¦ ¾ò¾î¿Ã ¼ö ÀÖ´Ù. ÀÌ¿¡ ´ëÇØ¼­´Â ¸¶Áö¸·¿¡ »ç¿ëÀÚ Á¤º¸¸¦ ¾ò¾î¿À´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Â °ÍÀ¸·Î ¾Ë¾Æº¸µµ·Ï ÇÒ °ÍÀÌ´Ù.

±×·±µ¥, ÀÌ»óÇÑ Á¡ÀÌ ÀÖ´Ù. ÆÐ½º¿öµå ¿µ¿ªÀÌ x·Î µÇ¾îÀÖ´Ù. ÆÐ½º¿öµå°¡ ¸ù¶¥ xÀϸ®´Â ¾øÀ»Å×°í !!?

4.3 shadow password

passwd ÆÄÀÏ¿¡ »ç¿ëÀÚ ÆÐ½º¿öµå°¡ ¾ø´Ù¸é, ¾î¶»°Ô À¯ÀúÀ̸§°ú ÆÐ½º¿öµå·Î ÀÎÁõÀÌ °¡´ÉÇÒ °ÇÁö°¡ ¹®Á¦°¡ µÈ´Ù. ¿ì¼± passwd ÆÄÀÏÀÇ ¹®Á¦Á¡¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ. ´ÙÀ½Àº passwd ÆÄÀÏÀÇ ±ÇÇÑÀÌ´Ù.
# ls -al /etc/passwd 
-rw-r--r-- 1 root root 1522 2008-01-09 23:34 /etc/passwd 
 
´©±¸µçÁö ÀÐÀ» ¼ö ÀÖ°Ô µÇ¾îÀÖ´Ù. ´Ü¹æÇâ ¾Ïȣȭ µÇ¾î ÀÖ±â´Â ÇÏÁö¸¸, ¾ÏȣȭµÈ ÀÏ·ÃÀÇ ¹®ÀÚ¸¦ ¾òÀ» ¼ö ÀÖ´Ù¸é, ÆÐ½º¿öµå °Ë»ç ÇÁ·Î±×·¥À» ¸¸µé¾î¼­ ÆÐ½º¿öµå¸¦ ã¾Æ³¾ ¼ö ÀÖ´Ù. ÀÌ´Â º¸¾È»ó ½É°¢ÇÑ ¹®Á¦¶ó°í ÇÒ ¼ö ÀÖ´Ù.

±×·¡¼­ shadow password¶ó´Â ¹æ½ÄÀ» µµÀÔÇß´Ù. /etc/passwd ¿¡´Â ÆÐ½º¿öµå¸¦ Á¦¿ÜÇÑ Á¤º¸¸¸À» ÀúÀåÇϰí, ½ÇÁ¦ ÆÐ½º¿öµå´Â ¿ÀÁ÷ root °èÁ¤¸¸ ÀÐÀ» ¼ö ÀÖ´Â /etc/shadowÆÄÀÏ¿¡ ÀúÀåÇÏ´Â °ÍÀ¸·Î passwd ÆÄÀÏÀÇ º¸¾È¹®Á¦Á¡À» ÇØ°áÇÑ ¹æ½ÄÀÌ´Ù. /etc/shadow ÆÄÀÏÀÇ ±ÇÇÑÀ» È®ÀÎÇØ º¸¸é, ´ÜÁö root °èÁ¤¸¸ ÀÐÀ» ¼ö ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù. ÀÏ¹Ý À¯Àú°¡ ÀÐÀ» ¼ö ¾ø±â ¶§¹®¿¡, ÆÐ½º¿öµå º¸¾ÈÀ» ´Þ¼ºÇÏ°Ô µÈ´Ù.
#ls -al /etc/shadow 
-rw-r----- 1 root shadow 996 2008-01-09 23:34 /etc/shadow 
 
»ç½Ç »ç¿ëÀÚ°¡ ÄÄÇ»ÅÍ ½Ã½ºÅÛ¿¡ ·Î±×ÀÎ ÇÒ°ÍÀÎÁö ¾ÈÇÒ °ÍÀÎÁö¸¦ °áÁ¤ÇÏ´Â ±ÇÇÑÀº root »ç¿ëÀÚ¸¸ °¡Áö°í Àֱ⠶§¹®¿¡, ´Ù¸¥ À¯Àú°¡ ÀÐÀ» ÇÊ¿ä´Â ¾øÀ» °ÍÀÌ´Ù.

´Ü ÀÏ¹Ý »ç¿ëÀÚµµ ÆÐ½º¿öµå¸¦ Á¦¿ÜÇÑ ´Ù¸¥ À¯ÀúÀÇ Á¤º¸¸¦ ¾Ë¾Æ¾ßÇÒ Çʿ䰡 Àֱ⠶§¹®¿¡, /etc/passwd ÆÄÀÏÀ» ³²°ÜµÎ°Ô µÈ´Ù. À¯ÀúÁ¤º¸´Â /etc/passwd ÆÐ½º¿öµå Á¤º¸´Â /etc/shadow ¸¦ ÅëÇØ¼­ À¯ÁöµÈ´Ù. ´ÙÀ½Àº shadow ÆÄÀÏ¿¡ ÀúÀåµÈ Á¤º¸µéÀÌ´Ù.
yundream:$1$1S6/q4Ed$7en1qZdeOVofyEjqaofy/:13663:0:99999:7  
 
¿ª½Ã :¸¦ ±¸ºÐÀÚ·Î ÇØ¼­ Çʵ带 ±¸ºÐÇϰí ÀÖ´Ù. °¢ ÇʵåÀÇ Á¤º¸´Â getspend(3) ¸Þ´º¾ó ¹®¼­¸¦ Âü°íÇϱ⠹ٶõ´Ù.

ÆÐ½º¿öµå´Â crypt(3)¿Í md5¸¦ ÀÌ¿ëÇØ¼­ ´Ü¹æÇâÀ¸·Î ¾Ïȣȭ µÈ´Ù.

5 »ç¿ëÀÚ Á¤º¸ ¾ò¾î¿À±â

±×·³ ½ÇÁ¦ »ç¿ëÀÚ Á¤º¸¸¦ ¾ò¾î¿À´Â ¹æ¹ý¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ. ¿ì¼± »ç¿ëÀÚ Á¤º¸´Â /etc/passwd ÆÄÀÏÀÇ ³»¿ëÀ» Àоî¿Í¼­ ±¸ºÐÀÚ :·Î Çʵ带 Âɰ³°í, À̰͵éÀ» ±¸Á¶Ã¼¿¡ Áý¾î ³Ö´Â ¹æ¹ýÀ» »ý°¢Çغ¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

±×·¯³ª À§ÀÇ ¹æ¹ýÀº ³Ê¹« ±ÍÂú´Ù. ´ÙÇàÈ÷µµ ¸®´ª½º´Â /etc/passwd ÆÄÀÏ¿¡¼­ »ç¿ëÀÚ Á¤º¸¸¦ ¾ò¾î¿À±â À§ÇÑ Ç¥ÁØ ¶óÀ̺귯¸® ÇÔ¼öÀÎ getpwentÇÔ¼ö¸¦ Á¦°øÇϰí ÀÖ´Ù.
#include <pwd.h> 
#include <sys/types.h> 
 
struct passwd *getpwent(void); 
 
getpwent ÇÔ¼ö´Â /etc/passwd ¿¡¼­ ÆÐ½º¿öµå Á¤º¸¸¦ Àоîµé¿©¼­ passwd ±¸Á¶Ã¼¿¡ ÀúÀåÇϰí, À̰Ϳ¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ µÇµ¹·ÁÁØ´Ù. passwd ±¸Á¶Ã¼´Â ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù.
struct passwd 
{ 
    char  *pw_name;     /* À¯Àú À̸§ */ 
    char  *pw_passwd;   /* À¯Àú ÆÐ½º¿öµå */ 
    uid_t pw_uid;       /* À¯Àú ID (UID) */  
    gid_t pw_gid;       /* ±×·ì ID (GID) */  
    char  *pw_gecos;    /* ½ÇÁ¦ À̸§ */ 
    char  *pw_dir;      /* Ȩ µð·ºÅ丮 */ 
    char  *pw_shell;    /* »ç¿ëÀÚ ½© */ 
}; 
 

´ÙÀ½Àº getpwent()ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ À¯ÀúÁ¤º¸¸¦ Àоî¿À´Â °£´ÜÇÑ ÇÁ·Î±×·¥ÀÌ´Ù.
#include <pwd.h> #include <string.h> #include <stdio.h> #include <sys/types.h> int main(int argc, char **argv) { char *name; if (argc != 2) { printf("Usage : %s username\n", argv[0]); return 1; } name = argv[1]; struct passwd *pass_info = NULL; while((pass_info = getpwent()) != NULL) { if (strncmp(name, pass_info->pw_name, strlen(name)) == 0) { printf("%12s uid(%d) gid(%d) home(%s)\n", pass_info->pw_name, pass_info->pw_uid, pass_info->pw_gid, pass_info->pw_dir); return 0; } } printf ("Can not find User : %s\n", name); return 1; }

6 »ç¿ëÀÚ ÆÐ½º¿öµå ¾ò¾î¿À±â

¸¸¾à À¯ÀúÀÎÁõÀ» À§ÇÑ ÇÁ·Î±×·¥À» ¸¸µé±â¸¦ ¿øÇÑ´Ù¸é, ÆÐ½º¿öµå±îÁö °¡Á®¿À´Â ÇÁ·Î±×·¥À» ¸¸µé¾î¾ß ÇÒ °ÍÀÌ´Ù. ÆÐ½º¿öµå´Â /etc/shadow ¿¡ ÀúÀåµÇ¾î ÀÖÀ¸¸ç, getspent() ÇÔ¼ö¸¦ ÀÌ¿ëÇϸé, °£´ÜÇÏ°Ô ÆÐ½º¿öµå Á¤º¸¸¦ ¾ò¾î¿Ã ¼ö ÀÖ´Ù. ´Ü shadow ÆÄÀÏÀº root À¯Àú¸¸ ÀÐÀ» ¼ö ÀÖ´Ù.
#include <shadow.h> 
 
struct spwd *getspent(); 
struct spwd *getspnam(char *name); 
} 
À̵é ÇÔ¼ö¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸íÀº getspend(3) ¹®¼­¸¦ È®ÀÎÇØ º¸±â ¹Ù¶õ´Ù. Ä£ÀýÇϰԵµ ¿¹Á¦±îÁö Æ÷ÇÔÇϰí ÀÖ´Ù.

7 »ç¿ëÀÚ ·Î±×ÀÎ ±â·Ï

¸®´ª½º ¿î¿µÃ¼Á¦ ´ÙÁß»ç¿ëÀÚ ¿î¿µÃ¼Á¦ÀÌ´Ï ¸¸Å­, ÇöÀç ½Ã½ºÅÛ¿¡ ¾î¶² »ç¿ëÀÚ°¡ µé¾î¿ÍÀÖ´ÂÁö¿¡ ´ëÇÑ Á¤º¸°¡ Áß¿äÇÏ°Ô Ãë±ÞµÈ´Ù. ÀÌ·¯ÇÑ ·Î±×ÀÎ Á¤º¸´Â »ç¿ëÀÚ Á¡°Ë, ƯÈ÷ º¸¾ÈÁ¡°ËÀ» À§Çؼ­ »ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

¸®´ª½º ¿î¿µÃ¼Á¦´Â w(1)¶ó´Â ½Ã½ºÅÛ ¸í·ÉÀ» Á¦°øÇϴµ¥, À̰ÍÀ» ÀÌ¿ëÇϸé, ÇöÀç ·Î±×ÀÎµÈ »ç¿ëÀÚÀÇ Á¤º¸¸¦ ¾ò¾î¿Ã ¼ö ÀÖ´Ù.
# w  
 23:27:41  up 35 days, 12:51,  1 user,  load average: 0.13, 0.42, 0.65 
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU  WHAT 
root     pts/4    202.150.176.150  11:27pm  0.00s  0.05s  0.00s  w  
yundream pts/1    :0               22:59    6.00s  0.34s  0.16s  w3m  
 
·Î±×ÀÎµÈ »ç¿ëÀÚÀÇ IP ÁÖ¼Ò, ·Î±×ÀÎÇÑ ½Ã°£, ÀÚ¿øÀÇ »ç¿ëÀ², ÇöÀç ¾î¶² ÇÁ·Î±×·¥À» ½ÇÇàÁßÀÎÁö¿¡ ´ëÇÑ Á¤º¸¸¦ º¸¿©ÁØ´Ù.

ÀÌ·¯ÇÑ Á¤º¸µéÀº utmp¶ó´Â ¸®´ª½º °íÀ¯ÀÇ ·Î±×ÀÎ ±â·Ï½Ã½ºÅÛÀ» ÀÌ¿ëÇØ¼­ ¾ò¾î¿Ã ¼ö ÀÖ´Ù. ¸®´ª½º´Â utmp Á¤º¸¿¡ Á¢±ÙÇÒ ¼ö ÀÖµµ·Ï getutent¶ó´Â ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù. utmp Á¤º¸´Â /var/run/utmp ÆÄÀÏ¿¡ ±â·ÏÀÌ µÈ´Ù.
#include <utmp.h> 
 
struct utmp *getutent(void); 
 
getuent ´Â ÀоîµéÀÎ Á¤º¸¸¦ utmp ±¸Á¶Ã¼¿¡ ä¿ö¼­ µÇµ¹·ÁÁØ´Ù. utmp ±¸Á¶Ã¼´Â ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù.
struct utmp                                                        
{                                                            
    short ut_type;              /* type of login */                
    pid_t ut_pid;               /* pid of login process */          
    char ut_line[UT_LINESIZE];  /* device name of tty - "/dev/" */ 
    char ut_id[4];              /* init id or abbrev. ttyname */     
    char ut_user[UT_NAMESIZE];  /* user name */                      
    char ut_host[UT_HOSTSIZE];  /* hostname for remote login */ 
    struct exit_status ut_exit; /* The exit status of a 
                                   process marked as DEAD_PROCESS. * 
    long ut_session;            /* session ID, used for 
 
    struct timeval ut_tv;       /* time entry was made.  */ 
    int32_t ut_addr_v6[4];      /* IP address of remote host.  */ 
    char pad[20];               /* Reserved for future use.  */ 
}; 
 
w ¸í·ÉÀ» ÀÌ¿ëÇØ¼­ ¾ò¾î¿Â Á¤º¸µéÀ» ¸ðµÎ Æ÷ÇÔÇϰí ÀÖÀ½À» È®ÀÎÇÒ ¼ö ÀÖ´Ù.

´ÙÀ½Àº utmp¸¦ ÀÌ¿ëÇØ¼­, ·Î±×ÀÎÇÑ »ç¿ëÀÚÀÇ Á¤º¸¸¦ ¾ò¾î¿À´Â ÇÁ·Î±×·¥ÀÌ´Ù. ÇÁ·Î±×·¥ÀÇ À̸§Àº myw.c ·Î Çß´Ù. ÀÌÇØÇϴµ¥ Å« ¾î·Á¿òÀº ¾øÀ» °ÍÀÌ´Ù.
#include <unistd.h> 
#include <utmp.h>  
#include <stdio.h>  
#include <sys/types.h> 
#include <sys/stat.h> 
#include <time.h>  
#include <fcntl.h> 
#include <string.h>  
     
int get_current_pid(int login_pid); 
char *get_current_procname(int proc_num); 
 
int main(int argc, char **argv) 
{ 
    struct utmp *utmpfp; 
    struct utmp *myutmp; 
 
    char *tty_name = NULL; 
    char *host_ip;  
     
    char now_local_time[50]; 
 
    time_t the_time; 
    struct tm *tm_ptr; 
 
    setutent(); 
 
    // getutent()¸¦ ÀÌ¿ëÇØ¼­ utmpÁ¤º¸¸¦ ¾ò¾î¿Â´Ù. 
    while ((utmpfp = getutent()) != NULL) 
    { 
        // ut_time Àº À¯´Ð½º ½Ã°£À¸·Î ÀúÀåµÇ´Âµ¥, localtime ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ 
        // ¿ì¸®°¡ ½±°Ô ÀÐÀ» ¼ö ÀÖ´Â ½Ã°£À¸·Î º¯°æÇß´Ù.     
        the_time = utmpfp->ut_time; 
        tm_ptr = localtime(&the_time); 
        sprintf(now_local_time, "%d/%02d/%02d %02d:%02d", 
                                tm_ptr->tm_year+1900, tm_ptr->tm_mon+1, 
                                tm_ptr->tm_mday, tm_ptr->tm_hour, 
                                tm_ptr->tm_min); 
 
        host_ip = utmpfp->ut_host; 
        if (strlen(host_ip) < 1) 
            host_ip = "-"; 
        if (utmpfp->ut_type == USER_PROCESS) 
        { 
            printf("%-12s %-8s %-12s %s   %s\n", 
                        utmpfp->ut_user,  
                        utmpfp->ut_line, 
                        host_ip, 
                        now_local_time, 
                        get_current_procname(get_current_pid(utmpfp->ut_pid))); 
        } 
    } 
 
 
    return 1; 
} 
 
int get_current_pid(int login_pid) 
{ 
    int  fd; 
    char buf[255]; 
    char stat_file[25]; 
    int  field_num = 7; 
    int  i, j; 
    int  buf_index; 
    char current_pid[11]; 
 
    memset(buf, '\0', 255); 
    sprintf(stat_file, "/proc/%d/stat", login_pid); 
 
    if ((fd = open(stat_file, O_RDONLY)) == -1) 
    { 
        printf("error\n"); 
        return -1; 
    } 
 
    read(fd, buf, 255); 
    j = 0; 
    for (i = 0, buf_index=0; i < 255; i++) 
    { 
        if (buf[i] == ' ') 
        { 
            j++; 
        } 
        else 
        { 
            if (j == field_num) 
            { 
                current_pid[buf_index] = buf[i]; 
                buf_index++; 
            } 
            if (j > field_num) 
                break; 
        } 
    } 
    close(fd); 
    return atoi(current_pid); 
} 
     
char *get_current_procname(int proc_num) 
{    
    char *buf; 
    char proc_file[256]; 
     
    buf = (char *)malloc(256); 
    memset(buf, '\0', 256); 
 
    memset(proc_file, '\0', 256); 
    sprintf(proc_file, "/proc/%d/exe", proc_num); 
 
    readlink(proc_file, buf, 256); 
    return buf; 
} 
 
´ÙÀ½Àº ½ÇÇà½ÃŲ °á°ú´Ù.
$ ./myw  
yundream     :0       -            2008/01/17 22:59    
yundream     pts/1    :0           2008/01/17 22:59    
yundream     pts/2    :0           2008/01/17 23:17    
 

8 ȯ°æº¯¼ö

ȯ°æº¯¼ö´Â ÇØ´ç ÇÁ·Î¼¼½º¿¡ Àü¿ªÀûÀ¸·Î ¼³Á¤µÈ º¯¼öµé·Î, ÁÖ·Î ÇÁ·Î±×·¥ ½ÇÇàȯ°æÀ» ¼³Á¤Çϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. ¿ø·¡ÀÇ ¸ñÀûÀº ÇÁ·Î±×·¥ ½ÇÇàȯ°æÀ» ¼³Á¤Çϱâ À§ÇÔÀÌÁö¸¸, ƯÈ÷ ½©¿¡¼­ »ç¿ëµÉ °æ¿ì »ç¿ëÀÚ °èÁ¤ÀÇ È¯°æ¼³Á¤°ú ¹ÐÁ¢ÇÑ °ü·ÃÀÌ Àֱ⠶§¹®¿¡, À̹øÀå¿¡¼­ ¼³¸íÀ» ÇÏ°í ³Ñ¾î°¡·Á°í ÇÑ´Ù.

ȯ°æº¯¼ö´Â ÇÁ·Î±×·¥¿¡¼­ »ç¿ëÇÏ´Â º¯¼ö¿Í ¸¶Âù°¡Áö·Î key=valueÀÇ Çü½ÄÀ» °¡Áø´Ù.

½©¿¡¼­´Â env¸í·ÉÀ» ÀÌ¿ëÇØ¼­ ¼³Á¤µÈ ¸ðµç ȯ°æº¯¼öÀÇ °ªÀ» Àоî¿Ã ¼ö ÀÖ´Ù.
# env 
SSH_AGENT_PID=6510 
KDE_MULTIHEAD=false 
MALLOC_CHECK_=2 
SHELL=/bin/bash 
TERM=xterm 
... 
... 
LANG=ko_KR.UTF-8 
GNOME_KEYRING_PID=6453 
KDE_SESSION_UID=1000 
GDM_LANG=ko_KR.UTF-8 
KDEDIRS=/usr/lib/kde4 
GDMSESSION=kde4 
HISTCONTROL=ignoreboth 
SHLVL=2 
 
¶ÇÇÑ echo ¸¦ ÀÌ¿ëÇØ¼­ ȯ°æº¯¼öÀÇ °ªÀ» Àоî¿Ã ¼öµµ ÀÖ´Ù.
# echo $LANG 
ko_KR.UTF-8 
 

»ç¿ëÀÚ Å͹̳Î, ¾ð¾î, KDE¿Í GNOMEµîÀÇ ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ »ç¿ëÇÒ ¿©·¯°¡Áö ȯ°æº¯¼ö°¡ Á¤ÀǵǾî ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù.

ȯ°æº¯¼ö´Â ÇÁ·Î¼¼½º°¡ ÀÚ½ÄÇÁ·Î¼¼½º¸¦ ¸¸µé ¶§, ÀÚ½ÄÇÁ·Î¼¼½º¿¡°Ô ±×´ë·Î Àü´ÞµÈ´Ù. ¿¹¸¦µé¾î¼­ ½©¿¡¼­ w3mÀ̶ó´Â ÇÁ·Î±×·¥À» ½ÇÇà½ÃŲ´Ù¸é, ȯ°æº¯¼ö LANG°¡ w3m¿¡ ±×´ë·Î º¹»çµÇ¾î¼­ Àü´ÞÀÌ µÈ´Ù. ±×·¯¸é w3mÇÁ·Î±×·¥Àº ¹®ÀÚ¿­À» ¸¸³µÀ»¶§, ¾î¶»°Ô ÀÎÄÚµù ½ÃÄÑ¾ß ÇÒÁö¸¦ ¾Ë ¼ö ÀÖ°Ô µÈ´Ù. À§ÀÇ °æ¿ì UTF-8·Î ÀÎÄÚµù/µðÄÚµùÀ» ÇÏ°Ô µÉ °ÍÀÌ´Ù.

8.1 Áß¿ä ȯ°æ º¯¼öµé

»ç¿ëÀÚ°¡ ·Î±×ÀÎÀ» ÇÏ¸é ±âº»ÀûÀΠȯ°æº¯¼öµéÀÌ ¼³Á¤ÀÌ µÇ´Âµ¥, ±×Áß Áß¿äÇÑ È¯°æº¯¼öµéÀ» Á¤¸®ÇØ º¸¾Ò´Ù.
ȯ°æº¯¼öÀ̸§ ¼³¸í
SHELL »ç¿ëÁßÀÎ ½© ÇÁ·Î±×·¥
PATH ½ÇÇàÇÒ ÇÁ·Î±×·¥À» ãÀ» °æ·Î |
HOME Ȩµð·ºÅ丮
UID »ç¿ëÀÚÀÇ uid
GID »ç¿ëÀÚÀÇ gid
SHLVL ½© Level (½©ÀÇ ±íÀÌ)
USERNAME »ç¿ëÀÚÀÇ ID
TERM »ç¿ëÀÚÀÇ Å͹̳Î
PWD ÇöÀç ÀÛ¾÷µð·ºÅ丮ÀÇ À§Ä¡
HISTSIZE È÷½ºÅ丮ÀÇ Å©±â
HOSTNAME È£½ºÆ® À̸§

8.2 ȯ°æº¯¼ö °ª Àбâ

¸®´ª½º¿¡¼­´Â getenv(3)ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­, ¿øÇϴ ȯ°æº¯¼öÀÇ °ªÀ» Àоî¿Ã ¼ö ÀÖ´Ù.
#include <stdlib.h> 
 
char *getenv(const char *name); 
 
  • name : ȯ°æº¯¼öÀÇ À̸§
´ÙÀ½Àº ȯ°æº¯¼ö LANG ÀÇ °ªÀ» Àоî¿À´Â °£´ÜÇÑ ÇÁ·Î±×·¥ÀÌ´Ù.
#include <stdlib.h> 
#include <stdio.h> 
 
int main(int argc, char **argv) 
{ 
  char *value = NULL; 
  value = getenv("LANG"); 
  printf("LANG is %s\n", value); 
  return 0; 
} 
 

ȯ°æº¯¼ö´Â ÇÁ·Î±×·¥ÀÌ ½ÇÇà½Ã ½ºÅÿµ¿ª¿¡ º¹»ç°¡ µÇ´Âµ¥, ±×·¯¹Ç·Î C¿¡¼­´Â Æ÷ÀÎÅ͸¦ ÀÌ¿ëÇØ¼­ Á¢±ÙÇÒ ¼ö ÀÖµµ·Ï ¹æ¹ýÀ» Á¦½ÃÇϰí ÀÖ´Ù. ȯ°æº¯¼ö°¡ ÀúÀåµÈ ½ºÅÃÀÇ ÁÖ¼Ò´Â main ÇÔ¼öÀÇ 3¹øÂ° ÀÎÀÚ¸¦ ÅëÇØ¼­ °¡Á®¿Ã ¼ö ÀÖ´Ù.
#include <stdio.h> 
 
int main(int argc, char **argv, char **env) 
{ 
  while(*env != NULL) 
  { 
    printf("%s\n", *env); 
    *env++; 
  } 
} 
 
½©ÀÇ env¸¦ ½ÇÇà½ÃŲ°Í°ú µ¿ÀÏÇÑ °á°ú¸¦ º¸¿©ÁÜÀ» È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

8.3 ȯ°æº¯¼ö °ª ¼³Á¤

setenv(3)¸¦ ÀÌ¿ëÇϸé, ȯ°æº¯¼öÀÇ °ªÀ» º¯°æÇÒ ¼ö ÀÖ´Ù. À̶§ º¯°æµÈ ȯ°æº¯¼öÀÇ °ªÀº ÀڽŰú ÀÚ½ÅÀÇ ÀÚ½ÄÇÁ·Î¼¼½º¿¡¸¸ À¯È¿ÇÏ´Ù. ȯ°æº¯¼ö´Â ÀÚ½ÄÇÁ·Î¼¼½º¿¡°Ô º¹»çµÉ »ÓÀÌÁö, °øÀ¯Çؼ­ »ç¿ëÇÏ´Â°Ô ¾Æ´Ï±â ¶§¹®ÀÌ´Ù.
#include <stdlib.h> 
int setenv(const char *name, const char *value, int overwrite); 
 
  1. name
    ȯ°æº¯¼öÀÇ À̸§
  2. value
    ȯ°æº¯¼öÀÇ °ª
  3. overwrite
    ȯ°æº¯¼öÀÇ À̸§ÀÌ À̹ÌÁ¸ÀçÇÒ °æ¿ì °ªÀ» µ¤¾î¾µ°ÍÀÎÁö¸¦ °áÁ¤ÇÑ´Ù. 0À̶ó¸é µ¤¾î¾²Áö ¾Ê´Â´Ù.

#include <unistd.h> 
 
int main() 
{ 
    setenv("TEST", "YUNDREAM", 1); 
    execl("/bin/bash", "bash", NULL); 
} 
 
setenv¸¦ ÀÌ¿ëÇØ¼­ TEST¶ó´Â ȯ°æº¯¼ö¸¦ Á¤ÀÇ Çß´Ù. ±×´ÙÀ½ execlÀ» ÀÌ¿ëÇØ¼­ »õ·Î¿î bash ½©À» ½ÇÇàÇß´Ù. ÀÌÁ¦ echo $TEST ¸¦ ÀÌ¿ëÇØ¼­ TEST¶ó´Â ȯ°æº¯¼ö°¡ ¼³Á¤µÇ¾úÀ½À» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ÇÁ·Î±×·¥ÀÇ À̸§Àº setenv·Î ÇϰڴÙ.
$ echo $TEST 
 
$ echo $SHLVL 
2 
$ ./setenv 
$ echo $TEST 
YUNDREAM 
$ echo $SHLVL 
3 
$ exit 
exit 
$ echo $TEST 
 
$ echo $SHLVL 
2 
 
ȯ°æº¯¼ö°¡ °øÀ¯µÇ´Â°Ô ¾Æ´Ñ º¹»çµÇ´Â °ÍÀ̶ó´Â°É È®½ÇÈ÷ Å×½ºÆ® ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¶ÇÇÑ SHLVLÀ» ÀÌ¿ëÇØ¼­ ½©ÀÇ ±íÀ̸¦ È®ÀÎÇÒ ¼öµµ ÀÖ´Ù.
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.