[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