URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID2
Нить номер: 1435
[ Назад ]

Исходное сообщение
" - нужен спец по perl."

Отправлено xz , 05-Дек-05 13:10 
Приветствую.
Есть всеми извесный webmin
(http://webmin.com)
в нем есть модуль - создание юзера.
в нем именно инетересен механизм задания/смены пароля.
т.е. или по этой аналогии либо каким либо еще способом нужен скрипт
который получает в качестве аргументов username password, затем сравнивает username со списком юзеров если он там есть делает passwd username, если нету выходит.
предложения о размере вознаграждения за данную работу и за подробностями - по аське 138289374.
WBR.

Содержание

Сообщения в этом обсуждении
" - нужен спец по perl."
Отправлено eSupport.org.ua , 05-Дек-05 15:29 
#!/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);

" - нужен спец по perl."
Отправлено Vivis , 05-Дек-05 15:34 
>#!/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);


Украинские братья работают за еду? :)
А если используется pam_tcb? А если это FreeBSD?


" - нужен спец по perl."
Отправлено dawnshade , 06-Дек-05 00:29 
>Украинские братья работают за еду? :)
>А если используется pam_tcb? А если это FreeBSD?


имеено. Так же они наивно думают, что скрипт спод вебсервера будет выполнятся с правами root (или это они так серваки настраивают, чтобы рут не дропался, которые они тут в каждую дырку пихают).
Ах! они читать еще не умеют... автор-то просил под веб, а они ему суют  $ARGV[0]....


" - нужен спец по perl."
Отправлено eSupport.org.ua , 06-Дек-05 02:09 
>имеено. Так же они наивно думают, что скрипт спод вебсервера будет выполнятся
>с правами root (или это они так серваки настраивают, чтобы рут
>не дропался, которые они тут в каждую дырку пихают).

При чем тут вебсервер и скрипт на перле?

>Ах! они читать еще не умеют... автор-то просил под веб, а они
>ему суют  $ARGV[0]....

Нет, Это Вы не умеете. Автор не просил под веб, автор просил перловый скрипт.


" - нужен спец по perl."
Отправлено eSupport.org.ua , 06-Дек-05 02:12 
>Украинские братья работают за еду? :)

Это не работа вообще. Если для Вас - это работа, то для нас - это пустяки. А за пустяки деньги не берем.

>А если используется pam_tcb? А если это FreeBSD?

Код для FreeBSD:
($fd0, $fd1) = POSIX::pipe();
POSIX::write( $fd0, $pass, length($pass) );
system("/usr/sbin/pw","usermod","$user","-h",$fd1);

P.S. Читайте маны - они рулез.


" - нужен спец по perl."
Отправлено FreD , 06-Дек-05 21:37 
>>Украинские братья работают за еду? :)
>
>Это не работа вообще. Если для Вас - это работа, то для
>нас - это пустяки. А за пустяки деньги не берем.
>
>P.S. Читайте маны - они рулез.
молодцы esuuport, уважаю


" - нужен спец по perl."
Отправлено Vivis , 07-Дек-05 09:08 
>>Украинские братья работают за еду? :)
>
>Это не работа вообще. Если для Вас - это работа, то для
>нас - это пустяки. А за пустяки деньги не берем.

А если он не заработает? Саппорт от вас уже денег стоить будет? :-))

>>А если используется pam_tcb? А если это FreeBSD?
>
>Код для FreeBSD:
>($fd0, $fd1) = POSIX::pipe();
>POSIX::write( $fd0, $pass, length($pass) );
>system("/usr/sbin/pw","usermod","$user","-h",$fd1);
>
>P.S. Читайте маны - они рулез.

Гениальный сниппет! Может на шелле тоже сможете? :)



" - нужен спец по perl."
Отправлено eSupport.org.ua , 08-Дек-05 00:07 
>А если он не заработает? Саппорт от вас уже денег стоить будет?
>:-))

Будет

>Гениальный сниппет! Может на шелле тоже сможете? :)

Можем. Пишите в support at esupport.org.ua



" - нужен спец по perl."
Отправлено kost , 17-Дек-05 01:12 
>#!/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


" - нужен спец по perl."
Отправлено eSupport.org.ua , 17-Дек-05 22:26 
>Не смог удержаться чтобы не прокоментировать код г-на eSupport.org.ua
>Работать он конечно-же НЕ будет.

Незначительные ньюансы имеются, но код рабочий.