|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Andrey Sapozhnikov 2:5020/400 21 Nov 2002 02:45:17 To : Oleg Strelchenko Subject : Re: Скрыть STDOUT -------------------------------------------------------------------------------- Oleg Strelchenko wrote: > Доброе утро, день, вечер, ночь дорогой All! > > Hикак не могу сделать скрипт авторизации работающей по socket! :-( > Т.е. Скрипт висит на каком либо потру и читает STDIN. > Хочется скрыть STDOUT! > Вот мой пример: > >>----- auth.pl ----- > > #!/usr/local/bin/perl > #[...] > while( $Result eq "ERR" ){ > print "Login: "; > > while(<>){ # Считываем STDIN > $user =~ s/\ //g; > $user = "$_"; > last; > } > print "Password: "; > #system "stty -echo"; # При локальном вызове работает! > while(<>){ # Считываем STDIN > $password="$_"; > last; > #system "stty echo"; # При локальном вызове работает! > } > $Result = &checkpasswd($user, $password ); > } > sub checkpasswd{ > #[...] > $Result = "OK"; > } > >>----- auth.pl ----- > > Может кто что-то посоветует?! Что значит "скрыть STDOUT"? Выключить эхо при наборе пароля? Так сокеты, в отличие от терминалов, и не имеют никакого эха. Если Вы наблюдаете эхо при вводе, значит его Вам выдает программа которой Вы пользуетесь для соединения с сокетом. С некоторой долей вероятности можно утверждать, что эта программа - telnet. Так вот telnet имеет свой протокол, не имеющий отношения к собственно сокетам, позволяющий telnet-серверу и telnet-клиенту договариваться о наличии и использовании всяческих возможностей, таких как эхо, буфферизация строк, 7 или 8 битная передача, автоматическая авторизация, и т.д. Hачинать читать следует с RFC 854. Отключение эха в телнете делается с помощью функции ECHO (RFC 857). Примерный порядок действий (в упрощенном виде): use constant IAC => "\xff"; use constant DONT => "\xfe"; use constant DO => "\xfd"; use constant WONT => "\xfc"; use constant WILL => "\xfb"; use constant ECHO => "\x01"; use FileHandle; # обязательно отключить буферизацию вывода! autoflush STDOUT 1; # Здесь эхо включено print "Login: "; my $login = <>; my $buf; # Заявляем клиенту, что мы (сервер) сами будем обслуживать # эхо, и помогать нам не надо print IAC, WILL, ECHO; read(STDIN, $buf, 3); # Клиент должен согласиться и ответить "хорошо, # делайте сами" if ($buf ne IAC . DO . ECHO) { warn "remote side does not support telnet/ECHO"; } # Теперь эхо отключено print "Password: "; my $pass = <>; # Теперь мы снимаем с себя почетную обязанность # заведовать эхом print IAC, WONT, ECHO; read(STDIN, $buf, 3); if ($buf ne IAC . DONT . ECHO) { die "remote side does not support telnet/ECHO"; } # Поскольку при вводе предыдущей строки эха не было, # курсор так и остался не переведенным на новую строку... print "\x0d\x0a"; # Эхо опять включено print "Fullname: "; my $fullname = <>; ---------------- END ----------------- Андрей P.S. А оно Вам правда надо? :-) --- ifmail v.2.15dev5 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/65770132f1a9.html, оценка из 5, голосов 10
|