假设我写了一个名为“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
之类的最简单/最简单的方法是什么?
答案 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。
通过将脚本包装在“启动器”脚本中,您可以为私有密码文件添加更多灵活性。基本上,您编写的脚本的唯一目的是“设置”密码文件,然后启动您的真实脚本。