外部から(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__
###################################################################