perl脚本中出现“#”问题

时间:2012-05-07 06:50:46

标签: perl

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

在我看来,像shell一样引用问题。适当的引用规则完全取决于系统的命令shell。例如,在bash中,您可以使用-p '$password'之类的内容相当安全,同时在Perl脚本中将'音译为\'。或者可能有一个模块,我不知道。

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

请注意,通过将用户收集的数据传递到shell,您将面临很大的安全风险。考虑使用Perl的Taint mode

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