📄 ladmin
字号:
#!/usr/bin/perl
##########################################################################
# Athena偺儘僌僀儞僒乕僶乕曐庣僣乕儖 Ver.1.05
#
# 丂婲摦拞偺Athena偺login.exe偵愙懕偟偰傾僇僂儞僩偺曐庣傪峴偆僣乕儖.
# 丂傾僇僂儞僩偺捛壛丄嶍彍丄僷僗儚乕僪偺曄峏丄儕僗僩昞帵偑偱偒傑偡.
#
##########################################################################
#----------------------------------愢柧彂---------------------------------
# 愝掕
# 埲壓偺曄悢傪惓偟偔愝掕偟傑偡丅
# 乮儘僌僀儞嶪偺IP丄億乕僩丄娗棟幰僷僗儚乕僪乯
#-------------------------------------------------------------------------
my($loginserverip)="127.0.0.1"; #儘僌僀儞嶪偺IP
my($loginserverport)=6900; #儘僌僀儞嶪偺億乕僩
my($loginserveradminpassword)="admin"; #儘僌僀儞嶪偺娗棟幰僷僗儚乕僪
my($connecttimeout)=10; # 愙懕僞僀儉傾僂僩(昩)
my($passenc)=2; # 僷僗儚乕僪埫崋壔僞僀僾
#-------------------------------------------------------------------------
# 僾儘儞僾僩偵傛傞嶌嬈
# 丂堷悢側偟偱婲摦偡傞偲僾儘儞僾僩偑偱傑偡丅僐儅儞僪偼屻弎丅
# 丂僐儅儞僪偼嵟弶偺悢暥帤偱傕偐傑偄傑偣傫
# <椺> q <= quit , li <= list , pass <= passwd 乧側偳
#
# 丂僐儅儞僪儕僗僩
# quit 廔椆
#
# list [start_id [end_id]] 傾僇僂儞僩儕僗僩昞帵
# start_id,end_id偼嫟偵徣棯壜擻偱偡丅
# <椺> list 10 9999999
# 傾僇僂儞僩柤偱偺専嶕側偳偼偱偒傑偣傫
#
# search keyword 傾僇僂儞僩専嶕
# search --regex keyword 傾僇僂儞僩惓婯昞尰専嶕
# 僉乕儚乕僪偑儅僢僠偡傞傾僇僂儞僩偺儕僗僩傪昞帵偟傑偡
#
# add userid gender passwd 傾僇僂儞僩捛壛
# ID,惈暿,pass偱偡丅惈暿偼 M偐F偱偡(嵟弶偺侾暥帤偱敾抐)
# <椺> add testname Male testpass
# passwd傪徣棯偡傞偲僉乕儃乕僪偐傜僄僐乕柍偟偱僞僀僾偱偒傑偡
#
# del userid 傾僇僂儞僩嶍彍
# 寈崘偑偱傞偺偱偦偙偱y傪擖椡偡傞偲嶍彍偟傑偡
#
# passwd userid newpassword 傾僇僂儞僩僷僗儚乕僪曄峏
# newpassword傪徣棯偡傞偲僉乕儃乕僪偐傜僞僀僾偱偒傑偡
#
# state userid newstate 傾僇僂儞僩偺僶儞忬懺曄峏
# newstate偑b側傜僶儞丄u傑偨偼n側傜僶儞夝彍偱偡
#
# help 娙扨側僿儖僾僥僉僗僩昞帵
#
#-------------------------------------------------------------------------
# 僔僃儖偺扨堦僐儅儞僪偲偟偰偺嶌嬈
# ./ladmin --mode param1 ...
#
# --add userid gender passwd 傾僇僂儞僩偺捛壛(-a偱傕壜)
# --del userid 傾僇僂儞僩偺嶍彍(-d)
# --passwd userid newpasswd 僷僗儚乕僪偺曄峏(-p)
# --list start_id end_id 傾僇僂儞僩儕僗僩昞帵(-l)
# --search keyword 傾僇僂儞僩専嶕(-s)
# --search --regex keyword 惓婯昞尰専嶕(-s -e)
# --state userid newstate 僶儞忬懺曄峏(-t)
# <椺> ./ladmin --addaccount testname Male testpass
#
#-------------------------------------------------------------------------
# 僔僃儖偺暋悢偺僐儅儞僪偲偟偰偺嶌嬈
# 偁傜偐偠傔 --makesymlink 傪巜掕偟偰婲摦偟丄僔儞儃儕僢僋儕儞僋傪
# 嶌惉偟偰偍偒丄偦偺僼傽僀儖偱婲摦偟傑偡丅
# 屆偄Ver偺addaccount偼嶍彍偟偰抲偄偰偔偩偝偄丅
#
# addaccount userid gender passwd 傾僇僂儞僩偺捛壛
# delaccount userid 傾僇僂儞僩偺嶍彍
# passwdaccount userid newpasswd 僷僗儚乕僪偺曄峏
# listaccount start_id end_id 傾僇僂儞僩儕僗僩昞帵
# searchaccount keyword 傾僇僂儞僩専嶕
# searchaccount --regex keyword 傾僇僂儞僩惓婯昞尰専嶕
# stateaccount userid newstate 僶儞忬懺曄峏
# <椺> ./addaccount testname Male testpass
#
#-------------------------------------------------------------------------
# 埫崋壔偵偮偄偰
# 丂Digest::MD5儌僕儏乕儖偑昁梫偱偡丅Digest::MD5偑撉傒崬傔側偄応崌丄
# 帺摦揑偵埫崋壔偟側偄儌乕僪($passenc=0)偵側傞偺偱丄儌僕儏乕儖偑側偔偰傕
# ladmin帺懱偼摦嶌偟傑偡丅乮埫崋壔偼峴傢傟傑偣傫偑乯
# 丂偪側傒偵Cygwin偩偲Digest::MD5偼嵟弶偐傜擖偭偰偄傞傛偆偱偡丅
#
#-------------------------------------------------------------------------
# UNIX宯OS偱偺巊梡偵偮偄偰
# 丂僐儅儞僪偲偟偰幚峴偡傞偵偼僼傽僀儖偵幚峴尃偑昁梫偱偡丅傑偨夵峴僐乕僪傪
# 曄峏偡傞昁梫偑偁傝傑偡丅perl傪捈愙婲摦偡傞側傜昁梫偁傝傑偣傫丅
# 丂幚峴偵偼娭學偁傝傑偣傫偑丄愢柧傗僐儊儞僩偼僔僼僩JIS偱彂偄偰偄傞偺偱
# 擔杮岅僄儞僐乕僪傪EUC-JP偵偟偰偔偩偝偄丅
# <僐儅儞僪偺弨旛偺椺>
# $ mv ladmin ladmin_org
# $ nkf -eLu ladmin_org > ladmin
# $ chmod 700 ladmin
# <Perl傪捈愙婲摦偡傞椺>
# $ perl ladmin
#
##########################################################################
use strict;
use IO::Socket;
use Term::ReadLine;
eval { use POSIX qw(:termios_h); };
eval { use Digest::MD5 qw(md5); } if $passenc;
$passenc=0 if($@);
my($ver)="1.05";
# termios偺弶婜張棟
my($termios,$orgterml,$termlecho,$termlnoecho)=();
eval{
$termios=POSIX::Termios->new();
$termios->getattr(fileno(STDIN));
$orgterml=$termios->getlflag();
$termlecho=ECHO | ECHOK | ICANON;
$termlnoecho=$orgterml & ~$termlecho;
};
# 僷僗儚乕僪擖椡梡
sub cbreak(){
if($termios){
$termios->setlflag($termlnoecho);
$termios->setcc(VTIME,1);
$termios->setattr(fileno(STDIN),TCSANOW);
}
}
# 暅婣
sub cooked(){
if($termios){
$termios->setlflag($orgterml);
$termios->setcc(VTIME,0);
$termios->setattr(fileno(STDIN),TCSANOW);
}
}
END{ cooked() }
print "Athena login-server administration tool Ver.$ver\n";
# 僔儞儃儕僢僋儕儞僋嶌惉
if( $ARGV[0] eq "--makesymlink" ){
symlink $0,"addaccount";
symlink $0,"delaccount";
symlink $0,"passwdaccount";
symlink $0,"listaccount";
symlink $0,"searchaccount";
symlink $0,"stateaccount";
print "Symbolic link created.\n";
exit(0);
}
# 僒乕僶乕偵愙懕偡傞
my($so,$er)=();
eval{
$so=IO::Socket::INET->new(
PeerAddr=> $loginserverip,
PeerPort=> $loginserverport,
Proto => "tcp",
Timeout => $connecttimeout) or $er=1;
};
if($er || $@){
print "\nCant connect to login server [${loginserverip}:$loginserverport] !\n";
exit(2);
}
# 儘僌僀儞梫媮
if($passenc==0){
print $so pack("v3a24",0x7918,30,0,$loginserveradminpassword);
$so->flush();
}else{
print $so pack("v",0x791a);
$so->flush();
my($buf)=readso(4);
if(unpack("v",$buf)!=0x01dc){
print "login error. (md5key creation failed)\n";
}
$buf=readso(unpack("x2v",$buf)-4);
my($md5bin)=md5( ($passenc==1)?$buf.$loginserveradminpassword:
$loginserveradminpassword.$buf );
print $so pack("v3a16",0x7918,22,$passenc,$md5bin);
$so->flush();
}
# 曉摎懸偪
my($buf)=readso(3);
if(unpack("v",$buf)!=0x7919 || unpack("x2c",$buf)!=0 ){
print "login error. (password incorrect ?)\n";
exit(4);
}
print "logged on.\n";
# 僾儘儞僾僩柍偟偺張棟
if( $0=~/addaccount$/ ||
(($ARGV[0] eq "-a" || $ARGV[0] eq "--add") && ((shift @ARGV),1)) ){
my($r)=addaccount($ARGV[0],$ARGV[1],$ARGV[2]);
quit();
exit($r);
}elsif( $0=~/delaccount$/||
(($ARGV[0] eq "-d" || $ARGV[0] eq "--del") && ((shift @ARGV),1)) ){
my($r)=delaccount($ARGV[0]);
quit();
exit($r);
}elsif( $0=~/passwdaccount$/||
(($ARGV[0] eq "-p" || $ARGV[0] eq "--passwd") && ((shift @ARGV),1)) ){
my($r)=changepasswd($ARGV[0],$ARGV[1]);
quit();
exit($r);
}elsif( $0=~/listaccount$/||
(($ARGV[0] eq "-l" || $ARGV[0] eq "--list") && ((shift @ARGV),1)) ){
my($r)=listaccount(int($ARGV[0]),int($ARGV[1]));
quit();
exit($r);
}elsif( $0=~/searchaccount$/||
(($ARGV[0] eq "-s" || $ARGV[0] eq "--search") && ((shift @ARGV),1)) ){
my($r)=searchaccount($ARGV[0],$ARGV[1]);
quit();
exit($r);
}elsif( $0=~/stateaccount$/||
(($ARGV[0] eq "-t" || $ARGV[0] eq "--state") && ((shift @ARGV),1)) ){
my($r)=changestate($ARGV[0],$ARGV[1]);
quit();
exit($r);
}
my($term)= new Term::ReadLine "ladmin";
# 儘僌僀儞偱偒偨偺偱僾儘儞僾僩偺儖乕僾
while(1){
# 僾儘儞僾僩昞帵偲擖椡
my($cmd)=$term->readline("ladmin> ");
chomp $cmd;
$cmd=~s/\x1b\[\d*\w//g;
$cmd=~s/[\x00-\x1f]//g;
my(@cmdlist)=split /\s+/,$cmd;
$cmdlist[0]="help" if( $cmdlist[0] eq "?" );
# 僐儅儞僪夝愅
eval{
if("help"=~/^\Q$cmdlist[0]/ ){
print << "EOD";
add username gender password -- add account
del username -- delete account
passwd username new_password -- change password of account
list [start_id [end_id] ] -- list account
search expr -- search account
search -r expr -- search account by regular-expression
state username newstate -- change status of account (bann)
help -- this help
quit -- quit
EOD
}elsif("quit"=~/^\Q$cmdlist[0]/){
last;
}elsif("add"=~/^\Q$cmdlist[0]/){
addaccount($cmdlist[1],$cmdlist[2],$cmdlist[3]);
}elsif("del"=~/^\Q$cmdlist[0]/){
delaccount($cmdlist[1]);
}elsif("passwd"=~/^\Q$cmdlist[0]/){
changepasswd($cmdlist[1],$cmdlist[2]);
}elsif("list"=~/^\Q$cmdlist[0]/ || $cmdlist[0] eq "ls"){
listaccount(int($cmdlist[1]),int($cmdlist[2]));
}elsif("search"=~/^\Q$cmdlist[0]/){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -