2016-03-08 1 views
0

J'utilise phpseclib pour SSH sur mon serveur distant à partir d'un navigateur Web et j'exécute un fichier php. Voici le code que j'utilise:phpseclib ssh exec callback ne fonctionne pas

$ssh->exec('cd myfolder/; php main.php ' . $file, 'packet_handler'); 
function packet_handler(){ 
    echo "Completed"; 
    header("Location: exec_completed.php"); 
} 

Le fichier main.php est exécuté sans aucun problème. Le problème est de retourner les données après l'exécution. J'ai les questions suivantes:

  1. Je fais beaucoup de traitement dans le fichier main.php et j'ai besoin de réaliser des progrès en temps réel de ce qui fait le script. Lorsque j'exécute le fichier via exec, seul le premier écho du fichier main.php est imprimé et l'exécution s'arrête. Est-il possible d'obtenir des données en temps réel à partir du script d'exécution. Phpseclib pour les rappels, même si ma fonction de rappel packet_handler ne s'exécute pas après l'exécution de exec. Je veux rediriger vers une autre page une fois que le fichier main.php que j'ai exécuté via SSH a terminé son exécution. Maintenant, si je redirige vers cette page, je n'obtiens que des résultats partiels car le fichier main.php n'a pas terminé son exécution. J'ai essayé d'utiliser sleep (10) mais mon main.php peut prendre plus de temps à s'exécuter à certains moments, donc cela n'a pas fonctionné. S'il vous plaît suggérer des idées

exemple de rappel de phpseclib:

<?php 
include('Net/SSH2.php'); 

$ssh = new Net_SSH2('www.domain.tld'); 
if (!$ssh->login('username', 'password')) { 
    exit('Login Failed'); 
} 

function packet_handler($str) 
{ 
    echo $str; 
} 

$ssh->exec('ping 127.0.0.1', 'packet_handler'); 
?> 

Répondre

1

Pour # 1 ... faire $ssh->exec sans le rappel devrait fonctionner. Si ce n'est pas, j'ai besoin de voir les journaux, que vous pouvez obtenir en faisant define('NET_SSH2_LOGGGING', 2) en haut, puis echo $ssh->getLog() après. Publier le journal sur pastebin.com, puis publier un lien serait bon. Mais cela dit, cela ne vous donnera pas de résultats en temps réel non plus. Pour # 2 ... la fonction de rappel est principalement destinée aux mises à jour en temps réel et il y a de fortes chances que ce que vous obtenez avec chaque appel de la fonction de rappel soit une sortie incomplète. Donc, pour votre rappel à la sortie "Terminé" et rediriger l'utilisateur vers un autre emplacement est, selon toute vraisemblance, incorrect.

Une autre approche qui peut fonctionner pour vous: utilisez le shell interactif. Exemple:

http://phpseclib.sourceforge.net/ssh/examples.html#sudo,

Je ne sais pas ce que votre sortie est identique. Peut-être que vous pourriez read() jusqu'à ce que vous arriviez à certaines parties de la sortie dont la sortie est garantie. Ou peut-être que vous pourriez utiliser $ssh->setTimeout(5) et obtenir une sortie mise à jour toutes les cinq secondes ou quelque chose ..

+0

Merci pour l'aide. Je n'ai pas inclus de rappel maintenant. C'est ma sortie de journal. http://pastebin.com/PzKe5sUv Je vois que les données que j'ai répercutées dans mon fichier main.php sont disponibles dans le journal mais elles ne sont pas affichées quand je l'exécute. En ce qui concerne la sortie de mon fichier: J'analyse un fichier csv et effectue un appel de savon à un service Web avec ces données analysées et affiche les résultats en retour. J'ai essayé d'utiliser if (read ('mon dernier écho') {rediriger vers un autre fichier;} mais il est exécuté quelle que soit la chaîne que je donne.Comment puis-je utiliser read() pour trouver que le fichier main.php a terminé son exécution. –