我正在开发perl中的自动化脚本,在该脚本中,为了进行身份验证,我编写了一个子程序,该子程序接受用户输入的密码并将其返回到主perl程序,后者又将密码传递给我需要自动执行的工具。 / p>
除非字符#
是密码的一部分,否则此脚本适用于所有情况。然后它无法自动化该工具并且无法进行身份验证。
以下是我用来输入密码的子程序。
use Win32::Console;
sub password() {
$StdIn = new Win32::Console(STD_INPUT_HANDLE);
my $Password = "";
$StdIn->Mode(ENABLE_PROCESSED_INPUT);
print "Enter Password: ";
while (ord(my $Data = $StdIn->InputChar(1)) != 10) {
if("\r" eq $Data ) {
last;
}
elsif ("\ch" eq $Data) {
if( "" ne chop( $Password )) {
print "\ch \ch";
}
next;
}
$Password .=$Data;
print "*";
}
return $Password;
}
我将上述子程序称为
$passwd = &password();
然后将$passwd
传递给我需要自动执行的工具,如下所示
这是我将密码传递给工具的行
cc -c URL OF THE TOOL:$server -d $domain -t $appl -u $userid -p $passwd; \n";
任何人都可以交叉检查代码以调用password()子例程,返回$ password并将$ passwd传递给该工具。我认为错误可能是三个地方之一。有人请帮助,如果可能的话也提供代码。
答案 0 :(得分:1)
您可能正在将用户输入传递给某种不支持文字#
的外部工具,可能是因为它被解释为“评论开始”。外壳可能是个嫌疑人。但是如果没有示例代码,我们就无法确定您的问题是什么。
答案 1 :(得分:1)
在我看来,像shell一样引用问题。适当的引用规则完全取决于系统的命令shell。例如,在bash中,您可以使用-p '$password'
之类的内容相当安全,同时在Perl脚本中将'
音译为\'
。或者可能有一个模块,我不知道。
但是,这是你传递数据的“cc”。该工具可以支持更安全地传递密码的更简单方法,即避免引用任意数据。此类工具的示例是通过STDIN,通过外部文件(实际上可能非常不安全:))或作为以null结尾的字符串。或仅传递哈希值。所以我会查看文档。
请注意,通过将用户收集的数据传递到shell,您将面临很大的安全风险。考虑使用Perl的Taint mode。
更新:你说它是Windows,所以我应该警告你:引用cmd.exe是我做过的最复杂,最痛苦和令人沮丧的事情之一。看看this question