隐藏Perl脚本的命令行参数

时间:2011-07-01 22:06:49

标签: linux perl command-line

假设我写了一个名为“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之类的最简单/最简单的方法是什么?

3 个答案:

答案 0 :(得分:4)

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


更新

显然这对我有用,模拟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下

答案 1 :(得分:4)

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

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

e.g。 (在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部分。

答案 2 :(得分:1)

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

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

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