【问题标题】:Hiding command-line arguments to a Perl script隐藏 Perl 脚本的命令行参数
【发布时间】:2011-09-27 01:48:04
【问题描述】:

假设我编写了一个名为“foo.pl”的 Perl 脚本,它通过 -p 开关接收密码参数。

但是,当它运行时,任何人都可以执行ps 并查看整个命令行字符串,包括密码:

$ ps a |grep 'foo\.pl'
32310 pts/4    S+     0:00 /usr/bin/perl -w ./foo.pl -p password
32313 pts/5    S+     0:00 grep foo.pl

隐藏密码并将其替换为xxxxxx 之类的最简单/最简单的方法是什么?

【问题讨论】:

  • @mrk:我反对这种方法,运行进程的环境也可以访问
  • @dolphy 我的评论并不是提倡发布的第一个解决方案 - 它显示了之前类似讨论中所说的内容。

标签: linux perl command-line


【解决方案1】:

从脚本内部询问密码,因此您不必将其作为参数传递。


更新

显然这对我有用,模拟mysql 行为:

#!/usr/bin/perl
($0 = "$0 @ARGV") =~ s/--password=\K\S+/x/;
<STDIN>;

$ ./s --user=me --password=secret
^Z
$ ps
  PID TTY           TIME CMD
 1637 ttys000    0:00.12 -bash
 2013 ttys000    0:00.00 ./s --user=me --password=x

MacOS 10.6 下

【讨论】:

  • 如果我希望它自动化怎么办?然后,我想我可以让它使用私人密码文件。
  • 我正在寻找更多类似于mysql 在命令行上使用密码时所做的事情。
  • @amphetamachine:是的,我明白了。好吧,我认为另一个答案为您提供了一些新想法,以及@mrk 提供的链接。关于mysql,它到底是做什么的?我从未使用过它,我正在尝试检查但没有成功。
  • @amphetamachine:知道了。显示一个 x 代替密码。非常有意思!你试过和$0打交道吗?
【解决方案2】:

有几种方法可以去。最直接的方法是(如 sidyll 所说)在实际脚本中提示输入密码。不要在命令行中输入,也不必隐藏它。

另一个选项是private password file。这个文件可以通过 shell 插值来读取,但它仍然是一种杂物。

您可以通过将脚本包装在“启动器”脚本中来为私有密码文件增加一点灵活性。本质上,您编写一个脚本,其唯一目的是“设置”密码文件,然后启动您的真实脚本。

【讨论】:

    【解决方案3】:

    如前所述,在命令行上传递密码并不是一个好主意。

    但是:您通常可以(取决于操作系统)通过分配给$0 来更改ps 显示的名称。

    例如(在 Linux 上测试)

    $ cat secret.pl
    #!/usr/bin/perl
    
    $0 = "my secret perl script";
    sleep 15;
    
    $ ./secret.pl -p foobar &
    [2] 426
    $ ps a | grep perl
      426 pts/0    S      0:00 my secret perl script
      428 pts/0    S+     0:00 grep perl
    

    有关详细信息,请参阅 perlvar 手册页中有关 $0 的部分。

    【讨论】:

      猜你喜欢
      • 2016-08-04
      • 2013-03-30
      • 1970-01-01
      • 2018-09-18
      • 2020-01-23
      • 1970-01-01
      • 2014-09-04
      • 2012-08-29
      • 2013-07-18
      相关资源
      最近更新 更多