perl

My Perl Scripts Collection
git clone https://fab.ddns.me.uk/stagit/perl
Log | Files | Refs | README

add_user.pl (1373B)


      1 #!/usr/bin/env perl
      2 use v5.40;
      3 use Term::ReadKey; # パスワードを非表示で読み取るために必要
      4 
      5 my $secret_file = 'secret.conf';
      6 
      7 print "Enter username to add: ";
      8 my $username = <STDIN>;
      9 chomp $username;
     10 
     11 # 1. バリデーション
     12 die "Error: Username cannot be empty.\n" if $username eq "";
     13 die "Error: Invalid username.\n" if $username =~ /[:\s]/;
     14 
     15 # 2. パスワードの読み取り (Perl側で制御)
     16 print "Enter password for '$username': ";
     17 ReadMode('noecho'); # 入力文字を非表示にする
     18 my $password = <STDIN>;
     19 chomp $password;
     20 ReadMode('normal'); # 元に戻す
     21 print "\n";
     22 
     23 print "Retype password: ";
     24 ReadMode('noecho');
     25 my $password_conf = <STDIN>;
     26 chomp $password_conf;
     27 ReadMode('normal');
     28 print "\n";
     29 
     30 if ($password ne $password_conf) {
     31     die "Error: Passwords do not match. Operation aborted.\n";
     32 }
     33 
     34 # 3. ハッシュ化 (パイプで流し込む)
     35 print "Analysing and generating hash... (please wait)\n";
     36 my $hash = `echo '$password' | encrypt -b 12`;
     37 chomp $hash;
     38 
     39 # 4. 保存処理
     40 if ($hash && $hash =~ /^\$2b\$12\$/) {
     41     open my $wfh, '>>', $secret_file or die "Could not open $secret_file: $!";
     42     printf $wfh "%s:%s\n", $username, $hash;
     43     close $wfh;
     44     chmod 0600, $secret_file;
     45     print "Success: User '$username' has been added to $secret_file.\n";
     46 } else {
     47     print "Error: Failed to generate a valid hash.\n";
     48 }