10

グーグル#!/usr/bin/perlで検索しましたが、満足のいく答えが見つかりませんでした。私はそれがかなり基本的なことであることを知っていますが、それでも、#!/usr/bin/perlPerlでの重要性は何であるかを私に説明できますか?さらに、何を意味します-wか?私はPerlの初心者ですので、しばらくお待ちください。-T#!/usr/bin/perl

4

4 に答える 4

17

#!一般に「シバン」と呼ばれ、スクリプトの実行方法をコンピューターに指示します。#!/bin/shまた、またはを使用したシェルスクリプトも多数表示されます#!/bin/bash

つまり、/usr/bin/perlPerlインタープリターであり、実行され、実行するファイルが与えられます。

行の残りはPerlのオプションです。「-T」は汚染されています(フォーマットを確認するまで、入力は「信頼できない」とマークされていることを意味します)。「-w」は警告をオンにします。

詳細については、 perldoc perlrunを実行してください(perldocはPerlのドキュメントリーダーであり、インストールされている場合もあれば、独自のパッケージに含まれている場合もあります)。

あなたが書くスクリプトについては、私はそれらを以下から始めることをお勧めします:

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

これにより、多くの警告と追加のチェックがオンになります。これは、学習中に特に役立ちます(私はまだ学習中であり、Perlを10年以上使用しています)。

于 2012-06-29T06:27:09.143 に答える
6

-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は「taint」モードをアクティブにします。)

「汚染された」モードは、スクリプト内の値を再確認するように「強制」します。

例:コード:

#!/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のニックネームの1つは、「システム管理者の接着剤とダクトテープ」です。システム管理者が自分のニーズに合わせてPerlスクリプトを作成し、root権限を持って実行する可能性はほとんどありません。このスクリプトが通常のユーザーには許可されていないことを実行していると考えてください...プログラム自体の一部ではないことを再確認し、Perlにそれらについて通知させたいと思うでしょう。

それが役に立てば幸い。

于 2012-06-29T07:01:57.477 に答える
3

それはシバンと呼ばれています。Unixベースのシステム(OSX、Linuxなど)では、その行は、スクリプトがコマンドラインから実行されたときの言語インタープリターへのパスを示します。perlの場合、/ usr / bin/perlはperlインタープリターへのパスです。ハッシュバンが省略されている場合、* nixシステムは、実行可能ファイルとして呼び出されたときにスクリプトを解析する方法を認識しません。代わりに、ユーザーがたまたま実行しているシェル(おそらくbash)でスクリプトを解釈し、スクリプトを壊そうとします。

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

-Wと-Tは、perlインタープリターの動作方法を制御する引数です。これらは、コマンドラインから直接perlインタープリターを呼び出すときに呼び出すことができる引数と同じです。

  • -Wは警告(別名デバッグ情報)を示します。
  • -Tは汚染/セキュリティチェックをオンにします。
于 2012-06-29T06:29:04.870 に答える
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にディレクトリが含ま D:\perlex@INCます。

パスを追加する他の方法を試すことができます@INC。これはほんの一例です。

于 2012-06-29T08:59:05.060 に答える