Page 1 sur 1

exec

Posté : 11 nov. 2005, 13:21
par alcofribas
Rebonjour,

Je suis au bord du gaz... J'ai un binaire appelé "request" qui est appelé par un script nommé call_request.php. Lorsque je lance ce scritp, il me dit que l'exécutable n'existe pas.
J'ai vérifié le chemin, le chmod, le safe_mode, que le fichier est bien exec avec _is_executable(), et qu'il existe bien là où il est. Mais, non, rien.
Pouvez-vous faire qqc pour moi s'il vous plaît?

Posté : 11 nov. 2005, 20:58
par Invité
Personne n'a d'idée sur ce qui peut clocher?

Posté : 11 nov. 2005, 22:30
par Cyrano
D'idée, pas vraiment, il faudrait avoir une viision de l'arborescence des fichiers, et le bout de code incriminé: il faudrait aussi vérifier si tu ne fais pas appel à des fonctions désactivées par ton hébergeur

Posté : 14 nov. 2005, 15:25
par alcofribas
Bon,

Au bout d'une semaine de vaine communication avec la hotline d'Atos, je me résouds à vous envoyer le code qui pourrait clocher.
Quelles sont les fonctions qui pourraient être désactivées sur mon hébergement pour qu'un exec ne fonctionne pas?

Voici le code:
<!--	Affichage du header html	-->
 <?php

	print("<HTML><HEAD><TITLE>CYBERPLUS - Paiement Securise sur Internet</TITLE></HEAD>");
	print("<BODY bgcolor=#ffffff>");
	print("<Font color=#000000>");
	print("<center><H1>Test de l'API plug-in CYBERPLUS</H1></center><br><br>");


	//		Affectation des paramËtres obligatoires

	$parm="merchant_id=xxxxxxxxx";
	$parm="$parm merchant_country=fr";
	$parm="$parm amount=100";
	$parm="$parm currency_code=978";


	// Initialisation du chemin du fichier pathfile (‡ modifier)
	    //   ex :
	    //    -> Windows : $parm="$parm pathfile=c:\\repertoire\\pathfile";
	    //    -> Unix    : $parm="$parm pathfile=/home/repertoire/pathfile";
	    
	$parm="$parm pathfile=/home/rep/www/cyberplus/pathfile";

	//		Si aucun transaction_id n'est affectÈ, request en gÈnËre
	//		un automatiquement ‡ partir de heure/minutes/secondes
	//		RÈfÈrez vous au Guide du Programmeur pour
	//		les rÈserves Èmises sur cette fonctionnalitÈ
	//
	//		$parm="$parm transaction_id=123456";



	//		Affectation dynamique des autres paramËtres
	// 		Les valeurs proposÈes ne sont que des exemples
	// 		Les champs et leur utilisation sont expliquÈs dans le Dictionnaire des donnÈes
	//
	//		$parm="$parm normal_return_url=http://www.domaine.fr/cgi-bin/call_response.php";
	//		$parm="$parm cancel_return_url=http://www. domaine.fr/cgi-bin/call_response.php";
	//		$parm="$parm automatic_response_url=http://www. domaine.fr/cgi-bin/call_autoresponse.php";
			$parm="$parm language=fr";
			$parm="$parm payment_means=CB,2,VISA,2,MASTERCARD,2";
			$parm="$parm header_flag=no";
			$parm="$parm capture_day=";
			$parm="$parm capture_mode=";
			$parm="$parm bgcolor=";
			$parm="$parm block_align=";
			$parm="$parm block_order=";
			$parm="$parm textcolor=";
			$parm="$parm receipt_complement=";
			$parm="$parm caddie=mon_caddie";
			$parm="$parm customer_id=";
			$parm="$parm customer_email=";
			$parm="$parm customer_ip_address=";
			$parm="$parm data=";
			$parm="$parm return_context=";
			$parm="$parm target=";
			$parm="$parm order_id=";


	//		Les valeurs suivantes ne sont utilisables qu'en prÈ-production
	//		Elles nÈcessitent l'installation de vos fichiers sur le serveur de paiement
	//
	// 		$parm="$parm normal_return_logo=";
	// 		$parm="$parm cancel_return_logo=";
	// 		$parm="$parm submit_logo=";
	// 		$parm="$parm logo_id=";
	// 		$parm="$parm logo_id2=";
	// 		$parm="$parm advert=";
	// 		$parm="$parm background_id=";
	// 		$parm="$parm templatefile=";


	//		insertion de la commande en base de donnÈes (optionnel)
	//		A dÈvelopper en fonction de votre systËme d'information

	// Initialisation du chemin de l'executable request (‡ modifier)
	// ex :
	// -> Windows : $path_bin = "c:\\repertoire\\bin\\request";
	// -> Unix    : $path_bin = "/home/repertoire/bin/request";
	//

	$path_bin="/home/rep/www/cyberplus/request";


	//	Appel du binaire request

	$result = exec("$path_bin $parm");

	//	sortie de la fonction : $result=!code!error!buffer!
	//	    - code=0	: la fonction gÈnËre une page html contenue dans la variable buffer
	//	    - code=-1 	: La fonction retourne un message d'erreur dans la variable error

	//On separe les differents champs et on les met dans une variable tableau

	$tableau = explode("!","$result");

	//	rÈcupÈration des paramËtres

	$code = $tableau[1];
	$error = $tableau[2];
	$message = $tableau[3];

	//  analyse du code retour

  if(( $code =="" ) && ( $error =="" ))
 	{
  	print("<BR><CENTER>erreur appel request</CENTER><BR>");
  	print("executable request non trouve $path_bin");
 	}

	//	Erreur, affiche le message d'erreur

	elseif($code != 0){
		print("<center><b><h2>Erreur appel API de paiement.</h2></center></b>");
		print("<br><br><br>");
		print("message erreur : $error <br>");
	}

	//	OK, affiche le formulaire HTML
	else {
		print("<br><br>");
		
        // OK, affichage du mode DEBUG si activÈ
		print("$error<br>");
		
		print("$message<br>");
	}

print("</BODY></HTML>");


?>

Posté : 15 nov. 2005, 04:07
par BLynx
j'ai le meme probleme ...

personne pour nous aider ?

Posté : 15 nov. 2005, 09:42
par Cyrano
Vérifiez dans le phpinfo chez l'hébergeur, en principe la liste des fonctions désactivées y est affichée. Et si vous êtes en mutualisé, dites-vous bien qu'il y a 9 chances sur 10 pour exec() soit désactivée.

Posté : 17 nov. 2005, 10:36
par alcofribas
A vrai dire, je ne trouve pas directement la fonction exec() dans le phpinfo, mais j'ai deux indications: safe_mode_exec_dir: no value, et dans configure command: '--with-exec-dir=/home/'.

Posté : 19 nov. 2005, 14:51
par Invité
Bon, en essayant d'aller plus loin avec ini_get_all je vois que safe_mode à la valeur access=4 et que les champs local_value et global_value ne sont pas renseignés (donc "off").
NB l'exécutable en question "request" m'a été livré sans extension. Dois-je lui en donner une (.cgi, par exemple)?

Posté : 19 nov. 2005, 21:28
par Invité
Je vais peut-être dire une ânerie, mais en me repenchant sur le code, je me demande si ce dernier ne génère pas systèmatiquement l'erreur à cause de la première structure conditionnelle:
$result = exec("$path_bin $parm");

	//	sortie de la fonction : $result=!code!error!buffer!
	//	    - code=0	: la fonction gÈnËre une page html contenue dans la variable buffer
	//	    - code=-1 	: La fonction retourne un message d'erreur dans la variable error

	//On separe les differents champs et on les met dans une variable tableau

	$tableau = explode("!","$result");

	//	rÈcupÈration des paramËtres

	$code = $tableau[1];
	$error = $tableau[2];
	$message = $tableau[3];

	//  analyse du code retour

  if(( $code =="" ) && ( $error =="" ))
 	{
  	print("<BR><CENTER>erreur appel request</CENTER><BR>");
  	print("executable request non trouve $path_bin");
 	}

	//	Erreur, affiche le message d'erreur

	elseif($code != 0){
		print("<center><b><h2>Erreur appel API de paiement.</h2></center></b>");
		print("<br><br><br>");
		print("message erreur : $error <br>");
	}

	//	OK, affiche le formulaire HTML
	else {
		print("<br><br>");
		
        // OK, affichage du mode DEBUG si activÈ
		print("$error<br>");
		
		print("$message<br>");
	}
Est-ce que ce $code =="" n'est pas aussi par défaut équivalent à =0, c'est-à-dire la variable !code que retourne l'exécutable quand ça fonctionne...? Et donc le message d'erreur apparaît sans pour autant signifier que l'exécutable n'est pas trouvable ?

Posté : 19 nov. 2005, 21:42
par rami
Après l'exécution d'exec, fais:
<?php
$result = exec("$path_bin $parm");
var_dump($result);
?>
Ca te permettra de voir exactement ce que contient $result.

Pour tester si la fonction exec est autorisée, tu peux faire: (si le serveur est sous linux)
<?php
echo exec('whoami');
?>

Posté : 20 nov. 2005, 18:18
par alcofribas
Ca maaaaaarche !!!! Merci rami, je ne savais pas que var_dump servait à ça. J'ai appris un truc super utile grâce à toi. Vraiment merci.
Pour ceux qui auraient le même problème, il faut éviter de mettre l'api dans le répertoire cgi-bin, qui crée des erreurs de lecture chez ovh apparemment.
D'autre part, le message d'erreur qui me bloquait me mettait sur une fausse piste, dans le mesure où ce qui pêchait n'était pas le chemin de l'exécutable, mais le fait que je fasse appel à des fichiers dans cgi-bin.
De toute manière la méthode de rami suffit pour résoudre le problème en 5mn :D

Posté : 20 nov. 2005, 18:26
par alcofribas
Autre petit détail: sur mon hébergement l'exécutable request fourni par natexis ne fonctionne pas. Il faut utiliser un des deux autres: pour moi, request_2.4.18_2.96. Voilà.