Скрытие ввода пользователя - PullRequest
8 голосов
/ 09 марта 2011

Я пытаюсь получить скрипт, который работает как в родной оболочке Windows, так и в оболочке cygwin (через ssh), которая запрашивает и читает пароль, введенный пользователем. До сих пор я пробовал следующие методы:

  1. используя Term :: ReadKey и устанавливая ReadMode в 'noecho'
    • РЕЗУЛЬТАТ: возвращает ошибку GetConsoleMode failed и завершает работу
  2. с использованием Term :: ReadPassword :: Win32
    • РЕЗУЛЬТАТ: зависает и никогда не предлагает приглашение или читает ввод
  3. с использованием IO :: Prompt
    • РЕЗУЛЬТАТ: возвращает ошибку Cannot write to terminal и завершает работу
  4. используя Term :: InKey
    • RESULT: возвращает ошибку Not implemented on MSWin32: The handle is invalid и завершает работу

Все это работает в собственной оболочке Windows (командная строка или командная оболочка), но ни одна из них не работает, когда я нахожусь в сеансе ssh с сервером.

На самом деле, это то, что меня больше всего интересует, заставить его работать в удаленной сессии ssh.

Я получаю ssh через cygwin, установленный на сервере Windows (2003 R2). Я использую клубничный Perl, а не Cygwin Perl (Cygwin Perl ломает другие Perl-скрипты, которые мне нужно запускать в Windows, а не через ssh).

Мое лучшее предположение - то, что cygwin + Windows работает с клубничным Perl настолько, что не может определить, в какой среде он находится. Я изучаю альтернативные решения sshd + для Windows, чтобы изучить это.

Это все методы, которые я смог найти в своем поиске. У кого-нибудь еще есть какие-либо другие способы скрыть пользовательский ввод, которые они могут предложить?

Ответы [ 3 ]

1 голос
/ 20 сентября 2014
use Term::ReadKey;
print "Please enter your artifactory user name:";
$username = <STDIN>;
chomp($username);
ReadMode('noecho'); # don't echo
print "Please enter your artifactory password:";
$password = <STDIN>;
chomp($password);
ReadMode(0); #back to normal
print "\n\n";
0 голосов
/ 05 февраля 2013

как насчет Term :: ReadKey's ReadMode (4)?Я только что использовал это в личном проекте, найдя ответ здесь

работает на Cygwin / Win7, однако не могу поручиться за родную оболочку Windows.

use strict;
use warnings;
use Term::ReadKey;

sub get_input {
  my $key = 0;
  my $user_input = "";

 # disable control keys and start reading keys until enter key is pressed (ascii 10)
 ReadMode(4);
 while (ord($key = ReadKey(0)) != 10)
   {
     if (ord($key) == 127 || ord($key) == 8) {
       # backspace / del was pressed.  remove last char and move cursor back one space.
       chop ($user_input);
       print "\b \b";
     } elsif (ord($key) < 32) {
         # control characters, do nothing
     } else {
         $user_input = $user_input . $key;
         print "*";
     }
   }
  ReadMode(0);
  return $user_input;
}

# variables
my $password = "";
my $username = "";

print "\nPlease input your username: ";
$username = get_input();
print "\nHi, $username\n";

print "\nPlease input your password: ";
$password = get_input();
0 голосов
/ 09 марта 2011

Я бы попытался вывести переменные среды (% ENV) во время сеансов, которые работают, а затем снова во время сеансов, которые не работают. Я считаю, что при работе с терминальным вводом-выводом вы должны тщательно настроить переменную «TERM», основываясь на таких вещах, как переменная $ ^ O и $ ENV {SESSIONNAME} (в Windows).

...