0

我正在用 perl 开发一个自动化脚本,在该脚本中,我编写了一个子例程,它接受用户输入的密码并将其返回给 perl 主程序,后者又将密码传递给我需要自动化的工具。

#除非字符是密码的一部分,否则此脚本适用于所有情况。然后它无法自动化该工具并且无法进行身份验证。

下面是我用来输入密码的子程序。

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 传递给工具的代码。我认为错误可能出现在三个地方之一。请有人帮忙,如果可能的话也提供代码。

4

2 回答 2

1

在我看来,在 shell 端引用是个问题。正确的引用规则完全取决于您系统的命令外壳。例如,在 bash 中,在 Perl 脚本中-p '$password'音译'为时,您通常可以相当安全地使用 , 之类的东西。\'或者可能有一个模块,我不知道。

但是,这是您将数据传递到的“cc”东西。该工具可以支持更简单的安全传递密码的方法,即避免引用任意数据的需要。此类工具的示例是通过 STDIN、通过外部文件(这实际上可能非常不安全:))或以空字符结尾的字符串。或仅传递哈希。所以我会查看文档。

请注意,将用户收集的数据传递到 shell 会带来很大的安全风险。考虑使用 Perl 的Taint mode

更新:你说它是 Windows,所以我应该警告你:引用 cmd.exe 是我做过的最复杂、最痛苦和令人沮丧的事情之一。看看这个问题

于 2012-05-07T09:43:54.727 回答
1

您可能正在将用户输入传递给某种不支持 literal 的外部工具#,可能是因为它被解释为“评论开始”。贝壳很可能是嫌疑犯。但是没有示例代码,我们无法确定您的问题是什么。

于 2012-05-07T06:57:12.430 回答