Jump to content

Problema ao enviar dados para shell e executar um *.exe


saramgsilva
 Share

Recommended Posts

saramgsilva

Boas,

é o seguinte eu tenho andado a tentar implementar o seguinte: (é para outro fim mas quero aprender a fazer o básico )

tenho uma pagina com um form e a respectiva textarea onde vou inserir um valor, e primo o botão somar, ao primir, um outro ficheiro de php, vai mandar o valor inserido para a shell e depois manda executar um programa que tenho em C, que consiste em ler 1 numero e somar o numero com 4, sim muito simples....

O programa executa, e recebo o resultado, o problema está é que não consigo fazer com que o exe receba o valor que mando.... não percebo porque... já tentei várias coisas que ja nem sei as quantas ando...

Deixo aqui o meu codigo, para me poderem dar uma ajuda  :dontgetit:

indextofas.html


<form action="executatofas.php" method="POST">

<TABLE align=center>
  <TBODY>


  <TR align=middle>
     <TD> </A> </TD>
     <TD>Mensagem <HR></TD>
     <TD> </A> </TD>

  </TR>

  <TR align=middle>
     <TD> </A>  </TD>
  
     <TD><TEXTAREA name="numero" rows=5 cols=28></TEXTAREA></TD>
     </TR>

  <TR align=middle>
     <TD> </A> </TD>
     <TD> <INPUT TYPE="submit" VALUE="Somar">  <INPUT TYPE="reset" VALUE="Reset">  </TD>
  </TR>
  
  </TBODY>
  </TABLE>

executatofas.php

<? 


$numero=$_POST['numero'];

echo $numero;

// para enviar para a Shell 
$e = escapeshellcmd($numero);


// para mandar executar 
$ret= shell_exec("soma");
echo $ret;


?>

e deixo em anexo o exe que estou a usar e o respectivo codigo.....

obrigada

tofas  :)

Link to comment
Share on other sites

Ped@ntilva

Eu nunca fiz algo do genero mas vou tentar dar uma ajudinha.

Tu estas a chamar o programa em c atraves do

$ret= shell_exec("soma");

Mas onde é que o programa recebe o

scanf("%d",&a);

é no

$e = escapeshellcmd($numero);?????

Link to comment
Share on other sites

saramgsilva

ja me disseram qual era 1 dos problemas:

no programa em C, tenho que fazer: int main (int argc, char * argv[] ){ ..... }

e eu estava a fazer int main(){ ....}

e depois no php tambem estou a fazer algo mal, ja ainda nao vi o que era...tenho que ver...

$e = escapeshellcmd($numero); 

-> para mandar o valor para a shell...

$ret= shell_exec("soma");

  acho que falta aqui algo....  :P

Link to comment
Share on other sites

fico perplexo com a qualidade de coding em c

no programa em C, tenho que fazer: int main (int argc, char * argv[] ){ ..... }

e eu estava a fazer int main(){ ....}

nao necessariamente

ate podia fazer:

int main (int conchina1, char **painatal2) {

...

}

O que realmente importa saber é que a primeira variavel recebe o numero de argumento e devera ser declarada como um inteiro, a segunda var recebe ou aponta para os argumentos passados.

Os nomes que das as variaveis é indiferente!

Por convençao costuma-se dar argc (argument counter) e argv.

Já agora é de referir que ainda pode ser usado outra variavel para armazenar o ambiente.

Comando env em unix.

ficaria algo do genero

int main(int argc,char *argv[],char *env[])

Ou entao podes trata-lo com apontador, isso ja depende do que precisas.

Quanto ao PHP teras que enviar alem do nome do programa tb os argumentos!

Nao me parece que estejas a fazer isso.

Link to comment
Share on other sites

Não consegui sacar o rar anexo (como não consigo sacar nenhum ficheiro anexo neste fórum  ;)), por isso não sei o que lá fizeste e vou falar às cegas.

no ficheiro php:

$e = escapeshellcmd($numero);

Esta linha "só" serve para segurança; o que faz é retornar uma string que seja segura para passar ao sistema operativo, isto é, que não permita executar outros comandos ao executar o "outro" programa. Ou seja, essa linha não envia absolutamente nada para lado nenhum. Para enviares o valor para o teu programa, tens que incluir o $e em:

$ret= shell_exec("soma $e");

É aqui que entram os argumentos da função main: argc e argv, que como já foi dito só têm esses nomes por convenção, e podem ser substituídos por quaisquer outros. Já agora, argv significa "argument values" ou "arguments vector", conforme o gosto.

Ao fazeres shell_exec("soma $e"), argc ficará com o valor 2 (o nome do programa também é um argumento), e o array argv ficará com "soma" no índice 0, e o valor de $e no índice 1. Se tivesses mais argumentos, iriam para as posições seguintes do argv, e argc tambem seria incrementado (obviamente ::P )

Desaparecido.

Link to comment
Share on other sites

saramgsilva

TheDark  pois...estava a fazer asneiras...mas ainda não consigo  ;)

index.php

<form action="executatofas.php" method="POST">

<TABLE align=center>
  <TBODY>


  <TR align=middle>
     <TD> </A> </TD>
     <TD>Mensagem <HR></TD>
     <TD> </A> </TD>

  </TR>

  <TR align=middle>
     <TD> </A>  </TD>
  
     <TD><TEXTAREA name="numero" rows=5 cols=28></TEXTAREA></TD>
     </TR>

  <TR align=middle>
     <TD> </A> </TD>
     <TD> <INPUT TYPE="submit" VALUE="Somar">  <INPUT TYPE="reset" VALUE="Reset">  </TD>
  </TR>
  
  </TBODY>
  </TABLE>
  </form>

executa.php


<? 


$numero=$_POST['numero'];


echo $numero;


$ret= shell_exec("soma $numero");
echo $ret;


?>

código C : somar.c

#include<stdio.h>


int main(int argc, char * argv[] )
{
     int a=0;
     int soma;
 a=argc;
     printf("Escreva dois inteiros 'a' -- > \n");
     // scanf("%d",&a);  removi isto... :/
     soma=a+4;
     printf(" -- A soma=%d\n",soma);
     
return 0;                       
}
Link to comment
Share on other sites

ai meu deus

se lesses o meu post

argc (argument counter) simplesmente tem o numero de argumentos passados

os argumentos em si estao contidos no argv, o que te interessa neste caso esta no argv[1]

mas atencao é uma string nao podes simplesmente fazer a=argv[1]; !!!

usa a atoi para converter para um inteiro

gosto da tua assinatura 'imagem' Pascal C HTML SQL JAVA C++ PHP, se fosse a ti acrescentava a C e C++ (muito básico)

Link to comment
Share on other sites

saramgsilva

ai meu deus

se lesses o meu post

Tinha lido...mas na hora de implementar não li outra vez e por isso fiz asneiras... Até mesmo o TheDark disse o mesmo, mas pensei mal quando tentei resolver....  ?  😕

argc (argument counter) simplesmente tem o numero de argumentos passados

os argumentos em si estao contidos no argv, o que te interessa neste caso esta no argv[1]

mas atencao é uma string nao podes simplesmente fazer a=argv[1]; !!!

usa a atoi para converter para um inteiro

já corri e já implementei... e já funciona!!!!  :P

Solução:

index.php

<form action="executatofas.php" method="POST">

<TABLE align=center>
  <TBODY>


  <TR align=middle>
     <TD> </A> </TD>
     <TD>Mensagem <HR></TD>
     <TD> </A> </TD>

  </TR>

  <TR align=middle>
     <TD> </A>  </TD>
  
     <TD><TEXTAREA name="numero" rows=5 cols=28></TEXTAREA></TD>
     </TR>

  <TR align=middle>
     <TD> </A> </TD>
     <TD> <INPUT TYPE="submit" VALUE="Somar">  <INPUT TYPE="reset" VALUE="Reset">  </TD>
  </TR>
  
  </TBODY>
  </TABLE>
  </form>

executa.php


<? 


$numero=$_POST['numero'];


echo $numero;


$ret= shell_exec("soma $numero");
echo $ret;


?>

código C : somar.c

#include<stdio.h>
#include<stdlib.h>

int main(int argc, char * argv[] )
{
     int a=0;
     int soma;


 a=atoi(argv[1]);

     printf("Escreva dois inteiros 'a' -- > \n");
     // scanf("%d",&a);  removi isto... :/
     soma=a+4;
     printf(" -- A soma=%d\n",soma);
     
return 0;                       
}
     
}

E já percebi como funciona!!  ;)

Para acabar o meu post:

gosto da tua assinatura 'imagem' Pascal C HTML SQL JAVA C++ PHP, se fosse a ti acrescentava a C e C++ (muito básico)

Quando tiveres comentários destes, peço te que me mandes mensagem privada! Pois não gostei nada de ler o que escreveste...

É triste comentários do género.... e olha nem comento mais porque coisa destas... nem merecem comentário...  :nono1:

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.