【问题标题】:Perl Script return value as input to second perl scriptPerl 脚本返回值作为第二个 perl 脚本的输入
【发布时间】:2012-01-02 17:44:18
【问题描述】:

我需要编写一个脚本getPwd.pl($user) 来解析密码文件并返回特定用户的密码。

要解析的文件(password.txt)

DEFINE ALICE = 'alice#1';
DEFINE BENICE = 'benice#1';
DEFINE CATHY = 'cathy#1';

第二个脚本authUser.pl 必须调用getPwd.pl($user) 并且返回的值将被传递到第二个脚本以验证用户。

模块不是一个选项,因为 getPwd.pl 将由不同的用户拥有,我将使用 sudo 来执行 getPwd.pl

请协助并提供一些关于如何进行此操作的指导。

【问题讨论】:

  • 重新设计系统,使密码文件在全世界都可读,但包含散列和加盐密码。
  • 我没有重新设计密码文件的选项。
  • 你这样做的问题到底在哪里?
  • 我的问题是将值从一个脚本传递到另一个脚本。

标签: perl variables


【解决方案1】:

我同意应该修复整个系统。如果你能执行 sudo 那么你当然有能力解决问题!

但是,要回答实际问题,最好的办法是将 getPwd.pl 作为命令调用(而不是像上面显示的那样作为函数)。

my $pwd = `getPwd.pl $user`

然后将 $pwd 参数作为响应。

但是,如果您至少可以使另一个文件成为模块或源文件,那么您的情况会好得多。

【讨论】:

    【解决方案2】:

    您可以简单地打印从密码文件中提取的值,并使用反引号或qx() 在授权脚本中捕获它。例如:

    my $pass = qx(/path/to/password.pl cathy);
    

    密码脚本可能很简单:

    my $name = shift;
    open my $fh, '<', '/path/to/password.txt' or die $!;
    while (<$fh>) {
        /^DEFINE $name =/i && last; # Optional /i modifier for case insensitive match
    }
    
    if ($_ && /^DEFINE $name = '([^']+)'/) { # Must check $_ is not empty
        print $1;
    }
    

    【讨论】:

    • 谢谢。有没有办法避免打印密码?我知道这是 backtics 所必需的。
    • @user621092 为什么要避免打印密码?
    • 隐匿性安全问题?我认为当您将纯文本密码放入文件中时,这艘船就会航行。任何可以成功执行getPwd.pl 的用户也可以读取密码文件。如果将getPwd.pl 作为模块加载到脚本中,则可以将密码作为脚本中的变量传递。但是你必须用 sudo 运行授权脚本,然后两个脚本的全部意义就没有意义了。
    • 是的安全问题。我的想法是只有一个用户才能在 sudoers 中执行脚本作为设置。执行权限是否也意味着对文件的读取权限?
    • 嗯,可以sudo getPwd.pl 的人也可以sudo cat password.txt。如果没有sudoer的读取权限,无法打开密码文件进行读取,perl会死掉,报Permission denied。即使您可以不打印就通过它,也可以以某种方式提取。如果你想要安全,这不是要走的路。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 2011-08-02
    相关资源
    最近更新 更多