Автор Тема: Perl stdin  (Прочетена 3119 пъти)

sunhater

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




Активен

Hapkoc

  • Напреднали
  • *****
  • Публикации: 2117
    • Профил
Perl stdin
« Отговор #1 -: Jan 16, 2007, 01:20 »
Стана ми интересно и намерих това
Активен

sunhater

  • Напреднали
  • *****
  • Публикации: 329
    • Профил
Perl stdin
« Отговор #2 -: Jan 16, 2007, 12:32 »
Точно това ми трябваше. Мерси че го намери вместо мен. Аз също търсех, но нищо не успях да намера.
Активен

sunhater

  • Напреднали
  • *****
  • Публикации: 329
    • Профил
Perl stdin
« Отговор #3 -: Jan 23, 2007, 12:04 »
А няма ли друго решение? Нещо, което не изисква допълнителни пакети.
Активен

Hapkoc

  • Напреднали
  • *****
  • Публикации: 2117
    • Профил
Perl stdin
« Отговор #4 -: Jan 23, 2007, 13:15 »
Ако питаш мен, можеш да разгледаш какво прави тоя модул и да си пренесеш кода в твоята програма. Хвърлих един поглед и модула е сравнително кратък. Това не значи, че вътре не са реализирани някакви магии, които за да ги разбереш да ти трябват 3 седмици, но това си е риска на професията. :)
Активен

sunhater

  • Напреднали
  • *****
  • Публикации: 329
    • Профил
Perl stdin
« Отговор #5 -: Jan 24, 2007, 11:20 »
Пробвах се да "пренеса кода" но кучето се дърпа '<img'>. Бях замислил да направа функция 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 под дърво и камък и не можах да го намера.

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



Активен

Hapkoc

  • Напреднали
  • *****
  • Публикации: 2117
    • Профил
Perl stdin
« Отговор #6 -: 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% ще е изпълнено това изискване.
Активен

rpetrov

  • Напреднали
  • *****
  • Публикации: 571
    • Профил
    • WWW
Perl stdin
« Отговор #7 -: Jan 29, 2007, 23:33 »
В CPAN има ReadPassword, но ... ':crazy:'  ':xclam:'

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

sunhater

  • Напреднали
  • *****
  • Публикации: 329
    • Профил
Perl stdin
« Отговор #8 -: 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";

Това ме урежда напълно.
Активен

sunhater

  • Напреднали
  • *****
  • Публикации: 329
    • Профил
Perl stdin
« Отговор #9 -: Feb 01, 2007, 11:53 »
Цитат (rpetrov @ Ян. 30 2007,00:33)
Ползването на някой езици за работа с пароли е неудачно. Трябва да има възможност да бъде заличена паролата от паметта, да бъде забранен core dump, ...

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

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
Perl
Общ форум
x11r6 5 3404 Последна публикация Aug 09, 2003, 10:03
от x11r6
Perl
Общ форум
Йордан 3 2851 Последна публикация Nov 13, 2003, 16:14
от Йордан
Gtk-Perl
Хардуерни и софтуерни проблеми
apogza 0 1773 Последна публикация Jan 24, 2004, 12:52
от apogza
Програма, която да привързва stdin/stdout към tcp връзка
Web development
Naka 5 3272 Последна публикация Aug 31, 2012, 21:08
от Naka
gzip: stdin not in gzip format
Настройка на програми
NikolayDONG 4 2162 Последна публикация May 07, 2014, 23:58
от NikolayDONG