[Cascavel-pm] Função system não executa o comando.

Luis Motta Campos luismottacampos em yahoo.co.uk
Sexta Janeiro 18 08:05:12 PST 2008


Rafael Lebrao Martins wrote:
> Bom dia, pessoal. Estou com um problema, a função system não está 
> funcionando nos meus códigos.. Coloquei em um código a linha abaixo:
> 
> system (`chmod 777 -R /var/imm/chats`);

AAAAAAHHHHH!!!!

> Mas quando acesso a o caminho "/var/imm/chats", as permissões
> continuam as mesmas... Alguém pode me ajudar?

Meu caro, teu caso é quase de camisa-de-força e umas férias de uns 5
anos no manicômio mais próximo ;) , mas eu vou tentar te colocar na
linha. Vamos aos comentários...

1. Permissões:

  Certifique-se de que você pode executar o mesmo comando, com o mesmo
usuário, à mão.

  Me envie o resultado de "ls -l /var/imm/chats"

2. Onde está o teu código? Eu vejo montes de erros nesta linha. Tantos
que meus olhos estão até ardendo... :(

2.1. Erro de conceito: nunca use permissões "777". Você não sabe o que
está fazendo.
2.2. Erro de programação: backticks (ou "crase") são operadores no perl.
Nunca use para quotar strings no programa. Se você não sabe para que
serve, não use - é perigoso.
2.3. Se você está construindo um programa, pretende rodar isso com
frequência. Isso é um erro de conceito, você deveria configurar seus
programas e sistema para permitir acesso apenas aos sistemas / programas
que precisam de acesso, não construir um programa para abrir acesso
irrestrito para alguma coisa.
2.4. usar "system()" sem conferir erros.
2.5. usar o operador de execução no shell (qx//, ou "`" - veja "perlop",
secção "Regexp Quote-Like Operators") e passar o resultado para um
"system()" - ou você é ninja, e podia estar me ensinando alguma coisa,
ou você não faz idéia do que está fazendo. CUIDADO!

3. Sugestão: RTFM, e implementa mais ou menos assim, que deve ser
seguro. ATENÇÃO: eu não testei isso, use por sua conta e risco.

#!/usr/bin/perl
use warnings;
use strict;

my @args = ( q{/usr/bin/chmod}, q{0777}, q{-R}, q{/var/imms/chats} );
system(@args) == 0
  or die "system @args failed: $?";

if ( $? == -1 ) {
    print "failed to execute: $!\n";
}
elsif ( $? & 127 ) {
    printf qq{child died with signal %d, %s coredump\n}, ( $? & 127 ),
      ( $? & 128 ) ? 'with' : 'whitout';
}
else {
    printf "child exited with value %d\n", $? >> 8;
}
__END__

Espero que isso ajude.
Se você tiver mais perguntas, eu estou à disposição.

Putamplexos!
-- 
Luis Motta Campos (a.k.a. Monsieur Champs) is a software engineer,
Perl fanatic evangelist, and amateur {cook, photographer}



Mais detalhes sobre a lista de discussão Cascavel-pm