我正在尝试获取一个脚本,该脚本在本机Windows shell和cygwin shell(通过ssh)中都有效,提示并读取用户输入的密码。到目前为止,我尝试了以下方法:
GetConsoleMode failed
并退出Cannot write to terminal
并退出Not implemented on MSWin32: The handle is invalid
并退出所有这些都在本机Windows shell(命令提示符或电源shell)中工作,但当我在服务器的ssh会话中时,它们都不起作用。
真的,这是我最感兴趣的,让它在远程ssh会话中工作。
我通过安装在Windows服务器(2003 R2)上的cygwin获取ssh。我正在使用草莓perl而不是cygwin perl(cygwin perl打破了我需要在Windows中本地运行的其他perl脚本,而不是通过ssh)。
我最好的猜测是cygwin + Windows正在使用草莓perl,它无法分辨它所处的环境。我正在寻找其他sshd + Windows解决方案来探索它。
这些是我在搜索中找到的所有方法。是否有其他方法可以隐藏他们可以建议的用户输入?
答案 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";