لماذا لا يعمل أنبوب مفتوح تحت وضع Perl؟

StackOverflow https://stackoverflow.com/questions/964426

  •  12-09-2019
  •  | 
  •  

سؤال

البرنامج النصي الأصلي هو كما يلي:

my $cmd = "dir";
open (H, "$cmd |");
my @result = <H>;
close (H);
print STDERR @result,"\n";

هذه النصوص تعمل بشكل جيد. إذا أضفت السطر التالي إلى البرنامج النصي، فافشل في العمل:

$ENV{"LD_LIBRARY_PATH"} = "/opt/VRTSsfmh/lib";
$ENV{PATH}="/usr/bin:/bin:/sbin:/usr/sbin";
delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};

ماذا يستخدم بيرل عند استدعاء فتح الأنابيب؟

إضافة التعليمات البرمجية التالية المشكلة:

if ($^O =~ /Win32/i) 
{
    $ENV{'SystemRoot'} =~ /([A-Z]:(\\[A-Za-z0-9_]+)+)/;
    my $system32_dir = $1."\\system32";
    $ENV{'PATH'} = $system32_dir;
}
هل كانت مفيدة؟

المحلول

سؤالك لا يرتبط حقا وضع التشغيل. تعيين

$ENV{PATH}="/usr/bin:/bin:/sbin:/usr/sbin";

هذه الدلائل لا توجد عادة على جهاز Windows. dir هو أمر داخلي CMD.EXE حتى تكون قادرا على تنفيذ ذلك، تحتاج إلى إضافة الدليل الذي يتواجد فيه على المسار.

الآن، لاحظ أن الطريقة التي تذهب بها عن القيام بذلك تتناقض مع نقطة تحديد الطريق إلى المواقع المحددة المعروفة. من الممكن بالتأكيد لمستخدم Nfarious لتغيير متغير البيئة هذا للإشارة إلى إصداره الخطير من dir.

حقيقة أن Windows غير مثبت بالضرورة في C: Windows يعقد كتابة برنامج نصي آمن على نظام التشغيل Windows إذا كنت تعتمد على أي من مائل شل.

تعديل: فيما يلي برنامج اختبار قصير يمكنك استخدامه كأساس:

#!/usr/bin/perl -T

use strict;
use warnings;

$ENV{PATH} = join(';', qw(C:\Windows C:\Windows\System32) );
delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};

open my $pipe_h, '-|', 'dir'
    or die "Cannot open pipe to dir: $!";

print while <$pipe_h>;

close $pipe_h
    or die "Cannot close pipe to dir: $!";

__END__

C:\Temp> perl -T v.pl

...

2009/05/25  08:58 AM             3,584 zzz.exe
              64 File(s)     32,125,365 bytes
              14 Dir(s)  39,251,894,272 bytes free

في الأساس، ما تحتاجه هو مسؤول النظام على تشغيل المسار المقبول في وقت التثبيت والمستخدمين غير الموثوق بهم على أذونات الكتابة على البرنامج النصي.

نصائح أخرى

وضع تشويه معقد. أنت حقا يجب أن تقرأ وفهم perldoc perlsec. وبعد يتم تناول مشكلتك في الجملة الأولى من تنظيف طريقك الجزء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top