外部から(WEBで)新規ユーザーを作る方法。
呼び出しのサンプルHTMLは以下。
<html>
<form action="http://www.???.com:8855/" method="GET">
<br>ID <input type=text name=ID>
<br>Password <input type=text name=PAS>
<br><input type=submit value="送信">
</form>
</html>
もちろん www.???.com の部分は自分のURLに置き換え。
で、あらかじめ下のスクリプトをルートユーザーで動かしておく。
下のスクリプトがhttpd の代用品です。
スクリプトサンプル。
#!/usr/bin/perl
use Socket;
use IO::Handle;
use strict;
#######################################################
#
# auto useradd demon
#
#
# 以下は環境に合わせ変更
#
my $useradd = '/usr/sbin/useradd';
my $port = 8855;
#
#
&main;
exit;
#######################################################
## ユーザーの作成 programed by oak http://kkk.nu/
#######################################################
sub mkusers($)
{
my ($pas , $id , $err);
my $rdatas =$_[0];
my $rr=index($rdatas, "/?");
if( $rr<0)
{
print SOC " no user name \n";
return 1;
}
my ($moto,) = split( / / , substr($rdatas,$rr+2,100) );
my @a1=split( /&/ , $moto);
for(my $ii=0; @a1[$ii] ; $ii++)
{
my @a2=split( /=/ , @a1[$ii]);
$a2[1] =~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
if($a2[0] eq 'ID') {$id=$a2[1];}
if($a2[0] eq 'PAS') {$pas=$a2[1];}
}
if( !$id)
{
print SOC "Err No user names";
return -1;
}
if( !$pas)
{
print SOC "Err No password for $id";
return -1;
}
my $apas= crypt($pas, '$1$aa$');
open(UADD, "$useradd '$id' -p '$apas' 2>&1 |");
for( $err=0; ;)
{
my $errdata= <UADD>;
if(!$errdata) {last};
$err++;
print SOC "Err $errdata <br>\n";
}
close(UADD);
return $err;
}
######################################
### Main
######################################
sub main()
{
my ( $datas , $rdatas , $socoptf );
my $proto=getprotobyname('tcp');
socket(SERVER,PF_INET,SOCK_STREAM,$proto) or die;
no strict;
setsockopt(SERVER,SOL_SOCRET,SO_RESEADDR, pack("l",1));
use strict;
bind(SERVER,pack_sockaddr_in($port,INADDR_ANY)) or next;
listen(SERVER,SOMAXCONN);
while(1)
{
my $rdatas;
accept(SOC,SERVER);
SOC->autoflush(1);
while( $datas = <SOC> )
{
$rdatas.= $datas;
if( index( $rdatas ,"\n\n")>=0) {last;}
if( index( $rdatas ,"\r\r")>=0) {last;}
if( index( $rdatas ,"\r\n\r\n")>=0) {last;}
}
print SOC "HTTP/1.1 200 OK\n";
print SOC "Content-type: text/html \n\n";
if ( ! mkusers($rdatas))
{
print SOC " User Add OK";
}
sleep(1);
shutdown(SOC,2);
close(SOC);
}
}
__END__
###################################################################