【问题标题】:Issue with "#" in perl scriptingperl 脚本中的“#”问题
【发布时间】:2012-05-07 06:50:46
【问题描述】:

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

【问题讨论】:

  • #登录密码调用程序时,是否引用了密码? # 是 perl 中的注释符号。你能显示一些代码吗?
  • 我已经添加了调用部分。请看。
  • 您已经说过 reading 例程工作正常。您应该向我们展示您将密码传递给另一个工具的部分。
  • 这是我将密码传递给工具的行, cc -c URL OF THE TOOL:$server -d $domain -t $appl -u $userid -p $passwd; \n";
  • @gautamkumar 显然 shell 做到了。您至少应该引用密码(或者如果可能,将其作为以空字符结尾的字符串传递)。

标签: perl


【解决方案1】:

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

【讨论】:

  • Kilian 的意思是问题似乎不在此代码中。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2017-09-15
    • 1970-01-01
    • 2014-12-29
    • 2014-12-07
    • 2013-03-11
    • 2013-09-18
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多