사이트 내 전체검색
[linux] 계정 대량 발급 perl 스크립트
로빈아빠
https://cmd.kr/server/321 URL이 복사되었습니다.

본문

계정 대량 발급 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); } #=====================================================#

댓글목록

등록된 댓글이 없습니다.

1,139 (12/23P)

Search

Copyright © Cmd 명령어 18.217.208.220