質問

多くのプログラマを書くようにします:

sub copy_file ($$) {
  my $from = shift;
  my $to = shift;

  `cp $from $to`;
}

この悪いるか。すべbackticksっても大丈夫ですか?どうすれば良いですか。

役に立ちましたか?

解決

数人既述のとおりでご利用くださbackticks時:

  • 必要なものをキャプチャー(またはsupress)の出力に出力します。
  • 存在しない内蔵の機能が必要とするPerlモジュールと同じタスクの割り当て、お持ちの良い理由を使用しないモジュールですのでお問い合わせ下さい。
  • まsanitiseご入力します。
  • チェックを返します。

残念ながら、などをチェックする返り値 適切に す可能性があることが難しいものです。かったので金型へ"をクリックしますなにが返っ口状況を教えてほしい。標準の方法という解釈する $? は何か。

今お使いになることをお勧めし IPC::システム:シンプルな モジュールの capture()system() 機能によbackticks.の capture() 機能と同じように動作backticks外:

  • 詳しい診断法の場合、コマンドで起動させるのではなく、死による信号を返します予期せぬ出口より値とします。
  • 詳しい診断グループにおきまして汚染されたデータです。
  • でい勝手が飛躍的に向上機構を指定するための許容口値です。
  • ることができるコbackticksなシェルがしたいです。
  • 提供する信頼のメカニズムを回避するシェルを利用した場合でも、単一の引数に使います。

コマンドの仕事も一貫して全体の経営システムのPerlバージョンとは異なり、Perlの system() につながらないチェックのための汚染データが呼び出される複数の引数に古いバージョンのPerl(例えば、5.6.0複数の引数、または電話のシェルとにかく下です。

例えば、次のコードスニペットされるようになってきた結果の呼び出し perldoc には、スカラ、回避のシェルが例外をスローした場合のページには見られない(perldocを返します1)です。

#!/usr/bin/perl -w
use strict;
use IPC::System::Simple qw(capture);

# Make sure we're called with command-line arguments.
@ARGV or die "Usage: $0 arguments\n";

my $documentation = capture('perldoc', @ARGV);

IPC::システム:シンプルな は純Perl、5.6.0以上、ない依存関係のない通常はごPerl。(Windows上では異なり、Win32::モジュールに付属の両ActiveStateとStrawberry Perl).

免責事項:私の著書である IPC::システム:シンプルな, ではあるがバイアスが存在します。

他のヒント

ルールはシンプルです:使用しなbackticksを見つけることができれば、内蔵の仕事場を強化するためのモジュールはCPANされたメールが届きました。Backticksに頼っていることが多いunportableコードの場合にもuntaintの変数でも楽しく安全保障穴があります。

ない 利用backticksユーザーデータのない限り、非常に緊密に指定したえさせなどには許可しない--まださい!これは非常に危険です。

Backticksそのためには何をしなければな限りが必要な場合の出力のコマンドです。その他、システム()を使用する必要があります。もちろん、場合がありPerlの機能またはCPANモジュールは、仕事では、この使われます。

いずれの場合も、二つのことを推奨しています:

第一に、 サニタイズすべての入力: 使用痕モードマイナーアクチノイドの場合のコードは可能で信頼できない入力します。でもいない場合は、必ず取扱い又は予防に)ファンキーのように文字をスペースは、三種類のお見積させていただきます。

第二に、 チェックを返しコード かどうかを確認するためにコマンドは成功です。ここで、制御することが可能である。い:

my $cmd = "./do_something.sh foo bar";
my $output = `$cmd`;

if ($?) {
   die "Error running [$cmd]";
}

別に取り込むことができ標準出力に出力し、pidと口がありましたので、以下の通り利用 IPC::Open3 possibily自身の利用の両方のシステムbackticks.

利用backticksいたい場合、収集の出力からコマンドです。

その他 system() であり、特に必要がない場合に呼び出すシェルを扱うmetacharactersまたはコマンドの解析.させないように指定できますことを渡すことによってリストシステム()ので、例えば system('cp', 'foo', 'bar') (しんしょうがどのように利用のためのモジュールと 特に 例))

Perlでは、常にあるようです。第一の点backticksの標準出力に出力のシェルコマンドへのPerlに変更します。(例では、何をするにも、cpコマンドで印刷され、呼び出し側に返します。) 下振れを使用backticksおばんチェックのシェルコマンドの戻り値;cpなり失敗するかもしれませんやまなします。利用することができる特別Perl変数$?.りたいときに実行シェルコマンドを使う システム:

system("cp $from $to") == 0
    or die "Unable to copy $from to $to!";

も見ることがファイル名を埋め込み空間のものではないかと思いばいいのかわからないポイントの問題をもたらしていました。)

この不自然に例がbackticksに有効と考えられる:

my $user = `whoami`;
chomp $user;
print "Hello, $user!\n";

ですが、より複雑な場合などでもお使いいただけます open パイプ:

open WHO, "who|"
    or die "who failed";
while(<WHO>) {
    # Do something with each line
}
close WHO;

から"perlop"manpage:

なるべきかけ お帰りながbackticks 彼らはとの付き合い方"について考える何かを得られ 行われます。Perlすることがあったのは、接着剤 言語のもので 接着剤とはできません。だけで かりいただけます 自分自身です。

の場合を示すの ファイルのコピー モジュールでしょう。しかし、今のご質問につい走行システムコマンドI通常、信頼 IPC::Run3.この機能などの収集を返しコードの標準エラー出力に出力します。

を行うなどsanitising入力-確認の返り値が、必ず呼び出すあらゆる外部プログラムとその明示的にフルパスです。例えば言

my $user = `/bin/whoami`;

または

my $result = `/bin/cp $from $to`;

言わば"whoami"または"cp"のリスクを誤って実行コマンドのその他の使用の場合、ユーザーの経路の変化-セキュリティの脆弱性を悪意のある攻撃者がこの試みを.

おとえば、悪いがありますのperl builtinsいる携帯通常よりも効率的なbacktickます。

いる場合にのみ使用する必要がありPerlが組み込み(またはモジュール)。この両方のためのbackticksシステム)。Backticks目的のために捕獲出力の実行コマンドです。

Backticksはないとみられる場合に用いる撮出力に出力します。しこ"を見からどうするかは考えものだ。" その手がかりもでコードをこんがとても身近にPerlです。

利用backticksしたい場合に捕獲出力に出力します。利用システムを行い、さらには、コマンドです。一点だけゲインをする機能をチェックを返します。モジュラー-システムを採用が可能。この場合、ファイルのコピーを請求されます。

総合的に評価すると、使用 システム の代わりにbackticksするためには、多くの

  1. システム を呼び出し側に返しコードのコマンドです。

  2. システム できる"間接的なオブジェクト"の表記は、より安全を追加します。

  3. Backticksは文化的に縛られるシェルスクリプティングができない共通の読者のコードです。

  4. Backticks使用最小限の構文が何できる重いコマンドです。

このユーザーがtemped利用backticksの代わりに システム は非表示を標準出力に出力します。これにより簡便かつ柔軟によ替を標準出力に出力ストリーム:

my $cmd = 'command > /dev/null';
system($cmd) == 0 or die "system $cmd failed: $?"

さらに、くSTDERRは簡単:

my $cmd = 'command 2> error_file.txt > /dev/null';

場で使用backticksへの応用 qx{} めることが重-重量コマンドすることができました。

一方、別の言い方なんです。りだけどコマンド印刷を標準出力に出力します。Backticksとして用いる場合、シェルスクリプトのツール。

Perlによって制限されることがあり個性を表します。一方でスクリプティングすることができる言語に置き換えを使用しています。このようなので観察の結果、利用backticksは便利です。

用いた場合、プログラミング言語backticksは避けてください。この不足エラー チェックが別のプログラムbackticksを実行する可能性があることを効率が のを得ることができました。

ほかには、上記のシステム機能するために使用されるコマンドの出力が使用されていません。

Backticksは、アマを問いません。の防弾溶液である"安全管を開く"参照"男perlipc").まexecコマンドを別のプロセスできる第futzとSTDERR,setuid。メリット:とまりん ない 信頼のシェルの解析を@ARGVとは異なり、オープン("$cmd$(<%=args%>等:args|")は、大きなばらつきを持っています。できるリダイレクトSTDERRを変更ユーザー priviligesを変えずに行動のメインプログラムを置きます。これはデフォルト値が設定されよbackticksができるラップで自分のバランス良くかみ合うrun_cmd($cmd@(<%=args%>等:args);


sub run_cmd {
  my $cmd = shift @_;
  my @args = @_;

  my $fh; # file handle
  my $pid = open($fh, '-|');
  defined($pid) or die "Could not fork";
  if ($pid == 0) {
    open STDERR, '>/dev/null';
    # setuid() if necessary
    exec ($cmd, @args) or exit 1;
  }
  wait; # may want to time out here?
  if ($? >> 8) { die "Error running $cmd: [$?]"; }
  while (<$fh>) {
    # Have fun with the output of $cmd
  }
  close $fh;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top