2012-07-20 10 views
6

In "Programming Perl" -w Datei-Testoperator wie folgt beschrieben:Warum funktioniert der Dateitestoperator nicht (Perl)?

-w Datei durch effektive UID/GID beschreibbar ist.

Ich habe zwei Dateien:

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

suid auf script.pl gesetzt ist, so dass, wenn ich es als Benutzer caligula, effektive UID laufen/GID sollte der Testuser ist eins sein. script.pl ist:

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

Aber wenn ich es [email protected]:~$ ./script.pl der Ausgang laufen ist immer false. Warum passiert das? Vielleicht habe ich die korrekte Verwendung dieses Operators nicht verstanden?

Meine Wertschätzung.

+1

FYI: Perl 5.16.0 ist jetzt verfügbar, obwohl das alte Nachrichten für alle außer mir sein können, da die letzten Daten in der Teerkugel 2012-05-20 sind, also wurde es über dann verpackt. –

Antwort

11

Perl kann so konfiguriert werden, dass SUID-Skripte ignoriert werden; Es ist die Standardeinstellung und wahrscheinlich wie Ihre eingerichtet ist. Sie sollten die tatsächliche und effektive UID und GID im Skript drucken.

du konkret mit einem bescheiden obskuren Perl Einzeiler validieren können:

$ 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 = 
$ 

Oder etwas weniger obscurely ich jetzt den richtigen Namen gefunden haben:

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

, dass dies Dies zeigt, Perl (eine 5.12.1, die ich gebaut habe) betrachtet SUID-Skripte nicht als sicher.

Die tatsächlichen und Benutzer- und Gruppen-ID-Werte sind melde mit: RUID $<, EUID $>, RGID $( und EGID $), oder (sinnvollerweise) unter Verwendung von Englisch:

#!/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

Verwandte Themen