隐藏用户input

我试图得到一个脚本,在一个本地Windowsshell和一个cygwinshell(通过SSH),提示并读取用户input的密码。 到目前为止,我已经尝试了以下方法:

  1. 使用Term :: ReadKey并将ReadMode设置为“noecho”
    • 结果:返回错误GetConsoleMode failed并退出
  2. 使用Term :: ReadPassword :: Win32
    • 结果:挂起,从不提示或读取input
  3. 使用IO ::提示
    • 结果:返回错误Cannot write to terminal并退出
  4. 使用Term :: InKey
    • RESULT:返回错误Not implemented on MSWin32: The handle is invalid并退出

所有这些工作都在本机Windows shell(命令提示符或Power Shell)中工作,但是当我处于服务器的ssh会话中时,它们都不起作用。

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

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

我最好的猜测是,cygwin + Windows正在搞草莓Perl足够,它不能告诉它是什么样的环境。我正在寻找替代sshd + Windows解决scheme来探讨这一点。

这些都是我在search中find的所有方法。 有其他人有隐藏用户input他们可以build议的其他方法吗?

Solutions Collecting From Web of "隐藏用户input"

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

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

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