[Cascavel-pm] Duvida com exec

Alexei Znamensky russoz em gmail.com
Terça Agosto 12 14:18:32 PDT 2008


Agustinho,

Você precisa ler as coisas com mais cuidado. Se você leu sobre o exec()
antes de tentar, deveria saber que ele jamais iria funcionar, pois (de novo)
A FUNÇÃO JAMAIS RETORNA.

Sobre o system(), I quote (http://perldoc.perl.org/functions/system.html):

Note that argument processing varies depending on the number of arguments.
If there is more than one argument in LIST, or if LIST is an array with more
than one value, starts the program given by the first element of the list
with arguments given by the rest of the list. If there is only one scalar
argument, the argument is checked for shell metacharacters, and if there are
any, the entire argument is passed to the system's command shell for parsing
(this is /bin/sh -c on Unix platforms, but varies on other platforms). If
there are no shell metacharacters in the argument, it is split into words
and passed directly to execvp , which is more efficient.

Aparentemente você não manja muito de como funcionam as coisas. Então o tio
vai explicar pra você:

my @ping = ("ping" , "-c4" , "192.168.0.222" , " " , "\>" , " " ,
"/dev/null\>2\&1");

Seguindo o que está escrito ali em cima, você está chamando ping com 6
argumentos:

0 "-c4"
1 "192.168.0.222"
2 " "
3 "\>"
4 " "
5 "/dev/null\>2\&1"

dos quais o ping consegue trabalhar (utilmente) apenas #0 e #1. Os #2 e #4
são ignorados. O arg #3 é um erro, o ping não sabe o que fazer com isso, mas
provavelmente ele está sendo bonzinho e deixando passar. O #5 é o mais
engraçado de todos, pois começa com um nome de arquivo, depois caracteres
especiais, no wonder o perl dá host unknown.

Quem interpreta os caracteres especiais da linha de comando, em particular
os de redirecionamento ( > < >& ) é o SHELL (seja ele sh, ksh, bash, csh,
tcsh, etc...), e não os programas que são invocados. Aqui é um diferença
básica de design entre windows/dos e unix: no império do mal, cada comando é
responsável por expandir os caracteres especiais na linha de comando, não
sei se todos, mas pelo menos * e ?.

Ou seja, se você não tiver um shell sendo rodado, você não tem
redirecionamento. Pelo perlpod de system(), você NÃO TEM um shell sendo
invocado quando você passa uma lista de parâmetros. Se você quiser ter
redirecionamento, tem de passar tudo como uma coisa só:

my $cmd = "ping -c4 192.168.0.222 \>/dev/null  \>2\&1";
system($cmd);

pois, de acordo com a semântica do system(), sendo invocada com apenas um
parâmetro, esta função irá chamar o shell (/bin/sh -c no caso do Unix). De
qualquer maneira, é um jeito bem tosco e pouco portável de verificar se o
host está up.

Sugestões de leitura:

http://search.cpan.org/~ferreira/Shell-0.72/Shell.pm
http://search.cpan.org/~chorny/Net-Ping-External-0.12/External.pm
http://search.cpan.org/~rcaputo/POE-Component-Client-Ping-1.14/Ping.pm

HTH

Cheers,
Russo

2008/8/12 Agustinho Coelho <agustinho_coelho em yahoo.com.br>

>
> RTFM:
>
>        exec LIST
>        exec PROGRAM LIST
>                The "exec" function executes a system command and never
> returns-- use "system" instead of "exec" if you
>                want it to return.  It fails and returns false only if the
> command does not exist and it is executed
>                directly instead of via your system's command shell (see
> below).
>
> []s,
> Russo
>
>
> Russo,
>
> Eu li o manual e já tinha tentado antes do exec() usar o system() de
> diversas maneiras mas sem conseguir o efeito desejado. Achava que justamente
> por não retornar uma saída ele fosse mais simples. Segue o código como
> estava com o system() (seguindo exemplo do próprio perldoc):
>
> #/usr/bin/perl -w
>
> use strict;
> use warnings;
>
> my @ping = ("ping" , "-c4" , "192.168.0.222" , " " , "\>" , " " ,
> "/dev/null\>2\&1");
> my @mailup = ("sendmail" , "-f" , "user\@host.com.br"<user%5C em host.com.br>, "-t" ,
> "user\@host.com.br" <user%5C em host.com.br> , " " , "\<" , " " ,
> "/home/bkpuser/netmailup.txt");
> my @maildown = ("sendmail" , "-f" , "user\@host.com.br"<user%5C em host.com.br>, "-t" ,
> "user\@host.com.br" <user%5C em host.com.br> , " " , "\<" , " " ,
> "/home/bkpuser/netmaildown.txt");
>
> system (@ping);
>
> if ( $? == 0 ) {
>         system (@mailup);
> } else {
>         system (@maildown);
> }
>
> Eu tentei escapar todos os caracteres duvidosos, tentei interpolar de
> várias maneiras, mas sem sucesso algum. Ele sempre apresenta os seguintes
> erros:
> *sh: 1: command not found* ou *ping: unknown host >
> *
>
> Agustinho,
>
> Verifique se o 'script' esteja encontrando o comando 'mail', passe o
> caminho completo do
> comando, como por exemplo '/usr/bin/mail', e verifique se está funcionando
> na linha de
> comando também.
>
> Para não depender da tua máquina, que pode ter outros problemas, utilize o
> Mail::Sender,
> segue um exemplo:
>
> my $sender = new Mail::Sender { smtp => 'mail.servidor.com.br',
>                                from => 'Alerta
> <naoresponder em servidor.com.br> <naoresponder em servidor.com.br>',
>                                auth => 'LOGIN',
>                                authid => 'alerta em servidor.com.br',
>                                authpwd => 'senha_do_usuario_alerta',
>                                headers => "MIME-Version:
> 1.0\r\nContent-type: text/html\r\nContent-Transfer-Encoding: 7bit"
>                                };
>
> if (ref ($sender->MailMsg( { to=> "voce em servidor.com.br"<voce em servidor.com.br>,
> subject => "Titulo", msg => "Mensagem",   }) {
>  print "Alerta enviado.";
> }
>
> Abs,
> -Thiago Rondon
>
>
> Tiago,
>
> Valeu pela ajuda cara, mas eu já tinha tentando o Mail:Sender (é que eu
> acabei colocando o nome dos módulos do debian + libemail-send-perl +). Mas
> não tinha entendido direito, com o exemplo que você deu ficou um pouco mais
> claro, mais ainda preciso realizar o ping para verificação do host. :)
>
>
> Reforço a idéia do Champs. Mesmo que seja mais rápido mandar emails dessa
> forma (o que pode não ser o caso) você vai abrir brechas de segurança.
>
> Escrevi um artigo a um bom tempo atrás no http://www.perl.org.br sobre
> esse assunto. Dê uma olhada lá.
>
> []'s
>
> --
> Alceu Rodrigues de Freitas Junior
> ---
> glasswalk3r em yahoo.com.br
> "when you don't create things, you become defined by your tastes rather
> than ability. Your tastes only narrow and exclude people. So create."
>
>
> Alceu,
>
> Eu procurei pelos seus artigos (inclusive li alguns para iniciantes - eu -
> e achei muitas coisas boas) mas não encontrei especificamente este que trata
> sobre emails. Em que caso especificamente você diz que tem brechas?
>
>
> Mais uma vez obrigado a todos!
>
>
> _______________________________________________
> Cascavel-pm mailing list
> Cascavel-pm em pm.org
> http://mail.pm.org/mailman/listinfo/cascavel-pm
>



-- 
Alexei Znamensky [russoz_gmail_com] [russoz.wordpress.com] [
www.flickr.com/photos/alexeiz]
"Though we live in trying times, we're the ones who have to try"
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/cascavel-pm/attachments/20080812/321e11d0/attachment-0001.html>


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