출처 : http://ttongfly.net/zbxe/?mid=script&document_srl=43599

계정 대량 발급  

학교와 같은 곳에 계시는 분들이 적게는 몇백에서 몇천까지의 계정을
일괄적으로 발급하길 원하시는 것 같은데, 그 기능을하는 툴이 없는것 같아
오늘 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와 비밀번호정보 파일) 예제입니다.
---------- cut hear (start) ----------
# 파일 규칙
# 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
...
... < 하략 >
...
---------- cut hear (end) ----------
 
 
 
스크립트입니다.
---------- cut hear (start) ----------
 
#!/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 error
";
    while() {
      chomp $_;
      if($_ ne "") { &file_read($_); }
      }
close(FILE);
 
if(!@user_info) {
  print "Cancle...

"; }
 
&user_add;
 
if($pass_dif eq "Y") {
  &pass_add; }
 
print "Done...

";
 
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_id
";
    }
   
  }
 
#=====================================================#
 
sub pass_add {
 
    open(FILE, "$pass_file") || die "File open error
";
      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:$p7
";
                last; }
 
          }
        if(!$found) {
                $result .= "$p1:$p2:$p3:$p4:$p5:$p6:$p7
"; }
      }
 
    close(FILE);
 
    print "password define : ...
";
 
    # 종전파일 보존(.ori)
    $pass_file_bak = "$pass_file" . ".ori";
    `cp $pass_file $pass_file_bak`;
 
    open(FILE, ">$pass_file") || die "File open error
";
      print FILE $result;
    close(FILE);
 
  }
 
#=====================================================#
Posted by [czar]
,