将命令行参数隐藏到Perl脚本中

比方说,我写了一个名为“foo.pl”的Perl脚本,它通过-p开关接受密码参数。

但是,在运行时,任何人都可以执行ps并查看整个命令行string,包括密码:

 $ 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 

什么是最简单的方法来隐藏密码并将其replace为xxxxxx东西?

从脚本内部请求密码,所以您不必将其作为参数传递。


更新

显然这个工作对我来说,模拟一个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下

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

但是:通常可以(取决于操作系统)通过分配$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的部分。

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

另一个选项是私人密码文件 。 这个文件可以通过shell插入来读取,但它仍然是一个混乱。

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