在#!/ usr/bin/perl中-T或-w的意义是什么?

vij*_*jay 8 perl shebang taint

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

Ric*_*ton 14

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

那么,/usr/bin/perl是你的Perl解释器,它运行并给出要执行的文件.

该行的其余部分是Perl的选项.该"-T"的玷污(这意味着输入被标记为"不信任",直到你检查它的格式)."-w"会发出警告.

您可以通过运行perldoc perlrun找到更多信息(perldoc是Perl的文档阅读器,可能已经安装,可能在自己的软件包中).

对于您编写的脚本,我建议您使用以下命令启动它

#!/usr/bin/perl
use warnings;
use strict;
Run Code Online (Sandbox Code Playgroud)

这会打开很多警告和额外的检查 - 在你学习的时候特别有用(我还在学习,现在我已经使用Perl超过10年了).


Pet*_* Al 5

这两个-w-T是一种"万无一失"的标志.

-wuse warning代码中的语句相同,并且它在许多编译器中等同于警告选项.最简单的例子是关于使用未初始化变量的警告:

#!/usr/bin/perl -w
print "$A\n";
print "Hello, world!\n";
Run Code Online (Sandbox Code Playgroud)

将打印:

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!
Run Code Online (Sandbox Code Playgroud)

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

"污点"模式是"强制"您仔细检查脚本中的值.

例如,代码:

#!/usr/bin/perl -T
$A = shift;
open FILE, ">$A";
print "$A\n";
close FILE;
Run Code Online (Sandbox Code Playgroud)

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

$ ./perl-tainted jkjk
Insecure dependency in open while running with -T switch at
./perl-tainted line 3.
Run Code Online (Sandbox Code Playgroud)

这只是因为论证价值来自"外部"并且不是"双重检查"."污点"模式引起了你对这一事实的关注.当然,很容易欺骗它,例如:

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

在这种情况下一切正常.你"欺骗"了"污点模式".好吧,假设是程序员的意图是使程序更安全,所以程序员不仅会解决错误,而宁愿采取一些安全措施.Perl的昵称之一是"胶水和系统管理员的胶带".系统管理员不是不可能为自己的需要创建Perl脚本,而是使用root权限运行它.想想这个脚本正在做普通用户不允许做的事情......你可能想要仔细检查不属于程序本身的东西,并且你希望Perl提醒你它们.

希望能帮助到你.

  • `-w`与`use warnings;'不同.该pragma是词法范围的. (2认同)
  • 关于"-w与使用警告相同".这不完全正确.-W随时打开警告(忽略$ ^ W或没有警告),-w打开警告,除非$ ^ W设置为0或没有使用警告."使用警告"是词汇范围的. (2认同)