PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [PERL] CHOWN auf symbolische Links macht Probleme



ClausVB
09-09-2006, 13:42
Ich habe einen erfolgreichen CHOWN und einen nicht erfolgreich durchgeführt wird:


if (chown($ug_id, $ug_id, $dir_virtual_statistik))
{
print chown($ug_id, $ug_id, $dir_virtual_statistik . '/webalizer');
print "Der CHOWN für die SYMLINKs \"webalizer\" und \"logfiles\" war erfolgreich!\n";
}

$ug_id = 1120 # ug_id => u = user, g = group

Der zweite CHOWN gibt zwar eine 1 zurück, aber er ändert die Rechte nicht.


drwxr-xr-x 2 1120 1120 104 Sep 9 14:23 .
drwxr-xr-x 3 1120 1120 88 Sep 9 14:23 ..
lrwxrwxrwx 1 root root 62 Sep 9 14:23 logfiles -> /home/user120/webspace/logfiles/session.user120.de/apache2
lrwxrwxrwx 1 root root 70 Sep 9 14:23 webalizer -> /home/user120/webspace/statistics/web/session.user120.de/webalizer
(...)
drwxr-xr-x 2 1120 1120 104 Sep 9 14:23 session.user120.de
pcl3129:/htdocs/perl_einfuehrung/sessionnet #

Hinweis: Da die UID=1120 (und GID ebenfalls) nur auf dem Produktionsystem existieren, steht hier als Eigentümer wirklich die Zahl und nicht irgendein Name.

Fragen: Während das Verzeichnis ordentlich geändert werden, bleibt "webalizer" auf ROOT-Rechten stehen. Liegt das an den symbolischen Links?
Was muss ich tun, damit beide symbolischen Links auch 1120 gehören?

Danke und Gruß
Claus

undefined
09-09-2006, 15:11
Kennt das Perl module --dereference?

ClausVB
09-09-2006, 15:37
Kennt das Perl module --dereference?

Nein, ich fürchte nicht.

perldoc -f chown

chown LIST
Changes the owner (and group) of a list of files.
The first two elements of the list must be the
numeric uid and gid, in that order. A value of -1
in either position is interpreted by most systems
to leave that value unchanged. Returns the number
of files successfully changed.

$cnt = chown $uid, $gid, 'foo', 'bar';
chown $uid, $gid, @filenames;

Here's an example that looks up nonnumeric uids in
the passwd file:

print "User: ";
chomp($user = <STDIN>);
print "Files: ";
chomp($pattern = <STDIN>);

($login,$pass,$uid,$gid) = getpwnam($user)
or die "$user not in passwd file";

@ary = glob($pattern); # expand filenames
chown $uid, $gid, @ary;

On most systems, you are not allowed to change the
ownership of the file unless you're the superuser,
although you should be able to change the group to
any of your secondary groups. On insecure sys-
tems, these restrictions may be relaxed, but this
is not a portable assumption. On POSIX systems,
you can detect this condition this way:

use POSIX qw(sysconf _PC_CHOWN_RESTRICTED);
$can_chown_giveaway = not sysconf(_PC_CHOWN_RESTRICTED);

ClausVB
09-09-2006, 16:04
Google zeigt zum oben genannten Stichwort in Verbindung mit Perl auch keine Hilfe.

Ich habe es jetzt jedoch einen Workaround hinbekommen:


print system("chown -h $ug_id.$ug_id $dir_virtual_statistik/*") . "\n";

ergibt


drwxr-xr-x 2 1120 1120 104 Sep 9 15:34 .
drwxr-xr-x 3 1120 1120 88 Sep 9 15:34 ..
lrwxrwxrwx 1 1120 1120 62 Sep 9 15:34 logfiles -> /home/user120/webspace/logfiles/session.user120.de/apache2
lrwxrwxrwx 1 1120 1120 70 Sep 9 15:34 webalizer -> /home/user120/webspace/statistics/web/session.user120.de/webalizer


und das ist natürlich dann auch richtig, aber ich wäre schon an einer "richtigen" Perl-Lösung interessiert.

Gruß
Claus