출처 : 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);
}
#=====================================================#
계정 대량 발급
학교와 같은 곳에 계시는 분들이 적게는 몇백에서 몇천까지의 계정을
일괄적으로 발급하길 원하시는 것 같은데, 그 기능을하는 툴이 없는것 같아
오늘 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);
}
#=====================================================#