如何在带有';#的perl脚本中设置污染模式/usr/bin/env perl';-舍邦?
如何在perl脚本中使用如何在带有';#的perl脚本中设置污染模式/usr/bin/env perl';-舍邦?,perl,shebang,taint,Perl,Shebang,Taint,如何在perl脚本中使用 #!/usr/bin/env perl shebang?由于污染模式只能通过-T标志启用,并且env不会接受shebang行中的任何标志,因此最好的选择是通过perl-T script.pl运行程序,而不是直接执行脚本 如果您确实需要在shebang中强制执行污染模式,您可以在路径(例如/usr/local/bin)中的某个位置创建一个包含以下内容的taintperl脚本: #!/bin/sh /usr/bin/env perl -T 然后在Perl脚本中,使用 #
#!/usr/bin/env perl
shebang?由于污染模式只能通过
-T
标志启用,并且env
不会接受shebang行中的任何标志,因此最好的选择是通过perl-T script.pl
运行程序,而不是直接执行脚本
如果您确实需要在shebang中强制执行污染模式,您可以在路径(例如/usr/local/bin)中的某个位置创建一个包含以下内容的taintperl
脚本:
#!/bin/sh
/usr/bin/env perl -T
然后在Perl脚本中,使用
#!/usr/bin/env taintperl
您可以在shebang行上传递PERL5OPT环境变量:
#!/usr/bin/env PERL5OPT=-T perl
对我来说,这一切似乎都很落后
另一个选项是,如果检测到脚本未打开,则在污染模式下重新执行脚本:
#!/usr/bin/env perl
warn 'Taint mode is '.(${^TAINT} ? 'on' : 'off'); # For debugging
exec($^X,'-T',$0,@ARGV) unless ${^TAINT};
# do stuff under taint mode here
显然,这是对启动性能的重大打击。在许多操作系统上,您不能使用解释脚本作为脚本解释器。您必须在编译语言中执行此操作,例如。C@GavinBrock这对于紧跟在
#之后提到的程序来说是正确的代码>。这里是编译的/usr/bin/env
。反过来,env
不关心traintPerl
是否是编译程序。如果无法预测perl二进制文件(/usr/bin或/usr/local/bin)的位置,它会有所帮助我想问题是你能否预测env的位置……在我的PC上我使用/usr/local/bin/perl,在我的上网本上使用/usr/bin/perl。因此,使用/usr/bin/env perl,我不必更改我的perl脚本。我想他们会在我的操作系统的下一个版本中发布perl版本5.10.1,所以也许我会在我的电脑上再次使用带/usr/bin/perl的内置perl,在那里我也不必更改我的shebangs。Gavin,env
的位置是标准化的。@daxim,除非你使用OpenServer 5.0.6(SCO)或Unicos 9.0.2(Cray);-)@Sinan,如果您曾经使用perlbrew并在您的系统上安装了多个perl,那么使用/usr/bin/env perl
是一个错误,您不能在带有/usr/bin/env的shebang中实际指定变量。这样做将导致env在一个无限循环中执行自己,甚至无法访问请求的命令。我在Linux和FreeBSD上都做了测试。是的,这似乎是目前唯一支持第一个咒语的OS-X。