Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Скрыть STDOUT   Oleg Strelchenko   20 Nov 2002 18:06:20 
 Скрыть STDOUT   Denis Knyazev   20 Nov 2002 19:39:30 
 Re: Скрыть STDOUT   Sergey V. Leschenko   20 Nov 2002 21:08:55 
 Re: Скрыть STDOUT   Artem Chuprina   20 Nov 2002 22:46:03 
 Re: Скрыть STDOUT   Andrey Sapozhnikov   21 Nov 2002 02:45:17 
Архивное /ru.perl/65770132f1a9.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional