Linux за българи: Форуми

Програмиране => Web development => Темата е започната от: sunhater в Jan 16, 2007, 00:12



Титла: Perl stdin
Публикувано от: sunhater в Jan 16, 2007, 00:12
Има ли начин да прочета стандартния вход, но без той да се показва на стандарния изход (примерно за подаване на пароли)
Примерен код
$password = <STDIN>; # Не искам да ми се появява паролата, когато я подавам от клавиатурата






Титла: Perl stdin
Публикувано от: Hapkoc в Jan 16, 2007, 01:20
Стана ми интересно и намерих това


Титла: Perl stdin
Публикувано от: sunhater в Jan 16, 2007, 12:32
Точно това ми трябваше. Мерси че го намери вместо мен. Аз също търсех, но нищо не успях да намера.


Титла: Perl stdin
Публикувано от: sunhater в Jan 23, 2007, 12:04
А няма ли друго решение? Нещо, което не изисква допълнителни пакети.


Титла: Perl stdin
Публикувано от: Hapkoc в Jan 23, 2007, 13:15
Ако питаш мен, можеш да разгледаш какво прави тоя модул и да си пренесеш кода в твоята програма. Хвърлих един поглед и модула е сравнително кратък. Това не значи, че вътре не са реализирани някакви магии, които за да ги разбереш да ти трябват 3 седмици, но това си е риска на професията. :)


Титла: Perl stdin
Публикувано от: sunhater в Jan 24, 2007, 11:20
Пробвах се да "пренеса кода" но кучето се дърпа :). Бях замислил да направа функция get_pass, но не стигнах почти доникъде... ето какво съм сътворил дотука:
Примерен код
#!/usr/bin/perl

require Exporter;
require AutoLoader;
require DynaLoader;
use Carp;

#@ISA = qw(Exporter AutoLoader DynaLoader);

my $pass = get_pass();

print $pass;

sub get_pass {
    my $mode = 2;
    my $fh = \*{((caller(1))[0]) . "::$mode"};
    SetReadMode($mode, $fh);
}
Дава грешка
Примерен код
Undefined subroutine &main::SetReadMode called at ./test.pl line 17.
Ако махна коментара на ред 8:
Примерен код
Can't locate auto/main/SetReadMode.al in @INC (@INC contains: /etc/perl /usr/lib/perl5/vendor_perl/5.8.8/i686-linux /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib/perl5/site_perl/5.8.8/i686-linux /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib/perl5/5.8.8/i686-linux /usr/lib/perl5/5.8.8 /usr/local/lib/site_perl .) at /usr/lib/perl5/5.8.8/AutoLoader.pm line 112
        AutoLoader::AUTOLOAD(2, 'GLOB(0x8177ba0)') called at ./test.pl line 17
        main::read_pass() called at ./test.pl line 10
Търсих SetReadMode под дърво и камък и не можах да го намера.

Уточнение: Сигурно проблема си е в мен, но все пак не е лошо проблемите да се споделят :)





Титла: Perl stdin
Публикувано от: Hapkoc в Jan 29, 2007, 16:12
Я гледай сега тука:

Примерен код

#! /usr/bin/perl -w

print "passwd: ";
system 'stty -echo';
$a = <>;
system 'stty echo';
print "\nnon-passwd: ";
$b = <>;

print "\npw: $a\n";


Малко hacky, ама май върши префектна работа. :)

Естествно изисква да имаш stty инсталирано, ама бидейки в coreutils мисля че 99% ще е изпълнено това изискване.


Титла: Perl stdin
Публикувано от: rpetrov в Jan 29, 2007, 23:33
В CPAN има ReadPassword, но ... :crazy:  :xclam:

Паролите се четат от /dev/tty, като показалеца и разни текстове се пишат на /dev/tty.
Ползването на някой езици за работа с пароли е неудачно. Трябва да има възможност да бъде заличена паролата от паметта, да бъде забранен core dump, ...


Титла: Perl stdin
Публикувано от: sunhater в Feb 01, 2007, 00:21
Цитат (Hapkoc @ Ян. 29 2007,17:12)
Примерен код

#! /usr/bin/perl -w

print "passwd: ";
system 'stty -echo';
$a = <>;
system 'stty echo';
print "\nnon-passwd: ";
$b = <>;

print "\npw: $a\n";

Това ме урежда напълно.


Титла: Perl stdin
Публикувано от: sunhater в Feb 01, 2007, 11:53
Цитат (rpetrov @ Ян. 30 2007,00:33)
Ползването на някой езици за работа с пароли е неудачно. Трябва да има възможност да бъде заличена паролата от паметта, да бъде забранен core dump, ...

По принцип съм съгласен, но на мен ми трябва за MySQL парола в инстал скрипт, така че паролата ще съществува максимално кратко време в паметта. Още повече, че това е последния въведен текст.