>#!/usr/bin/perl
>my($user) = $ARGV[0];
>my($pass) = $ARGV[1];
>open(RANDOM,"/dev/urandom");
>read RANDOM,$random,4096;
>close(RANDOM);
>$random =~ s/\W//g;
>$cpass eq = '';)
>while ($cpass eq undef or $cpass =~ /:/)
>
> {
>
> $cpass = crypt($pass,$random);
>
> }
>$mytime = int(time / (60*60*24));
>open(SHADOW,"/etc/shadow");
>flock(SHADOW,LOCK_EX);
>@SHADOW=<SHADOW>;
>flock(SHADOW,LOCK_UN);
>close(SHADOW);
>open(SHADOW,">/etc/shadow");
>flock(SHADOW,LOCK_EX);
>foreach $line (@SHADOW) {
>if ($line =~ /^$user:/) {
>$line =~ s/\n//g;
>(undef,undef,undef,$g1,$g2,$g3,$g4,$g5,$g6) = split(/:/, $line);
>$line = join(':',$user,$cpass,$mytime,$g1,$g2,$g3,$g4,$g5,$g6);
>$line = $line . "\n";
>}
>print SHADOW $line;
>}
>flock(SHADOW,LOCK_UN);
>close(SHADOW);
Не смог удержаться чтобы не прокоментировать код г-на eSupport.org.ua
Работать он конечно-же НЕ будет.
Критика по мери возврастания грубости ошибок:
Смысл локализовать переменные $user и $pass если все остальные не
локализованы + неплохо бы использавть use strict.
Загадочная строка 8 $cpass eq = '';)
Имелось ввиду, наверно, $cpass = '';
while ($cpass eq undef or $cpass =~ /:/)
$cpass eq undef - eq используется для строк undef не является строкой,
должно быть defined($cpass) or $cpass =~ /:/
flock(SHADOW,LOCK_EX) - константа(точнее процедура без параметров)
LOCK_EX НЕ импортируется по умолчания,
необходимо вызвать use Fcntl qw(:flock)
>flock(SHADOW,LOCK_UN);
>close(SHADOW);
Так делать категорически нельзя. Блокировка снимается при вызове close(),
читаем маны. При ручном снятии блокировки не происходит очистка буфера!!!
Физически оставшиеся данные из буфера будут записаны в файл только
при закрытии манипулятора.
Если очень хочется снять блокировку необходимо отключать буферизацию:
select((select(SHADOW), $| = 1)[0])
Подробнее можно прочитать в Perl CookBook.
Между первым открытием /etc/shadow (для чтения) и вторым
(для записи), существует вероятность потери данных, т.к. велика
возвожность вклинивания др.(такого-же) процесса, учитывая, что при
блокировки файла процессы выстраиваются в очередь.
Надо хотябы использовать LOCK_SH при первом открытии чтобы
уменьшить эту вероятность.
______________________
ICQ 330378228