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 }