【问题标题】:What is the significance of -T or -w in #!/usr/bin/perl?#!/usr/bin/perl 中的 -T 或 -w 有什么意义?
【发布时间】:2012-06-29 06:09:39
【问题描述】:

我搜索了#!/usr/bin/perl,但找不到任何令人满意的答案。我知道这是一个非常基本的东西,但仍然可以解释一下#!/usr/bin/perl 在 Perl 中的意义是什么?此外,-w 或 -T 在 #!/usr/bin/perl 中表示什么?我是 Perl 新手,请耐心等待。

【问题讨论】:

  • #!/usr/bin/perl 被称为shebang线。 -w 用于警告。-T 用于污染模式。
  • -w 已多年不被推荐。从 Perl 5.6.0 开始,我们有了use warnings,它更强大、更灵活。

标签: perl shebang taint


【解决方案1】:

#!通常称为“shebang”,它告诉计算机如何运行脚本。您还会看到很多带有#!/bin/sh 或#!/bin/bash 的shell 脚本。

所以,/usr/bin/perl 是您的 Perl 解释器,它会运行并提供要执行的文件。

该行的其余部分是 Perl 的选项。 "-T" is tainting(这意味着输入被标记为“不可信”,直到您检查它的格式)。 “-w”打开警告。

您可以通过运行perldoc perlrun 了解更多信息(perldoc 是 Perl 的文档阅读器,可能已安装,可能在它自己的包中)。

对于您编写的脚本,我建议您从以下开始:

#!/usr/bin/perl
use warnings;
use strict;

这会打开大量警告和额外检查 - 在您学习时尤其有用(我仍在学习,我已经使用 Perl 超过 10 年了)。

【讨论】:

  • 这是一个查询。当我需要另一个 .pl 文件到具有 #!/usr/bin/perl -T 的文件时,它会引发错误。当我删除 -T 时,它会运行。这是什么原因?谢谢。
【解决方案2】:

-w 和 -T 都是“万无一失”的标志。

-w 与代码中的use warning 语句相同,在许多编译器中它相当于警告选项。一个最简单的例子是关于使用未初始化变量的警告:

#!/usr/bin/perl -w
print "$A\n";
print "Hello, world!\n";

将打印:

Name "main::A" used only once: possible typo at ./perl-warnings line 3.
Use of uninitialized value $A in concatenation (.) or string at
./perl-warnings line 3.

Hello, world!

-T 标志表示任何来自外部世界的值(与在程序内部计算相反)都被视为潜在威胁,并且不允许在与系统相关的操作中使用这些值,例如写入文件、执行系统命令等(这就是为什么当脚本在 setuid/setgid 下运行时 Perl 会激活“污点”模式。)

“污染”模式是“强制”您仔细检查脚本中的值。

例如,代码:

#!/usr/bin/perl -T
$A = shift;
open FILE, ">$A";
print "$A\n";
close FILE;

会产生致命错误(终止程序):

$ ./perl-tainted jkjk
Insecure dependency in open while running with -T switch at
./perl-tainted line 3.

那只是因为参数值来自“外部”并且没有“双重检查”。 “污点”模式正在引起您对这一事实的注意。当然,很容易被骗,例如:

#!/usr/bin/perl -T
$A = shift;
$A = $1 if $A =~ /(^.*$)/;
open FILE, ">$A";
print "$A\n";
close FILE;

在这种情况下,一切正常。你“愚弄”了“污点模式”。好吧,假设是程序员的意图是使程序更安全,因此程序员不会只是解决错误,而是会采取一些安全措施。 Perl 的绰号之一是“系统管理员的粘合剂和胶带”。系统管理员不太可能会根据自己的需要创建 Perl 脚本并使用root 权限运行它。想象一下这个脚本做了一些普通用户不允许做的事情……您可能想要仔细检查不属于程序本身的事情,并且希望 Perl 提醒您这些事情。

希望对你有帮助。

【讨论】:

  • -w 与 use warnings; 不同。 pragma 是词法范围的。
  • 关于“-w 与使用警告相同”。这不完全正确。 -W 在任何地方打开警告(忽略 $^W 或不使用警告),-w 在任何地方打开警告,除非 $^W 设置为 0 或不使用警告。 “使用警告”是词法范围的。
【解决方案3】:

关于污点模式(-T):
require 和 use 语句会在 污点模式 开启时发生变化。
加载库/模块的路径不再包含其路径中的.(当前目录)。

因此,如果您在未明确指定路径的情况下加载与当前工作目录相关的任何库或模块,您的脚本将在污染模式下中断。

例如:考虑 perl_taint_ex.pl

#!/usr/bin/perl -T

require "abc.pl";
print "Done";

会像这样失败

D:\perlex>perl perl_taint_ex.pl
"-T" is on the #! line, it must also be used on the command line 
at perl_taint_ex.pl line 1. 

D:\perlex>perl -T perl_taint_ex.pl
Can't locate abc.pl in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib)
 at perl_taint_ex.pl line 3. 

因此,当污点模式开启时,您必须明确告诉 require 语句将库加载到何处,因为在污点模式期间,. 已从 @INC 数组中删除。

@INC 包含可从中读取库文件和模块的有效路径列表。

如果启用了污点模式,您只需执行以下操作:

D:\perlex>perl -ID:\perlex -T perl_taint_ex.pl
Done

-ID:\perlex 将在@INC 中包含目录D:\perlex。

您可以尝试其他方式为@INC添加路径,这只是一个示例。

【讨论】:

  • 这个解释很好地解释了如果您没有从命令行正确使用 -T 参数而是在 perl 脚本的 shebang 行中指定它会发生什么。有用。
【解决方案4】:

它被称为shebang。在基于 Unix 的系统(OSX、Linux 等)上,该行指示从命令行运行脚本时语言解释器的路径。对于 perl /usr/bin/perl 是 perl 解释器的路径。如果省略了 hashbang,*nix 系统将不知道在作为可执行文件调用时如何解析脚本。相反,它将尝试在用户碰巧正在运行的任何 shell(可能是 bash)中解释脚本并破坏脚本。

http://en.wikipedia.org/wiki/Hashbang

-W 和 -T 是控制 perl 解释器操作方式的参数。它们与直接从命令行调用 perl 解释器时可以调用的参数相同。

  • -W 显示警告(也称为调试信息)。
  • -T 打开污点/安全检查。

【讨论】:

    猜你喜欢
    • 2011-11-28
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    相关资源
    最近更新 更多