لماذا لا يعمل أنبوب مفتوح تحت وضع Perl؟
سؤال
البرنامج النصي الأصلي هو كما يلي:
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
. وبعد يتم تناول مشكلتك في الجملة الأولى من تنظيف طريقك الجزء.