chown function em Perl

5

Eu tenho problemas com o funcionamento da função chown em Perl. Eu tenho um script:

#!/usr/bin/perl

$file   = "";
$file   = $ARGV[0];

$user   = "jboss";
$group  = "jboss";

if ($file eq "")
{
    print "Syntax: $0 <file>\n";
    exit 0;
}

@file = ($file);

print "Chowning the file $file to $user:$group\n";

$number = chown $user, $group, "$file";

print "Number of ownerships changed: $number\n";

exit 0;

O SELinux está ativado e permissivo, mas:

root# ls -l file 
-rw-r--r--. 1 root root 0 Jul 26 10:27 file  
root# id -a jboss uid=666(jboss) gid=666(jboss) groups=666(jboss)  
root# perlchown_file.pl file   
Chowning the file file to jboss:jboss  
Number of ownerships changed: 1  
root# ls -l file 
-rw-r--r--. 1 root root 0 Jul 26 10:27 file

Pergunta: o que eu sinto falta aqui? Claro que você pode escrever um qx ("/ usr / bin / chown jboss: jboss") aqui, mas o ponto principal aqui é usar uma função mais independente da plataforma aqui, e não uma citação backtick

    
por Willem 26.07.2013 / 10:35

2 respostas

11

A função chown do Perl espera um uid / gid numérico em vez de um nome de usuário / grupo. Veja perldoc -f chown .

Para obter o uid do nome de usuário e do gid do nome do grupo, você pode usar as funções getpwnam e getgrnam da seguinte forma:

my $uid = getpwnam $user_name;
my $gid = getgrnam $group_name;
chown $uid, $gid, $file_name;
    
por 26.07.2013 / 10:45
3

Se você tivesse usado use warnings; , teria recebido uma mensagem de erro reclamando:

Argument "jboss" isn't numeric in chown...

Isso teria lhe dado a dica de que você precisava de UID e GID em vez de usuário e grupo. É sempre uma boa ideia iniciar cada script Perl com use warnings e use strict .

    
por 01.11.2013 / 17:47

Tags