Perl programming (¥²)
- Perl ½Ã½ºÅÛ µµ±¸ -

ÀÓ ´ë È£ : lawwal@way.co.kr / Way-CGI ½Ã¸®Áî °³¹ßÀÚ

 

 

    PerlÀ» ÀÌ¿ëÇؼ­ ÇÒ ¼ö ÀÖ´Â ÀÏ¿¡´Â ¹«¾ùÀÌ ÀÖÀ»±î? ±×³ª¸¶ ¸¹Àº À̵鿡°Ô ¾Ë·ÁÁø PerlÀÇ ¿ëµµ°¡ CGI °³¹ßÀÏ °ÍÀÌ´Ù. PerlÀÌ CGI °³¹ßµµ±¸·Î ºÎ°¢µÇ±â±îÁö´Â ÀÚÀ¯·Î¿î ÀÚ·áÇü, ¸·°­ÇÑ ¹®ÀÚ¿­ ó¸®, ¼Ò½ºÀÇ °ø°³¼º, CPAN µîÀ» ÅëÇØ º¸±ÞµÇ´Â dzºÎÇÑ ¸ðµâ°ú ½ºÅ©¸³Æ® µîÀÌ ¸¹Àº ±â¿©¸¦ Çß´Ù.
    À̹ø ´Ü¿ø¿¡¼­´Â CGI·Î¼­ÀÇ PerlÀÌ ¾Æ´Ï¶ó UNIX ½Ã½ºÅÛÀ» Á»´õ Æí¸®ÇÏ°Ô ´Ù·ç±â À§ÇÑ ¡®½Ã½ºÅÛ µµ±¸·Î¼­ÀÇ Perl¡¯À» ¼Ò°³Çغ¸µµ·Ï ÇÏ°Ú´Ù.

     

¥². Perl ½Ã½ºÅÛ µµ±¸

    »ç¿ëÇÏ´Â ¼­¹ö¿¡ mysqlÀÌ ¼³Ä¡µÇ¾î ÀÖ´Ù¸é mysql ¼³Ä¡°æ·Î¿¡¼­ mysql_setpermission ÇÁ·Î±×·¥À» ã¾Æº¸±â ¹Ù¶õ´Ù. ÀÌ ÇÁ·Î±×·¥Àº ´Ù¸§ ¾Æ´Ñ Perl·Î ¸¸µé¾îÁø ½Ã½ºÅÛ µµ±¸ÀÇ ÀÏÁ¾ÀÌ´Ù. ÀÌ ÇÁ·Î±×·¥Àº mysqlÀ» »ç¿ëÇÔ¿¡ ÀÖ¾î ¹ø°Å·Î¿î ÀÛ¾÷ÀÌ ¾Æ´Ò ¼ö ¾ø´Â database¿Í userÀÇ »ý¼º ¹× ±ÇÇÑÁ¶Á¤ µîÀÇ ÀÛ¾÷À» ÀÚµ¿È­ÇÑ µµ±¸ÀÌ´Ù. »Ó¸¸ ¾Æ´Ï¶ó my sqlaccess, mysql_find_rows, mysql_zap µîÀÇ ÇÁ·Î±×·¥µµ ¸¶Âù°¡Áö·Î Perl·Î ¸¸µé¾îÁø ½Ã½ºÅÛ µµ±¸ÀÇ ÀÏÁ¾ÀÌ´Ù. ÀÌ·¸µí PerlÀ» ÀÌ¿ëÇØ ½Ã½ºÅÛ µµ±¸¸¦ ¸¸µé¾îµÎ¸é ºó¹øÇÏ°Ô ¹ß»ýÇÏ´Â º¹ÀâÇÑ ÀÛ¾÷µéÀ» ÀÚµ¿È­ÇÒ ¼ö ÀÖ¾î ¼­¹ö ¿î¿µÀÚ ¹× ½Ã½ºÅÛ »ç¿ëÀÚ¿¡°Ô Æí¸®ÇÔÀ» Á¦°øÇÑ´Ù.

    Perl ¼Ò½º ÇÁ·Î±×·¥À» ½Ã½ºÅÛ µµ±¸·Î Á÷Á¢ »ç¿ëÇϱâ À§Çؼ­´Â ¾Õ¼­ ¼³¸íÇßµíÀÌ ½ÇÇà±ÇÇÑ(chmod +x)À» ºÎ¿©ÇÏ°í ¼Ò½º ù ¹ø° ÁÙ¿¡ PerlÀÇ À§Ä¡¸¦ ÁöÁ¤ÇØÁà¾ß ÇÑ´Ù. ¶ÇÇÑ Perl ¼Ò½º ÇÁ·Î±×·¥ÀÌ PATH¿¡ °É·ÁÀÖÁö ¾Ê´Ù¸é ./program °ú °°ÀÌ ½ÇÇàÇØ¾ß ÇÑ´Ù´Â Á¡À» ÀØÁö ¸»ÀÚ.

    1. Perl ¸í·ÉÇà ¿É¼Ç

    PerlÀ» ¸í·ÉÇà¿¡¼­ ½ÇÇàÇÒ °æ¿ì ¸ñÀû¿¡ µû¶ó ´Ù¾çÇÑ ¿É¼ÇÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. PerlÀÌ ½Ã½ºÅÛ µµ±¸·Î »ç¿ëµÉ ¶§ ƯÈ÷ ¿É¼ÇÀ» ÀÚÁÖ »ç¿ëÇÏ°Ô µÇ´Âµ¥, ÁÖ·Î »ç¿ëµÇ´Â ¸í·ÉÇà ¿É¼ÇÀº ´ÙÀ½°ú °°´Ù.
     

    ¿É¼Ç

    ¼³¸í

    e

    ÁÖ¾îÁø Perl ¸í·É ½ÇÇà

    p

    ÁöÁ¤ÇÑ ÆÄÀÏÀ» ´ë»óÀ¸·Î ÀÛ¾÷

    i

    ¿øº»ÆÄÀÏÀ» °á°úÆÄÀÏ·Î ´ëü

    c

    ±¸¹®°Ë»ç(¹®¹ý¿¡·¯ Á¡°Ë)

    v

    Perl ¹öÀüÁ¤º¸

    V

    Perl ¹öÀüÁ¤º¸(»ó¼¼)

    w

    °æ°í Ãâ·Â(°³¹ß°úÁ¤¿¡ ÁÖ·Î »ç¿ë)

    U

    ºñ¾ÈÀü¸ðµå, SUID Àû¿ë½Ã »ç¿ë

     

    2. ¹®ÀÚ¿­ ÀÏ°ý ġȯ

    ȸ»ç¸íÀ̳ª µµ¸ÞÀÎ, ¸ÞÀÏÁÖ¼Ò µîÀÌ ¹Ù²î¾úÀ» ¶§ ¼ö¸¹Àº ¹®¼­ÆÄÀÏ¿¡ ÀûÈù ³»¿ëÀ» ¸ðµÎ °íÄ¡±â¶õ ½¬¿î ÀÏÀÌ ¾Æ´Ï´Ù. ÇÏÁö¸¸ PerlÀ» ÀÌ¿ëÇÏ¸é ³Ê¹«µµ °£´ÜÈ÷ º¯°æ ³»¿ëÀ» ¹Ý¿µÇÒ ¼ö ÀÖ´Ù. ¾Æ·¡ ¸í·ÉÀº html È®ÀåÀÚ¸¦ Áö´Ñ ¹®¼­ÆÄÀÏ¿¡¼­ ¡°¿ìÁ¤¡±À̶ó´Â ¹®ÀÚ¿­À» ã¾Æ ¡°»ç¶û¡±À̶ó´Â ¹®ÀÚ¿­·Î ¸ðµÎ ġȯÇÏ´Â ¸í·É(Perl ¸í·ÉÇà ¿É¼Ç)ÀÌ´Ù.
     

      $ perl -pi -e ¡°s/¿ìÁ¤/»ç¶û/g¡±  *.html

     

    find ¸í·ÉÀ» ÀÌ¿ëÇϸé ÇÏÀ§ °æ·ÎÀÇ ¹®¼­µµ ÀÏ°ýÀûÀ¸·Î ġȯÇÒ ¼ö ÀÖ´Ù.
     

      $ find . -type f -name ¡°*.html¡±  \
      -exec perl -pi -e ¡°s/¿ìÁ¤/»ç¶û/g¡± {} \;

     

    3. ÆÄÀÏ¸í ´ë¼Ò¹®ÀÚ ÀÏ°ýº¯°æ

    ÆÄÀϸíÀÇ ´ë¼Ò¹®ÀÚ¸¦ ±¸ºÐÇÏÁö ¾Ê´Â ¿î¿µÃ¼Á¦(À©µµ¿ìÁî µî)¿¡¼­ »ý¼ºµÈ ÆÄÀϸíÀº ¸¹Àº ¹®Á¦¸¦ ¾ß±âÇÏ°ï ÇÑ´Ù. ƯÈ÷ HTML ¹®¼­¿¡¼­ ¸µÅ©¿À·ù¸¦ À¯¹ßÇϰųª ÆÄÀϸíÀ» ÀÔ·ÂÇÒ ¶§ ÀÔ·ÂÈ¥¼±À» °¡Áß½ÃÅ°±âµµ ÇÑ´Ù. ÇÏÁö¸¸ ´ÙÀ½ µµ±¸(recase)¸¦ ÀÌ¿ëÇϸé ÆÄÀϸíÀ» ¼Ò¹®ÀÚ ¶Ç´Â ´ë¹®ÀÚ·Î ÀÏ°ýÀûÀ¸·Î º¯°æÇÒ ¼ö ÀÖ´Ù.
     

    $ ls
    HOME.GIF LIST.GIF NEXT.GIF
    $ recase * (¶Ç´Â $ recase -l *)
    $ ls
    home.gif list.gif next.gif
    $ recase -u *
    $ ls
    HOME.GIF LIST.GIF NEXT.GIF

     

    File Name : recase

    #!/usr/bin/perl
    # »ç¿ë¹ý : recase [¿É¼Ç] [ÆÄÀÏ ¸®½ºÆ®]
    # ¿É¼Ç : -l(¼Ò¹®ÀÚ, ±âº»°ª), -u(´ë¹®ÀÚ)
    # ¿É¼Ç Á¡°Ë(¼Ò¹®ÀÚÈ­ ¶Ç´Â ´ë¹®ÀÚÈ­)
    if($ARGV[0]  =~  /-L/i) { $method=¡±L¡±; shift; }
    elsif($ARGV[0]  =~  /-U/i) { $method=¡±U¡±; shift; }
    else { $method = ¡°L¡±; }

    foreach $file (@ARGV) {
    # µð·ºÅ丮ÀÎ °æ¿ì ó¸®ÇÏÁö ¾ÊÀ½
    next if -d $file;
    ($dir, $filename)  =  $file  =~  /(.*[¡¬/¡¬¡¬])(.*)$/;
    $filename = $file if $file !~ /¡¬//;
    # º¯°æÀÌ ÇÊ¿äÇÑ ÆÄÀϸíÀÎÁö È®ÀÎ
    next if $method eq ¡°L¡± and
    $filename  !~  /[A-Z]/;
    next if $method eq ¡°U¡± and
    $filename  !~  /[a-z]/;
    # ´ë¼Ò¹®ÀÚ º¯È¯
    $filename  =~  tr/A-Z/a-z/ if $method eq ¡°L¡±;
    $filename  =~  tr/a-z/A-Z/ if $method eq ¡°U¡±;
    if(-f ¡°$dir$filename¡±) {
    # »õ·Î¿î À̸§ÀÇ ÆÄÀÏÀÌ ÀÌ¹Ì Á¸ÀçÇÏ´Â °æ¿ì
    print ¡°Already exist! : $dir$filename¡¬n¡±;
    next; }
    # ÆÄÀÏ¸í º¯°æ
    rename(¡°$file¡±, ¡°$dir$filename¡±);

     

    ƯÁ¤°æ·Î ÀÌÇÏÀÇ ¸ðµç ÆÄÀϸíÀ» ¼Ò¹®ÀÚ·Î º¯°æÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÏ¸é µÈ´Ù.
     

    $ find way-cart -type f -exec recase {} ¡¬;

     

    4. ¹®¼­Çü½Ä º¯È¯(UNIX ¡ê DOS)

    PerlÀ̳ª shell ½ºÅ©¸³Æ® ÆÄÀÏÀ» ¹ÙÀ̳ʸ®(Binary) ¸ðµå·Î Àü¼Û(FTP µî)ÇÏ¸é ½ºÅ©¸³Æ® ½ÇÇà½Ã ¿¡·¯°¡ ¹ß»ýÇÏ°ï ÇÑ´Ù. À̸¦ ±Øº¹Çϱâ À§Çؼ­´Â ÆÄÀÏÀ» ¾Æ½ºÅ°(ASCII) ¸ðµå·Î ´Ù½Ã Àü¼ÛÇÏ¸é µÇÁö¸¸, PerlÀ» ÀÌ¿ëÇØ °£´ÜÈ÷ ÇØ°áÇÒ ¼öµµ ÀÖ´Ù. ÀÌ´Â ¾Õ¼­ ¼³¸íÇÑ ¡®¹®ÀÚ¿­ ġȯ¡¯°ú µ¿ÀÏÇÑ ¿ø¸®´Ù.
     

    # DOS ¡æ UNIX ¹®¼­Çü½ÄÀ¸·Î º¯È¯
    $ perl -pi -e ¡°s/¡¬r//¡± *.cgi

    # UNIX ¡æ DOS ¹®¼­Çü½ÄÀ¸·Î º¯È¯
    $ perl -pi -e ¡°s/¡¬n/¡¬r¡¬n/¡± *.txt

     

    ¸í·É(Perl ¸í·ÉÇà ¿É¼Ç)ÀÌ ±â¾ïÇϱ⠽±Áö¸¸Àº ¾ÊÀ» Å×´Ï shell ½ºÅ©¸³Æ®·Î Çѹø ¸¸µé¾î º¸ÀÚ. ÆÄÀÏ¿¡ ½ÇÇà±ÇÇÑÀ» ºÎ¿©ÇÑ ÈÄ »ç¿ëÀÚµéÀÇ PATH¿¡ Æ÷ÇԵǾîÀÖ´Â °æ·Î(/usr/local/bin µî)¿¡ À§Ä¡Çصθé Æí¸®ÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
     

    File Name : dos2unix

    #!/bin/sh
    # DOS ¡æ UNIX ¹®¼­Çü½ÄÀ¸·Î º¯È¯
    perl -pi -e ¡°s/¡¬r//¡± $*

    File Name : unix2dos
    #!/bin/sh
    # UNIX ¡æ DOS ¹®¼­Çü½ÄÀ¸·Î º¯È¯
    perl -pi -e ¡°s/¡¬n/¡¬r¡¬n/¡± $*

     

    $ dos2unix way-board.cgi

     

    5. ÆÄÀÏ Å©±âÁ¤º¸ Ãâ·Â ¹× È°¿ë

    ´ÙÀ½Àº ÁöÁ¤ÇÑ ÆÄÀÏÀÇ Å©±â¸¦ Ãâ·ÂÇÏ´Â µµ±¸(sizeof)·Î¼­, ¾ò¾îÁø Á¤º¸´Â ´Ù¸¥ ÀÀ¿ëÇÁ·Î±×·¥¿¡¼­µµ È°¿ëÇÒ ¼ö ÀÖ´Ù.

     

    File Name : sizeof

    #!/usr/bin/perl
    # 1. ÆÄÀÏÅ×½ºÆ® ¿¬»êÀÚÁß -s(Size) ¿É¼Ç ÀÌ¿ë
    # 2. ÇϳªÀÇ ÆÄÀϸ¸ È®ÀÎÇÒ ¶§´Â
    # ´Ù¸¥ ÀÀ¿ëÇÁ·Î±×·¥¿¡¼­ È°¿ëÇÒ ¼ö ÀÖµµ·Ï
    # ÆÄÀÏÅ©±â¸¸ Ãâ·Â
    if($#ARGV eq 0) {
    print -s $ARGV[0]; exit; }
    foreach (@ARGV) {
    print ¡°$_ : ¡°, -s $_, ¡°¡¬n¡±; }

     

    $ sizeof  *.cgi
    way-admin.cgi : 46031
    way-board.cgi : 19065
    way-notice.cgi : 6264

    ±×·±µ¥ ÀÌ·± µµ±¸´Â ¾ðÁ¦ ¾²Àϱî?
    ÇÊÀÚ´Â ¸ÅÁÖ 1G byte°¡ ³Ñ´Â ÀڷḦ ¿ø°ÝÀ¸·Î ¹é¾÷ ¹Þ´Â´Ù. ±×·±µ¥ ¹é¾÷ÆÄÀÏÀÌ ÀúÀåµÉ ÄÄÇ»Å͸¦ Ç×»ó ÄÑµÑ ¼ö ¾ø´Â Ư¼öÇÑ »óȲÀÎÁö¶ó ¹é¾÷ÀÌ Á¾·áµÇ¸é ÀÚµ¿À¸·Î halt½ÃÄÑ¾ß ÇÑ´Ù.
    ¹®Á¦´Â Á¤»óÀûÀ¸·Î ¹é¾÷ÀÌ ÀÌ·ç¾îÁ³´ÂÁö ¾Ë ¼ö ¾ø´Â »óÅ¿¡¼­ ¹«Åδë°í halt½ÃÄѼ­´Â ¾ÈµÈ´Ù´Â Á¡ÀÌ´Ù. ±×·¡¼­ »ý°¢Çس½ °ÍÀº(¹°·Ð ´Ù¸¥ ¹æ¹ýÀ¸·Îµµ °¡´ÉÇÏ´Ù.) ¼ö½ÅµÈ ¹é¾÷ÆÄÀÏ Å©±â¸¦ È®ÀÎÇÏ¿© ¿øº»ÆÄÀÏ°ú µ¿ÀÏÇÑ Å©±âÀÏ °æ¿ì¸¸ halt¸í·ÉÀ» ½ÇÇàÇϵµ·Ï ÇÏ´Â °ÍÀÌ´Ù.
     

    File Name : remotebackup

      #!/bin/sh
      # »ç¿ë¹ý : remotebackup [¹é¾÷ÆÄÀÏÅ©±â]
      # ÆÄÀÏ ´Ù¿î·Îµå
      ncftpget -u way -p ¡°********¡±  ¡¬
      ¡°ftp://way.co.kr/backup/19991231.tar.gz¡±
      # ¿ÜºÎ¸í·ÉÀÎ Perl ÇÁ·Î±×·¥À» ½ÇÇàÇÏ°í
      # °á°ú¸¦ ¹Þ¾Æ¿À±â À§ÇØ Perl¿¡¼­¿Í ¸¶Âù°¡Áö·Î
      # shell ½ºÅ©¸³Æ®µµ `(¿ªµû¿ÈÇ¥)±âÈ£ »ç¿ë
      SIZE=`sizeof 19991231.tar.gz`
      # ÀÔ·ÂÇÑ ÆÄÀÏÅ©±â¿Í ¹é¾÷ ¹ÞÀº ÆÄÀÏÅ©±â ºñ±³
      if [ ¡°X$1¡± = ¡°X${SIZE}¡± ]
      # ÀÏÄ¡(Á¤»ó¹é¾÷)ÇÒ °æ¿ì ½Ã½ºÅÛ Á¾·á
      then halt
      fi

     

    6. ¼öÄ¡Á¤º¸ Äĸ¶ Ç¥±â

     

    File Name : comma

    #!/usr/bin/perl
    # »ç¿ë¹ý : comma [¼öÄ¡]
    1 while $ARGV[0]   =~   s/(¡¬d+)(¡¬d{3})/$1,$2/;
    print $ARGV[0];

     

    ÀÌ µµ±¸´Â ¶Ç ¾ðÁ¦ »ç¿ëµÉ±î? ÇÊÀÚ´Â °èÁ¤ »ç¿ëÀÚÀÇ À¥¼­¹ö ·Î±×ÆÄÀÏÀ» ÀÌ¿ëÇØ ÀÏÀÏ ÀÚ·á Àü¼Û·®À» »êÃâÇÑ´Ù. »êÃâµÈ Á¤º¸¸¦ Ãâ·ÂÇÒ ¶§ ½Äº°À» ¿ëÀÌÇÏ°Ô Çϱâ À§ÇØ ÀÌ µµ±¸¸¦ ÀÌ¿ëÇØ 3ÀÚ¸®¸¶´Ù Äĸ¶¸¦ ³Ö¾î Ãâ·ÂÇÏ°í ÀÖ´Ù.

    $ comma 1234567890
    1,234,567,890

    ¾Õ¼­ ¼Ò°³ÇÑ remotebackup°ú ¸¶Âù°¡Áö·Î shell ½ºÅ©¸³Æ® µîÀÇ ÀÀ¿ëÇÁ·Î±×·¥¿¡¼­ ¿ÜºÎ¸í·ÉÀ¸·Î comma ¸í·ÉÀ» »ç¿ëÇÏ¸é º¸±â ÁÁ°Ô ¼öÄ¡Á¤º¸¸¦ Ç¥½ÃÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

    ÆÄÀÏ Å©±â¸¦ ÆľÇÇÑ ÈÄ º¸±â ÁÁ°Ô Ãâ·ÂÇغ¸ÀÚ.

    $ comma `sizeof way-board.cgi`
    19,065

     

    7. ÆÄÀÏ ºÎºÐ Ãâ·Â

    ÀÌÁ¦ ¼Ò°³ÇÒ µµ±¸´Â ƯÁ¤ ÆÄÀÏÀÇ ÀϺκÐÀ» Ãâ·ÂÇÏ´Â µµ±¸´Ù. ¿¹¸¦ µé¾î tmp¶ó´Â ÆÄÀÏÀÇ 5¹ø° ÁÙºÎÅÍ 3ÁÙÀ» Ãâ·ÂÇÏ°íÀÚ ÇÑ´Ù¸é ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÑ´Ù.

     

    $ partprint 5 3 tmp

     

    $ cat tmp
    Line 1
    Line 2
    Line 3
    Line 4
    Line 5
    Line 6
    Line 7
    Line 8
    Line 9
    Line 10

    $ partprint 5 3 tmp

            FILE : tmp
            LINE : (from 5 to 7 / total 10)

    Line 5
    Line 6
    Line 7

     

    File Name : partprint

    #!/usr/bin/perl
    # »ç¿ë¹ý : partprint [½ÃÀÛÁÙ] [Ãâ·ÂÁÙ] [ÆÄÀÏ]
    $start = shift;
    $end = shift;
    $filename = shift;
    open(FILE, ¡°$filename¡±) or
    die ¡°Error: $filename, $!¡±;
    @File = <FILE>;
    close(FILE);
    $start --;
    $start = 0 if $start < 0;
    $end = 0 if $end < 0;
    $end  --;
    $end = $start + $end;
    print ¡°=¡± x 80, ¡°¡¬n¡±;
    print ¡°FILE : $filename¡¬n¡±;
    print ¡°LINE : ¡°;
    print ¡°(from ¡°, $start + 1, ¡° to ¡°, $end + 1,
    ¡° / total ¡°, $#File+1, ¡°)¡¬n¡±;
    print ¡°=¡± x 80, ¡°¡¬n¡±;
    @File = @File[$start .. $end];
    foreach (@File) { print $_; }

     

    8. À¥È£½ºÆà ¼­¹ö°ü¸® ½Ã½ºÅÛ

    ÀÌÁ¦ °£´ÜÇϸ鼭µµ Á¾ÇÕÀûÀÎ ±â´ÉÀ» ¼öÇàÇÏ´Â ½Ã½ºÅÛ µµ±¸¸¦ ¸¸µé¾î º¸ÀÚ. ÀÌ µµ±¸´Â ¼¼ °÷ÀÇ À¥È£½ºÆà ¾÷ü¿¡¼­ 10°³¿ù ÀüºÎÅÍ À¯¿ëÇÏ°Ô »ç¿ëµÇ°í ÀÖ´Ù. Áö¸éÀ¸·Î ¿Å±â±â ¾î·Á¿î ÀϺΠ±â´ÉÀº ¹èÁ¦ÇÏ¿´À¸¸ç, ¼Ò½º¸¦ ¼Ò°³ÇÏ°í °¢ ºÎºÐÀÇ ±â´ÉÀ» ¼³¸íÇÔÀ¸·Î½á ÀÌÇØ¿Í ÀÀ¿ëÀ» µ½°íÀÚ ÇÑ´Ù.
    ½ÇÁ¦ »ç¿ëÀ» ¿øÇÑ´Ù¸é Àӽà ¼­¹ö¸¦ ÀÌ¿ëÇØ ¿©·¯ Â÷·Ê ½ÃÇèÀ» °ÅÄ£ ÈÄ »ç¿ëÇϱ⸦ ±ÇÇϸç super user ±ÇÇÑÀ¸·Î ½ÇÇàµÇ¹Ç·Î ¼¼½ÉÇÑ ÁÖÀǸ¦ ¿äÇÑ´Ù.

    ÁÖ¿ä ±â´ÉÀº ´ÙÀ½°ú °°´Ù.
    °¡. »ç¿ëÀÚ °èÁ¤ °ü¸®
    ³ª. POP °èÁ¤ °ü¸®
    ´Ù. µð½ºÅ© ÇÒ´ç
    ¶ó. µµ¸ÞÀÎ ¼³Á¤
    ¸¶. µ¥¸ó(bind, sendmail, apache) °ü¸®

    #!/usr/bin/perl
    #=====================================
    config();
    menu();
    #=====================================

    sub config {
    # ÀÌ ·çƾÀº ½Ã½ºÅÛ¿¡¼­ »ç¿ëÇÒ ÁÖ¿ä ¼³Á¤À» ¼±¾ðÇÏ´Â
    # ºÎºÐÀÌ´Ù.

    # ±×·ì ¹× »ç¿ëÀÚ ±âº»°ªÀ¸·Î¼­
    # ÀÌ¹Ì Á¸ÀçÇÏ´Â ±×·ì ¹× »ç¿ëÀÚ¿©¾ß ÇÑ´Ù.
    # °èÁ¤ Ãß°¡½Ã ±âº» ±×·ì
    $user_basegroup = ¡°user¡±;
    # POP°èÁ¤ Ãß°¡½Ã ±âº» ±×·ì
    $pop_basegroup = ¡°pop¡±;
    # µð½ºÅ© ÇÒ´ç Ç¥º» »ç¿ëÀÚ
    $disk_baseuser = ¡°way¡±;

    # »ç¿ëÀÚ °èÁ¤ °ü¸® µî¿¡¼­ Á¶ÀÛÀÌ Çã¿ëµÇ´Â ÃÖ¼Ò UID
    $min_uid = 500;

    # »ç¿ëÀÚ¿¡°Ô ºÎ¿©ÇÒ IP ÁÖ¼Ò¸¦ ±â·ÏÇÑ´Ù.
    # Name-based Virtual Host(apache)¸¦ ÀüÁ¦·Î ÇÑ´Ù.
    $ip_address = ¡°210.123.12.1¡±;

    # ¾Æ·¡ °æ·ÎµéÀº /etc/skel¿¡ ¹Ì¸® »ý¼ºµÇ¾î ÀÖ¾î¾ß ÇÑ´Ù.
    # $ mkdir /etc/skel/public_html  /etc/skel/wwwlog
    # À¥¹®¼­ °æ·Î
    $webdir = ¡°public_html¡±;
    # À¥·Î±× °æ·Î
    $logdir = ¡°wwwlog¡±;

    # ¾Æ·¡´Â Ư¼öÇÑ °æ¿ì°¡ ¾Æ´Ñ ÇÑ º¯°æÇÒ ÇÊ¿ä°¡ ¾ø´Ù.
    # shadow ½Ã½ºÅÛÀ» »ç¿ëÇÏ´õ¶óµµ º¯°æÇÒ ÇÊ¿ä°¡ ¾ø´Ù.
    # ºñ¹Ð¹øÈ£ ÆÄÀÏ
    $pass_file = ¡°/etc/passwd¡±;
    # ±×·ìÆÄÀÏ
    $group_file = ¡°/etc/group¡±;

    # Message
    $prog_msg = ¡°[MSG] ¡°;
    }

    #=====================================

    sub menu {
    # ÀÌ ·çƾÀº ±âº» ¸Þ´ºÈ­¸éÀ» Ãâ·ÂÇÏ´Â ±â´ÉÀ» ÇÑ´Ù.

    # ½ÇÇàÀÚ°¡ super user°¡ ¾Æ´Ï¸é Á¾·áÇÑ´Ù.
    chomp($run_id = `id -u`);
    if($run_id ne ¡°0¡±) {
    print ¡°$prog_msg ½ÇÇà±ÇÇÑÀÌ ¾ø½À´Ï´Ù.(UID:$run_id)¡¬n¡±;
    exit; }

    # get_date ÇÔ¼ö¸¦ ÅëÇØ ÇöÀç ½Ã°£Á¤º¸¸¦ ¾ò´Â´Ù.
    $date_info = get_date(time);
    $date_seri = ¡°$date_info¡± . ¡°01¡±;

    # È­¸éÀ» Á¤¸®ÇÏ°í Ãâ·ÂÇÑ´Ù.
    system(¡°clear¡±);
    print  <<¡±__END__¡±;

            À¥È£½ºÆà ¼­¹ö °ü¸® ½Ã½ºÅÛ
    11. °èÁ¤ µî·Ï                      26. »ç¿ëÀÚ password ÁöÁ¤
    12. °èÁ¤ »èÁ¦                      27.
    13. °èÁ¤ Á¶È¸                      28. ÇÁ·Î¼¼¼­ Á¶È¸
    14. Àüü °èÁ¤ Á¶È¸               29. µ¥¸ó °ü¸®
    15. POP °èÁ¤ µî·Ï               30.
    16.                                    31.
    17. µð½ºÅ© ÇÒ´ç                   32.
    18. µð½ºÅ© ÇÒ´ç(¼öµ¿)           33.
    19. µð½ºÅ© ÇÒ´ç Á¶È¸            34.
    20.                                    35.
    21. µµ¸ÞÀÎ µî·Ï                   36.
    22. µµ¸ÞÀÎ Á¤º¸ °»½Å            37.
    23. µµ¸ÞÀÎ Á¤º¸ »ó¼¼Á¶È¸      38.
    24.                                    39.
    25.                                    40.
    ¡¬¡¬. EXIT
    __END__

    print ¡° ¼±Åà : ¡°;
    $choice  =  <STDIN>;
    chomp $choice;
    print ¡°-¡±  x 80, ¡°¡¬n¡±;
    # ÀÔ·ÂÇÑ ¸Þ´º¹øÈ£¿¡ µû¶ó ÇØ´çµÇ´Â ±â´ÉÀ» ¼öÇàÇÑ´Ù.
    if ($choice eq 11) { add_user(); }
    elsif ($choice eq 12) { delete_user(); }
    elsif ($choice eq 13) { query_user(); }
    elsif ($choice eq 14) { all_user_info(); }
    elsif ($choice eq 15) { pop_add(); }
    elsif ($choice eq 17) { disk_quota(); }
    elsif ($choice eq 18) { disk_quota_edit(); }
    elsif ($choice eq 19) { disk_query(); }
    elsif ($choice eq 21) { add_domain(); }
    elsif ($choice eq 22) { domain_apply(); }
    elsif ($choice eq 23) { domain_display(); }
    elsif ($choice eq 26) { pass_define(); }
    elsif ($choice eq 28) { ps_ax(); }
    elsif ($choice eq 29) { demon(); }
    elsif ($choice eq ¡°¡¬¡¬¡±) { print ¡°¡¬nbye...¡¬n¡¬n¡±; exit; }
    else { menu(); }

    }

    #=====================================

    # ¿©±â¼­ºÎÅÍ´Â ½Ã½ºÅÛ¿¡¼­ °øÅëÀûÀ¸·Î »ç¿ëµÇ´Â
    # ÇÔ¼öµéÀÌ´Ù.

    sub check {
    # ¸í·ÉÀÇ ½ÇÇàÀ» ÃÖÁ¾ÀûÀ¸·Î È®ÀÎÇϵµ·Ï ÇÏ´Â ·çƾ
    print ¡°$prog_msg È®½ÇÇմϱî? [yes/No] ¡°;
    $input  =  <STDIN>;
    chomp $input;
    if ($input  =~  /yes/i) { return; }
    else { print ¡°¡¬n$prog_msg ½ÇÇàÀ» Ãë¼ÒÇÕ´Ï´Ù. [Enter] ¡°;
    $input = <STDIN>;
    menu(); }
    }

    sub end {
    # ½ÇÇà°á°ú¸¦ Ãâ·ÂÇÏ°í ÃʱâÈ­ÇÏ´Â ·çƾ
    local ($end) = @_;
    if ($end eq ¡°¡±) { $end = ¡°Ã³¸®°¡ ¿Ï·áµÇ¾ú½À´Ï´Ù.¡±; }
    print ¡°¡¬n$prog_msg $end [Enter] ¡°;
    $input = <STDIN>;
    exec(¡°$0¡±);
    }

    sub file_error {
    # ÆÄÀÏ Á¶À۽à ¹®Á¦°¡ ¹ß»ýÇÏ¸é ¿¡·¯»ç½ÇÀ» °æ°íÇÏ´Â ·çƾlocal ($err) = @_;
    if ($err eq ¡°¡±) { $err = ¡°ÆÄÀÏ ÀúÀå ¿À·ù, $FILE¡±; }
    print ¡°=¡± x 30 . ¡° Áß´ë ¿À·ù ¹ß»ý ¡° . ¡°=¡±  x 30 . ¡°¡¬n¡±;
    print ¡° ¿À·ù ³»¿ë : $err ¡¬n¡±;
    print ¡°=¡± x 80;
    print ¡°Áß´ëÇÑ ¿À·ùÀÔ´Ï´Ù.¡±;
    print ¡° ÇØ´ç ÆÄÀÏÀ» ¸é¹ÐÈ÷ °ËÅäÇϽñ⠹ٶø´Ï´Ù.¡¬n¡±;
    exit;
    }

    sub user_check {
    # ³Ñ°Ü¹ÞÀº »ç¿ëÀÚ ID µîÀÇ Á¤º¸¸¦ ÀÌ¿ëÇØ »ç¿ëÀÚ Á¤º¸¸¦
    # ¾ò´Â ÇÔ¼ö
    local ($search_data, $search_field) = @_;
    $FILE = ¡°$pass_file¡±;
    open(FILE, ¡°$FILE¡±) || file_error(¡°ÆÄÀÏ Àб⠿À·ù, $FILE¡±);
    while($user_data = <FILE>) {
    chomp $user_data;
    @ud  =  split(¡°:¡±, $user_data);
    $search_fld  =  $search_field  - 1;
    $search_fld_data = $ud[$search_fld];
    if ($search_data eq $search_fld_data) {
    return $user_data; }
    }
    close(FILE);
    return 0;
    }

    sub group_check {
    # ³Ñ°Ü¹ÞÀº ±×·ì ID µîÀÇ Á¤º¸¸¦ ÀÌ¿ëÇØ ±×·ì Á¤º¸¸¦
    # ¾ò´Â ÇÔ¼ö
    local ($search_data, $search_field) = @_;
    $FILE = ¡°$group_file¡±;
    open(FILE, ¡°$FILE¡±) || file_error(¡°ÆÄÀÏ Àб⠿À·ù, $FILE¡±);
    while($group_data  =  <FILE>) {
    chomp $group_data;
    @gd = split(¡°:¡±, $group_data);
    $search_fld = $search_field - 1;
    $search_fld_data = $gd[$search_fld];
    if ($search_data eq $search_fld_data) {
    return $group_data; }
    }
    close(FILE);
    return 0;
    }

    sub get_date {
    # ½Ã°£Á¤º¸¸¦ ¾ò´Â ÇÔ¼ö
    local ($data) = @_;
    local ($second, $minute, $hour, $date, $month,
    $year, $weekday, $yearday, $Isdst) = localtime($data);
    $month  ++;
    $year  +=  1900;
    $month  <  10 && ($month  = ¡°0$month¡±);
    $date  <  10 && ($date  = ¡°0$date¡±);
    $hour  <  10 && ($hour  = ¡°0$hour¡±);
    $minute  <  10 && ($minute  = ¡°0$minute¡±);
    $second  <  10 && ($second  = ¡°0$second¡±);
    return ¡°$year$month$date¡±;
    }

    #=====================================

    # ¿©±â¼­ºÎÅÍ´Â ¸Þ´º¿¡ ³ª¿­µÈ ½ÇÁ¦ ÀÛ¾÷À» ¼öÇàÇÏ´Â
    # ·çƾÀÌ´Ù.

    sub add_user {
    # 11. °èÁ¤ µî·Ï
    print ¡°$prog_msg µî·ÏÇÒ »ç¿ëÀÚ ID : ¡°;
    $id  =  <STDIN>;
    chomp $id;
    if ($id eq ¡°¡±) { add_user(); }
    if ($id eq ¡°¡¬¡¬¡±) { menu(); }
    if (user_check($id, ¡°1¡±)) {
    end(¡°ÀÌ¹Ì µî·ÏµÇ¾îÀÖ´Â IDÀÔ´Ï´Ù.¡±); }
    print ¡°$prog_msg µî·ÏÇÒ »ç¿ëÀÚÀÇ ¼Ò¼Ó±×·ì¡±;
    print ¡°(default=$user_basegroup) : ¡°;
    $grp  =  <STDIN>;
    chomp $grp;
    if  ($grp eq ¡°¡±) { $grp = $user_basegroup; }
    if  ($grp eq ¡°¡¬¡¬¡±) { menu(); }
    if  (!group_check($grp, ¡°1¡±)) {
    end(¡°µî·ÏµÇÁö ¾ÊÀº GROUPÀÔ´Ï´Ù.¡±); }
    check();
    # adduser ¸í·É¿¡ -g ¿É¼ÇÀ» »ç¿ëÇØ ±×·ìÀ» ÁöÁ¤ÇÑ´Ù.
    system(¡°/usr/sbin/useradd $id -g $grp¡±);
    # À¥·Î±× °æ·ÎÀÇ ¼ÒÀ¯±ÇÀ» super user·Î ¹Ù²Û´Ù.
    system(¡°/bin/chown 0.0 /home/$id/$logdir¡±);
    end();
    }

    sub delete_user {
    # 12. °èÁ¤ »èÁ¦
    print ¡°$prog_msg »èÁ¦ÇÒ »ç¿ëÀÚ ID : ¡°;
    $id  =  <STDIN>;
    chomp $id;
    if  ($id eq ¡°¡±) { delete_user(); }
    if  ($id eq ¡°¡¬¡¬¡±) { menu(); }
    if  (!($user_data = user_check($id, ¡°1¡±))) {
    end(¡°µî·ÏµÇÁö ¾ÊÀº IDÀÔ´Ï´Ù.¡±); }
    ($ud1, $ud2, $ud3, $ud4, $ud5, $ud6, $ud7)
    =  split(¡°:¡±, $user_data);
    if  ($ud3 < $min_uid) {
    end(¡°ÇØ´ç ID¸¦ »èÁ¦ÇÒ ¼ö ¾ø½À´Ï´Ù.¡±); }
    check();
    # userdel ¸í·É¿¡ -r ¿É¼ÇÀ» ÀÌ¿ëÇØ °èÁ¤À» »èÁ¦ÇÑ´Ù.
    # ÀڷẸȣ¸¦ À§ÇØ »èÁ¦ÇÒ °èÁ¤ÀÇ È¨°æ·Î°¡ /home °æ·Î
    # ÇÏÀ§¿¡ À§Ä¡ÇÏÁö ¾ÊÀ¸¸é Ȩ°æ·Î¸¦ »èÁ¦ÇÏÁö ¾Ê´Â´Ù.
    if($ud6 =~ /^¡¬/home/) { $home_del = ¡°-r¡±; }
    system(¡°/usr/sbin/userdel $home_del $id¡±);
    end();
    }

    sub query_user {
    # 13. °èÁ¤ Á¶È¸
    # ÁöÁ¤ÇÑ »ç¿ëÀÚ¿¡ ´ëÇØ ´ÙÀ½°ú °°Àº °á°ú¸¦ Ãâ·ÂÇÑ´Ù.
    # [MSG] Á¶È¸ÇÒ »ç¿ëÀÚ ID : way
    # [MSG] ID : way (539)
    # [MSG] GROUP : user (500)
    # [MSG] HOME DIR : /home/way
    # [MSG] SHELL : /bin/bash
    print ¡°$prog_msg Á¶È¸ÇÒ »ç¿ëÀÚ ID : ¡°;
    $id  =  <STDIN>;
    chomp $id;
    if  ($id eq ¡°¡±) { query_user(); }
    if  ($id eq ¡°¡¬¡¬¡±) { menu(); }
    if  (!($user_data = user_check($id, ¡°1¡±))) {
    end(¡°µî·ÏµÇÁö ¾ÊÀº IDÀÔ´Ï´Ù.¡±); }
    ($ud1, $ud2, $ud3, $ud4, $ud5, $ud6, $ud7)
    =  split(¡°:¡±, $user_data);
    $s_group  =  $ud4;
    if  (!($group_data = group_check($s_group, ¡°3¡±))) {
    end(¡°µî·ÏµÇÁö ¾ÊÀº GROUPÀÔ´Ï´Ù. (GID=$s_group)¡±); }
    ($gd1, $gd2, $gd3, $gd4) = split(¡°:¡±, $group_data);
    print ¡°$prog_msg ID : $id ($ud3)¡¬n¡±;
    print ¡°$prog_msg GROUP : $gd1 ($s_group)¡¬n¡±;
    p

    rint ¡°$prog_msg HOME DIR : $ud6¡¬n¡±;
    print ¡°$prog_msg SHELL : $ud7¡¬n¡¬n¡±;
    end(¡°Á¶È¸°¡ ¿Ï·áµÇ¾ú½À´Ï´Ù.¡±);
    }

    sub all_user_info {
    # 14. Àüü °èÁ¤ Á¶È¸
    # ºñ¹Ð¹øÈ£ ÆÄÀÏÀ» Ãâ·ÂÇÑ´Ù.
    $FILE = ¡°$pass_file¡±;
    open(FILE, ¡°$FILE¡±) || file_error(¡°ÆÄÀÏ Àб⠿À·ù, $FILE¡±);
    while($user_data  =  <FILE>) {
    chomp $user_data;
    @ud = split(¡°:¡±, $user_data);
    $search_fld_data = $ud[2];
    if ($search_fld_data > =  $min_uid ) {
    $print_data .= ¡°$user_data¡¬n¡±; }
    }
    close(FILE);
    print $print_data;
    end(¡°Á¶È¸°¡ ¿Ï·áµÇ¾ú½À´Ï´Ù.¡±);
    }

    sub pop_add {
    # 15. POP °èÁ¤ µî·Ï
    print ¡°$prog_msg µî·ÏÇÒ POP ID : ¡°;
    $id  =  <STDIN>;
    chomp $id;
    if  ($id eq ¡°¡±) { pop_add(); }
    if  ($id eq ¡°¡¬¡¬¡±) { menu(); }
    if  (user_check($id, ¡°1¡±)) {
    end(¡°ÀÌ¹Ì µî·ÏµÇ¾îÀÖ´Â IDÀÔ´Ï´Ù.¡±); }
    print ¡°$prog_msg µî·ÏÇÒ »ç¿ëÀÚÀÇ ¼Ò¼Ó±×·ì¡±;
    print ¡°(default=$pop_basegroup) : ¡°;
    $grp = <STDIN>;
    chomp $grp;
    if  ($grp eq ¡°¡±) { $grp = $pop_basegroup; }
    if  ($grp eq ¡°¡¬¡¬¡±) { menu(); }
    if  (!group_check($grp, ¡°1¡±)) {
    end(¡°µî·ÏµÇÁö ¾ÊÀº GROUPÀÔ´Ï´Ù.¡±); }
    check();
    # POP °èÁ¤Àº noshellÀ̶ó´Â °£´ÜÇÑ ½©½ºÅ©¸³Æ®¸¦
    # ±âº» shell·Î ÁöÁ¤ÇÑ´Ù.

    File Name : /usr/local/bin/noshell
    #!/bin/sh
    echo
    echo ¡° ============================= ¡°
    echo ¡° ÇöÀç Á¢¼ÓÇϽŠID´Â¡±
    echo ¡° TELNET, FTP Á¢¼ÓÀÌ Çã¿ëµÇÁö¡±
    echo ¡° ¾Ê½À´Ï´Ù.¡±
    echo ¡° ============================= ¡°
    echo

    system(¡°/usr/sbin/useradd $id -g $grp -M  ¡¬¡¬
    -s /usr/local/bin/noshell -d /¡±);
    end();
    }

    sub disk_quota {
    # 17. µð½ºÅ© ÇÒ´ç
    # quota ±â´ÉÀ» ÀÌ¿ëÇØ »ç¿ëÀÚÀÇ µð½ºÅ©¸¦ ÇÒ´çÇÑ´Ù.
    print ¡°$prog_msg µð½ºÅ©¸¦ ÇÒ´çÇÒ »ç¿ëÀÚ ID : ¡°;
    $id  =  <STDIN>;
    chomp $id;
    if  ($id eq ¡°¡±) { disk_quota(); }
    if  ($id eq ¡°¡¬¡¬¡±) { menu(); }
    if  (!user_check($id, ¡°1¡±)) {
    end(¡°µî·ÏµÇÁö ¾ÊÀº IDÀÔ´Ï´Ù.¡±); }
    print ¡°$prog_msg Ç¥º» »ç¿ëÀÚ ID(default:$disk_baseuser) : ¡°;
    $id_2  =  <STDIN>;
    chomp $id_2;
    if  ($id_2 eq ¡°¡±) { $id_2 = $disk_baseuser; }
    if  ($id_2 eq ¡°¡¬¡¬¡±) { menu(); }
    if  (!user_check($id_2, ¡°1¡±)) {
    end(¡°µî·ÏµÇÁö ¾ÊÀº IDÀÔ´Ï´Ù.¡±); }
    check();
    # edquota ¸í·É¿¡ -p ¿É¼ÇÀ» ÀÌ¿ëÇØ »õ·Î ÁöÁ¤ÇÒ
    # »ç¿ëÀÚ¿¡°Ô Ç¥º» »ç¿ëÀÚÀÇ µð½ºÅ© ÇÒ´çÁ¤º¸¸¦
    # º¹»çÇÑ´Ù.(man edquota)
    system(¡°/usr/sbin/edquota -p $id_2 $id¡±);
    end();
    }

    sub disk_quota_edit {
    # 18. µð½ºÅ© ÇÒ´ç(¼öµ¿)
    print ¡°$prog_msg µð½ºÅ©¸¦ ÇÒ´çÇÒ »ç¿ëÀÚ ID : ¡°;
    $id  =  <STDIN>;
    chomp $id;
    if  ($id eq ¡°¡±) { disk_quota_edit(); }
    if  ($id eq ¡°¡¬¡¬¡±) { menu(); }
    if  (!user_check($id, ¡°1¡±)) {
    end(¡°µî·ÏµÇÁö ¾ÊÀº IDÀÔ´Ï´Ù.¡±); }
    check();
    system(¡°/usr/sbin/edquota -u $id¡±);
    end();
    }

    sub disk_query {
    # 19. µð½ºÅ© ÇÒ´ç Á¶È¸
    print ¡°$prog_msg µð½ºÅ© »ç¿ë»óȲÀ» Á¶È¸ÇÒ¡±;
    print ¡° »ç¿ëÀÚ ID(default:all) : ¡°;
    $id  =  <STDIN>;
    chomp $id;
    if  ($id eq ¡°¡±) { $id = ¡°ALL¡±; }
    if  ($id eq ¡°¡¬¡¬¡±) { menu(); }
    if  ( !user_check($id, ¡°1¡±) && ($id ne ¡°ALL¡±) ) {
    end(¡°µî·ÏµÇÁö ¾ÊÀº IDÀÔ´Ï´Ù.¡±); }
    # Àüü »ç¿ëÀÚÀÇ µð½ºÅ© Á¤º¸´Â repquota ¸í·É
    # (man repquota)À» ÀÌ¿ëÇÏ°í, °³º° »ç¿ëÀÚ´Â quota ¸í·É
    # (man quota)À» ÀÌ¿ëÇÑ´Ù.
    if($id eq ¡°ALL¡±) { system(¡°/usr/sbin/repquota -avug¡±); }
    else { system(¡°/usr/bin/quota -u $id¡±); }
    end(¡°Á¶È¸°¡ ¿Ï·áµÇ¾ú½À´Ï´Ù.¡±);
    }

    sub add_domain {
    # 21. µµ¸ÞÀÎ µî·Ï
    print ¡°$prog_msg µµ¸ÞÀÎÀ» µî·ÏÇÒ »ç¿ëÀÚ ID : ¡°;
    $id  =  <STDIN>;
    chomp $id;
    if  ($id eq ¡°¡±) { add_domain(); }
    if  ($id eq ¡°¡¬¡¬¡±) { menu(); }
    if  (!user_check($id, ¡°1¡±)) {
    end(¡°µî·ÏµÇÁö ¾ÊÀº IDÀÔ´Ï´Ù.¡±); }
    print ¡°$prog_msg µî·ÏÇÒ µµ¸ÞÀÎ(ex. abcd.co.kr) : ¡°;
    $domain  =  <STDIN>;
    chomp $domain;
    if  ($domain eq ¡°¡±) { add_domain(); }
    if  ($domain eq ¡°¡¬¡¬¡±) { menu(); }
    $domain  =~  tr/[A-Z]/[a-z]/;
    $domain  =~  s/^ +| + _$//g;
    # Áߺ¹À» ¸·±â À§ÇØ ³×ÀÓ¼­¹ö zone ÆÄÀÏÀÌ
    # ÀÌ¹Ì Á¸ÀçÇÏ´ÂÁö Á¡°ËÇÑ´Ù.
    if(-e ¡°/var/named/custom/$domain¡±) {
    print ¡°¡¬n$prog_msg ERROR, µ¿ÀÏÇÑ µµ¸ÞÀÎÀÌ¡±;
    print ¡° ÀÌ¹Ì µî·ÏµÇ¾î ÀÖ½À´Ï´Ù. [Enter] ¡°;
    $input  =  <STDIN>;
    menu(); }
    check();

    # bind 8.x´ë¿¡¼­ »ç¿ëÇÏ´Â /etc/named.conf¿¡
    # Ãß°¡ÇÒ Á¤º¸¸¦ »ý¼ºÇÑ´Ù.
    $named_conf  =  <<¡±__END__¡±;

    zone ¡°$domain¡± {
    type master;
    file ¡°custom/$domain¡±;
    };

    __END__

    # zone ÆÄÀÏ(/var/named/custom/µµ¸ÞÀθí)¿¡
    # ±â·ÏÇÒ Á¤º¸¸¦ »ý¼ºÇÑ´Ù.
    # serial ºÎºÐÀÇ $date_seri °ªÀº ÀÏÀÚÁ¤º¸¿¡
    # ¹øÈ£(01)¸¦ Á¶ÇÕÇÑ °ª(1999123101)À» »ç¿ëÇÑ´Ù.
    $named_zone  =  <<¡±__END__¡±;
            @       IN      SOA     ns.way.co.kr domain.way.co.kr.
            (
                                    $date_seri   ; serial
                                    8H ; refresh
                                    2H ; retry
                                    1W ; expiry
                                    1D ) ; minimum

                    IN      NS      ns.way.co.kr.
                    IN      NS       dns.way.co.kr.
                    IN      A       $ip_address
                    IN      MX      10 mail.way.co.kr.
        www     IN      A       $ip_address
                    IN      MX      10 mail.way.co.kr.
    __END__

    # apache ¼³Á¤ÆÄÀÏ(httpd.conf)ÀÇ VirtualHost
    # Á¤º¸¸¦ »ý¼ºÇÑ´Ù.
    # httpd.conf ÆÄÀÏ¿¡ ¹Ì¸® NameVirtualHost
    # Áö½ÃÀÚ¸¦ ¼±¾ðÇØ µÎ¾î¾ß ÇÑ´Ù.
    # Ãß°¡ÇÒ ¸ðµç µµ¸ÞÀÎÀÌ µ¿ÀÏÇÑ IP¸¦ »ç¿ëÇÏ´Â
    # Name-based Virtual Host ÀÓÀ» ÀüÁ¦·Î ÇÑ´Ù.
    $httpd_conf  =  <<¡±__END__¡±;
    <VirtualHost $ip_address>
    ServerAdmin webmaster\@$domain
    DocumentRoot /home/$id/$webdir
    ScriptAlias /cgi-bin/ /home/$id/$webdir/cgi-bin/
    ServerName www.$domain
    ServerAlias $domain www.$domain
    TransferLog /home/$id/$logdir/today.log
    ErrorLog /home/$id/$logdir/error.log
    </VirtualHost>

    __END__

    # »ý¼ºÇÑ named.conf Á¤º¸¸¦ ÆÄÀÏ¿¡ ±â·ÏÇÑ´Ù.
    $FILE = ¡°/etc/named.conf¡±;
    open(FILE, ¡°>>$FILE¡±) || file_error();
    print FILE $named_conf;
    close(FILE);

    # »ý¼ºÇÑ named zone ÆÄÀÏ Á¤º¸¸¦ ±â·ÏÇÑ´Ù.
    $FILE = ¡°/var/named/custom/$domain¡±;
    open(FILE, ¡°>$FILE¡±) || file_error();
    print FILE $named_zone;
    close(FILE);

    # Ãß°¡ÇÑ µµ¸ÞÀÎÀ¸·Î µµÂøÇÑ ¸ÞÀÏÀ» ¼ö½ÅÇÒ ¼ö ÀÖµµ·Ï
    # ¼³Á¤ÇÑ´Ù.
    $FILE = ¡°/etc/sendmail.cw¡±;
    open(FILE, ¡°>>$FILE¡±) || file_error();
    print FILE ¡°$domain¡¬n¡±;
    close(FILE);

    # µµ¸ÞÀκ°·Î °¡»ó »ç¿ëÀÚ mailÀ» »ç¿ëÇÒ ¼ö
    # ÀÖµµ·Ï virtusertableÀ» ¼³Á¤(Ãß°¡)ÇÑ´Ù.
    # @way.co.kr way¶ó°í ÁöÁ¤Çϸé way.co.kr µµ¸ÞÀÎÀ¸·Î
    # ¼ö½ÅµÇ´Â ¸ðµç ¸ÞÀÏÀº way °èÁ¤À¸·Î ¹è´ÞµÈ´Ù.
    # sendmail.cf ÆÄÀÏ¿¡ virtusertableÀ» »ç¿ëÇÒ ¼ö ÀÖ´Â
    # ¼³Á¤ÀÌ µÇ¾îÀÖ¾î¾ß ÇÑ´Ù.
    $FILE = ¡°/etc/mail/virtusertable¡±;
    open(FILE, ¡°>>$FILE¡±) || file_error();
    print FILE ¡°¡¬@$domain $id¡¬n¡±;
    close(FILE);

    # Ãß°¡ÇÑ µµ¸ÞÀÎÀÇ VirtualHostÁ¤º¸¸¦ httpd.conf
    # ÆÄÀÏ¿¡ ±â·Ï(Ãß°¡)ÇÑ´Ù.
    # apache¸¦ RedHat rpmÀ¸·Î ¼³Ä¡ÇÑ °æ¿ì¿¡´Â
    # /etc/httpd/conf/httpd.conf ÆÄÀÏ¿¡ ¹Ý¿µÇؾßÇÑ´Ù.
    $FILE = ¡°/usr/local/apache/conf/httpd.conf¡±;
    open(FILE, ¡°>>$FILE¡±) || file_error();
    print FILE ¡°$httpd_conf¡±;
    close(FILE);
    end();
    }

    sub domain_apply {
    # 22. µµ¸ÞÀÎ Á¤º¸ °»½Å
    # ¡°µµ¸ÞÀÎ µî·Ï¡±ÈÄ µî·Ï³»¿ëÀ» ¹Ý¿µÇϱâ À§ÇØ ½ÇÇàÇÑ´Ù.
    # apache¸¦ RedHat rpmÀ¸·Î ¼³Ä¡ÇÑ °æ¿ì¿¡´Â
    # /etc/rc.d/init.d/httpd ÆÄÀÏÀ» ÀÌ¿ëÇÑ´Ù.
    # restart¸¦ ÀÌ¿ëÇÒ ¼öµµ ÀÖÁö¸¸ ¿¬¼ÓµÇ´Â ½ÇÇà¿¡ ¾à°£ÀÇ
    # ¿©À¯¸¦ µÎ±â À§ÇØ 1ÃÊ °£°ÝÀ¸·Î stop°ú start¸¦ ½ÇÇàÇÑ´Ù.

    check();
    system(¡°/usr/local/apache/bin/apachectl stop¡±);
    sleep 1;
    system(¡°/usr/local/apache/bin/apachectl start¡±);
    sleep 1;
    system(¡°/etc/rc.d/init.d/named stop¡±);
    sleep 1;
    system(¡°/etc/rc.d/init.d/named start¡±);
    sleep 1;
    system(¡°/etc/rc.d/init.d/sendmail stop¡±);
    sleep 1;
    system(¡°/etc/rc.d/init.d/sendmail start¡±);
    sleep 1;
    end();
    }

    sub domain_display {
    # 23. µµ¸ÞÀÎ Á¤º¸ »ó¼¼Á¶È¸
    # µµ¸ÞÀÎÀÇ µî·Ï³»¿ë(°¢ ¼³Á¤ÆÄÀÏ)À» Á¶È¸ÇÑ´Ù.
    # vi editor¸¦ ÀÌ¿ëÇØ ¼³Á¤ÆÄÀϵéÀ» Á¶È¸ÇÏ°í
    # ÆíÁýÇÒ ¼ö ÀÖ´Ù.
    print ¡°$prog_msg Á¶È¸ÇÒ µµ¸ÞÀÎ(ex. abcd.co.kr) : ¡°;
    $domain  =  <STDIN>;
    chomp $domain;
    if  ($domain eq ¡°¡±) { domain_display(); }
    if  ($domain eq ¡°¡¬¡¬¡±) { menu(); }
    $domain_file_list = ¡°/etc/named.conf ¡°;
    $domain_file_list .= ¡°/var/named/custom/$domain ¡°;
    $domain_file_list .= ¡°/etc/sendmail.cw ¡°;
    $domain_file_list .= ¡°/etc/mail/virtusertable ¡°;
    $domain_file_list .= ¡°/usr/local/apache/conf/httpd.conf ¡°;
    check();
    system(¡°vi $domain_file_list¡±);
    end();
    }

    sub pass_define {
    # 26. »ç¿ëÀÚ password ÁöÁ¤
    print ¡°$prog_msg password¸¦ ÁöÁ¤(º¯°æ)ÇÒ »ç¿ëÀÚ ID : ¡°;
    $id  =  <STDIN>;
    chomp $id;
    if  ($id eq ¡°¡±) { pass_define(); }
    if  ($id eq ¡°¡¬¡¬¡±) { menu(); }
    if  (!($user_data = user_check($id, ¡°1¡±))) {
    end(¡°µî·ÏµÇÁö ¾ÊÀº IDÀÔ´Ï´Ù.¡±); }
    ($ud1, $ud2, $ud3, $ud4, $ud5, $ud6, $ud7)
    =  split(¡°:¡±, $user_data);
    if  ($ud3 < $min_uid) {
    end(¡°ÇØ´ç IDÀÇ password¸¦ ÁöÁ¤(º¯°æ)ÇÒ ¼ö ¾ø½À´Ï´Ù.¡±); }
    check();
    system(¡°/usr/bin/passwd $id¡±);
    end();
    }

    sub ps_ax {
    # 28. ÇÁ·Î¼¼¼­ Á¶È¸
    system(¡°/bin/ps ax¡±);
    end();
    }

    sub demon {
    # 29. µ¥¸ó °ü¸®
    # ¡°µµ¸ÞÀÎ Á¤º¸ °»½Å¡±°ú ¡°ÇÁ·Î¼¼¼­ Á¶È¸¡±¸¦ ÅëÇØ µ¥¸óÀÇ
    # ¼öµ¿ Á¶ÀÛ(stop, start, restart)ÀÌ ÇÊ¿äÇÑ °æ¿ì »ç¿ëÇÑ´Ù.
    print ¡°$prog_msg {httpd,named,sendmail}¡±;
    print ¡° {start,stop,restart}¡¬n¡±;
    print ¡°$prog_msg # ¡°;
    $cmd  =  <STDIN>;
    chomp $cmd;
    if  ($cmd eq ¡°¡±) { demon(); }
    if  ($cmd eq ¡°¡¬¡¬¡±) { menu(); }
    ($cmd, $act) = $cmd =~ /^(.*) (.*)$/;
    if($cmd  =~  /^httpd/) {
    $cmd = ¡°/usr/local/apache/bin/apachectl¡±; }
    elsif($cmd  =~  /^named/) {
    $cmd = ¡°/etc/rc.d/init.d/named¡±; }
    elsif($cmd  =~  /^sendmail/) {
    $cmd = ¡°/etc/rc.d/init.d/sendmail¡±; }
    # ÀÓÀÇÀÛµ¿À» ¸·±â À§ÇØ httpd, named, sendmail ÀÌ¿ÜÀÇ
    # µ¥¸óÀº Á¶ÀÛÇÒ ¼ö ¾øµµ·Ï ÇÑ´Ù.
    else { end(¡°Çã¿ëµÇÁö ¾Ê´Â ¸í·ÉÀÔ´Ï´Ù.¡±); }
    system(¡°$cmd $act¡±);
    demon();
    end();
    }

    À̹ø ¡°Perl ½Ã½ºÅÛ µµ±¸¡± °­Á¸¦ ³¡À¸·Î ºÎÁ·Çϳª¸¶ ¡°Perl programming¡± ¿¬À縦 ¸¶Ä£´Ù.




¡ã top

homeÀ¸·Î...