2012-07-20 23 views
6

में "प्रोग्रामिंग पर्ल" -w फ़ाइल परीक्षण ऑपरेटर वर्णित के रूप में:फाइल-टेस्ट ऑपरेटर क्यों काम नहीं करता है (पर्ल)?

डब्ल्यू फ़ाइल प्रभावी यूआईडी/GID द्वारा लिखने योग्य है।

मैं दो फ़ाइलें:

-rwsrwxrwx 1 testuser testuser 226 Jul 20 20:31 script.pl 
-rw-rw-r-- 1 testuser testuser 34 Jul 14 17:24 file.txt 

suidscript.pl पर सेट है, इसलिए जब मैं उपयोगकर्ता कालिगुला, प्रभावी यूआईडी के रूप में चलाते/GID testuser के एक होना चाहिए। script.pl है:

#!/usr/bin/perl 
use v5.14; 
if (-w 'file.txt') { 
    say "true"; 
} 
else { 
    say "false"; 
} 

लेकिन जब मैंने उसे [email protected]:~$ ./script.pl चलाने उत्पादन हमेशा false है। ऐसा क्यों होता है, क्या मुझे उस ऑपरेटर के सही उपयोग को समझ नहीं आया?

मेरी प्रशंसा।

+1

FYI करें: पर्ल 5.16.0 है अब उपलब्ध है, हालांकि यह हर किसी के लिए पुरानी खबर हो सकती है क्योंकि टैर बॉल में हालिया तिथियां 2012-05-20 हैं, इसलिए इसे तब तक पैक किया गया था। –

उत्तर

11

पर्ल कॉन्फ़िगर किया जा सकता है ताकि SUID स्क्रिप्ट को अनदेखा किया जा सके; यह डिफ़ॉल्ट है, और संभावना है कि आपका सेट कैसे स्थापित किया गया है। आपको स्क्रिप्ट में वास्तविक और प्रभावी यूआईडी और जीआईडी ​​प्रिंट करना चाहिए।

आप वस्तुतः एक विनय अस्पष्ट पर्ल एक लाइनर के साथ इस मान्य कर सकते हैं:

$ perl -MConfig -e 'foreach $key (keys %Config) { print "$key = $Config{$key}\n"; }' | 
> grep -i -e 'se*t*[ug]id' 
d_dosuid = 
d_setresgid = define 
d_setresuid = define 
d_suidsafe = 
$ 

या, थोड़ा कम प्रच्छन्नतापूर्वक अब मैं सही नाम मिल गया है:

$ perl -MConfig -e 'print "d_suidsafe = $Config{d_suidsafe}\n"' 
d_suidsafe = 
$ 

यह इस से पता चलता है कि पर्ल (एक 5.12.1 जो मैंने बनाया है) SUID स्क्रिप्ट को सुरक्षित के रूप में नहीं मानता है। अंग्रेजी का उपयोग कर RUID $<, EUID $>, RGID $( और egid $), या (अधिक समझदारी से):

वास्तविक और प्रभावी उपयोगकर्ता और समूह आईडी मूल्यों के साथ समाचार-योग्य हैं

#!/usr/bin/env perl 
use English '-no_match_vars'; 
print "EUID = $EUID; RUID = $UID; EGID = $EGID; RGID = $RGID\n"; 
+4

'perl -V: '। * Se * t * [ug] id। *' '///perl -V: d_suidsafe' – ikegami

संबंधित मुद्दे