隐藏用户输入

时间:2011-03-08 23:05:26

标签: windows perl ssh cygwin hidden

我正在尝试获取一个脚本,该脚本在本机Windows shell和cygwin shell(通过ssh)中都有效,提示并读取用户输入的密码。到目前为止,我尝试了以下方法:

  1. 使用Term :: ReadKey并将ReadMode设置为'noecho'
    • 结果:返回错误GetConsoleMode failed并退出
  2. 使用Term :: ReadPassword :: Win32
    • 结果:挂起并且从不提供提示或读取输入
  3. 使用IO :: Prompt
    • 结果:返回错误Cannot write to terminal并退出
  4. 使用Term :: InKey
    • 结果:返回错误Not implemented on MSWin32: The handle is invalid并退出
  5. 所有这些都在本机Windows shell(命令提示符或电源shell)中工作,但当我在服务器的ssh会话中时,它们都不起作用。

    真的,这是我最感兴趣的,让它在远程ssh会话中工作。

    我通过安装在Windows服务器(2003 R2)上的cygwin获取ssh。我正在使用草莓perl而不是cygwin perl(cygwin perl打破了我需要在Windows中本地运行的其他perl脚本,而不是通过ssh)。

    我最好的猜测是cygwin + Windows正在使用草莓perl,它无法分辨它所处的环境。我正在寻找其他sshd + Windows解决方案来探索它。

    这些是我在搜索中找到的所有方法。是否有其他方法可以隐藏他们可以建议的用户输入?

3 个答案:

答案 0 :(得分:0)

我会尝试在有效的会话期间输出环境变量(%ENV),然后在没有的会话期间再次输出。我发现,在处理终端IO时,你必须根据$ ^ O变量和$ ENV {SESSIONNAME}(在Windows中)之类的东西仔细调整“TERM”变量。

答案 1 :(得分:0)

Term :: ReadKey的ReadMode(4)怎么样?我刚刚在个人项目中使用了这个,找到了答案here

适用于cygwin / win7,但不能担保本机Windows shell。

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();

答案 2 :(得分:0)

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";