[Cascavel-pm] captura de mensagens de programa

Ednardo Lobo ednardo em elobo.cjb.net
Segunda Março 10 10:23:15 CST 2003


On Mon, Mar 10, 2003 at 07:55:42AM -0300, Alceu R. de Freitas Jr. wrote:
> Olá Ednardo,
> 
>  --- Ednardo Lobo <ednardo em elobo.cjb.net> escreveu: >

> >     Quanto ao `exec', após sua chamada, não há retorno, seu `script'
> > perl finaliza a execução  nesse ponto. Porém, se `/usr/bin/programa'
> > não existir, nesse caso um valor falso será retornado.
> >
> >     Se o que você quer fazer for simplesmente executar um programa e
> > obter a  saída desse  programa, não precisará  criar um  pipe, basta
> > utilizar o  operador `qx//' (veja  `man perlop'). Você  poderá obter
> > tanto 'STDOUT' quanto 'STDERR'.
> >
> > 
> > -- 
> >     Ednardo Lobo - www.elobo.cjb.net
> 
> Eu obtive isso no www.perldoc.com:
> 
> "qx/STRING/ 
> `STRING` 
>
> A  string which  is (possibly)  interpolated  and then  executed as  a
> system command with /bin/sh or its equivalent. Shell wildcards, pipes,
> and redirections will be honored. The collected standard output of the
> command is returned; standard error  is unaffected. In scalar context,
> it comes back as a single (potentially multi-line) string, or undef if
> the command failed. In list context,  returns a list of lines (however
> you've defined lines with $/  or $INPUT_RECORD_SEPARATOR), or an empty
> list if the command failed.
>
> Because  backticks  do  not  affect standard  error,  use  shell  file
> descriptor syntax  (assuming the shell  supports this) if you  care to
> address this. To capture a command's STDERR and STDOUT together: "
>
> Ele funciona como `comando` e usa o shell para execução do programa. O
> modo taint  do Perl  não permite  execuções diretas  no shell.  Eu não
> tenho condições de  testar, mas utilizar qx não iria  apenas criar uma
> mensagem de erro do modo taint?
>
> Grato novamente,
>

    Se  você não  tem  controle  sobre os  parâmetros  a serem  passados
juntamente com o  'programa', sua preocupação é válida.  Não sei, porém,
lhe  apontar agora  uma solução  viável  e segura.  Experimente dar  uma
olhada em `man perlsec', talvez lá encontre uma forma de tornar o uso do
operador `qx', seguro. Como alternativa, você poderá mesclar um `pipe' e
usar `system'  ou `exec', com a  sintaxe aceita pelo modo  `taint'. Veja
trecho abaixo:

    # add error processing as above
    $pid = open(KID_TO_READ, "-|");

    if ($pid) {     # parent
        while (<KID_TO_READ>) {

            ## Peque aqui a saida do programa (child)
            $msg .= $_;
        }
        close(KID_TO_READ) || warn "kid exited $?";
    }
    else {          # child

        ($EUID, $EGID) = ($UID, $GID); # suid only
        
        exec($program, @options, @args) || die $!;
    }

-- 
    Ednardo Lobo - www.elobo.cjb.net

    Por favor, evitem enviar anexos no formato MS-Office, obrigado!
    Veja: http://www.fsf.org/philosophy/no-word-attachments.pt.html



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