본문 바로가기

계정 대량 발급 perl 스크립트

MintState 2008년 11월 17일 오후 3:47 조회 16527

계정 대량 발급 perl 스크립트

학교와 같은 곳에 계시는 분들이 적게는 몇백에서 몇천까지의 계정을 일괄적으로 발급하길 원하시는 것 같은데, 그 기능을하는 툴이 없는것 같아 오늘 perl 스크립트로 만들어봤습니다.

실행방법은 data 파일(ID, PASS)을 작성한 후, perl 스크립트내의 그룹, 비밀번호파일, 비밀번호지정여부, 홈계정(/home/ID)발급 여부, 사용자 ID와 비밀번호정보 파일명 등의
몇가지 설정을 필요에 따라 고칩니다.
그후 perl 스크립트를 실행하면 됩니다.

-- 테스트결과 --
계정 추가, passwd 지정 수량 : 2,000개
사양 : Pentium-75, 32M, Linux kernel 2.2.2
소요시간(time 명령 결과) :
real 13m16.406s
user 6m75.960s
sys 1m17.550s

계정 기본파일(/etc/skel)은 0byte 크기의 파일하나만 달랑 넣고 시험했습니다.

# ls -al /etc/skel 
total 5 
drwxr-xr-x   2 root     root         1024 Mar  3 12:35 ./ 
drwxr-xr-x  29 root     root         4096 Mar  3 14:29 ../ 
-rw-r--r--   1 root     root            0 Mar  3 12:35 chek 

 

아래는 data 파일(사용자 ID와 비밀번호정보 파일) 예제입니다.

# 파일 규칙 
# ID  PASSWORD 
# 위치에 상관없이 공백으로 구분하여 앞은 ID, 뒤는 PASS로 보고 처리하며 
# 이 줄과 마찬가지로 최좌측이 #으로 시작되면 주석인식하여 skip 함. 

   st10001  10001 
   st10002  10002 
   st10003  10003 
   st10004  10004 
   st10005  10005 
   st10006  10006 
   st10007  10007 
   st10008  10008 
   st10009  10009 
   st10010  10010 
... 
... < 하략 > 
...  

 

스크립트입니다.

#!/usr/bin/perl 

#=====================================================# 
# 대량 계정 발급 스크립트 
# 
# lawwal@nownuri.net 
# 
# 주. password 도 지정할 경우 shadow 시스템이라면 
#     pwunconv 명령 등으로 풀어두고 해야함. 
#     다시 shadow 시스템으로 바꿀땐 pwconv 명령 사용. 
# 


# 그룹 
$group_name = "user"; 

# 비밀번호파일 
$pass_file ="/etc/passwd"; 

# 비밀번호지정여부 
$pass_dif ="Y"; 

# 홈계정(/home/ID)발급 여부 
$add_acc ="Y"; 

# 사용자 ID와 비밀번호정보 파일명 
$FILE = "add.txt"; 

#--------------------------------------------------# 

open(FILE, "$FILE") || die "File open errorn"; 
     while() { 
       chomp $_; 
       if($_ ne "") { &file_read($_); } 
      } 
close(FILE); 

if(!@user_info) { 
   print "Cancle...nn"; } 

&user_add; 

if($pass_dif eq "Y") { 
   &pass_add; } 

print "Done...nn"; 

exit; 

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

sub file_read { 

     local($input_line) = @_; 

     # 라인의 복수 공백 제거 
     $input_line =~ s/ +/ /g; 
     # 라인의 제일 앞과 뒤 공백 제거 
     $input_line =~ s/^ | $//g; 

     # 주석라인 skip 
     if($input_line =~ /^#/) { return; } 
       
     ($add_id, $add_pass) = split(/ /, $input_line); 
     push(@user_info, "$add_id|$add_pass");  # 배열화 

  } 

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

sub user_add { 

     $num = 0; 

     foreach $data(@user_info) { 
     ($add_id, $add_pass) = split(/|/, $data); 

     if($add_acc eq "Y") { $add_acc_tmp = ""; } 
       else { $add_acc_tmp = "-M"; } 

     system("/usr/sbin/useradd $add_acc_tmp $add_id -g $group_name"); 

     $num ++; 
     print "useradd : $num, $add_idn"; 
     } 
     
  } 

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

sub pass_add { 

     open(FILE, "$pass_file") || die "File open errorn"; 
       while() { 
          chomp $_; 
          ($p1, $p2, $p3, $p4, $p5, $p6, $p7) = split(/:/, $_); 

          $found = ""; 

          foreach $data(@user_info) { 
            ($add_id, $add_pass) = split(/|/, $data); 
            if($p1 eq $add_id) { 
                 $found = "ok"; 
                 $tmp = substr($add_id, 0, 2); 
                 # 어차피 임시 비밀번호일 것이므로 간단히... 
                 $add_pass = crypt($add_pass, $tmp); 
                 $result .= "$p1:$add_pass:$p3:$p4:$p5:$p6:$p7n"; 
                 last; } 

          } 
         if(!$found) { 
                 $result .= "$p1:$p2:$p3:$p4:$p5:$p6:$p7n"; } 
      } 
   
     close(FILE); 

     print "password define : ...n"; 

     # 종전파일 보존(.ori) 
     $pass_file_bak = "$pass_file" . ".ori"; 
     `cp $pass_file $pass_file_bak`; 

     open(FILE, ">$pass_file") || die "File open errorn"; 
       print FILE $result; 
     close(FILE); 

  } 

#=====================================================#
공유 X Facebook LINE QR 코드

댓글 0개

첫 댓글을 남겨보세요.