[C] - Problème ssh en c

Résolu
viro_ucp Messages postés 3 Date d'inscription   Statut Membre Dernière intervention   -  
viro_ucp Messages postés 3 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Quand j'exécute une commande de type depuis une console

ssh <destinataire> <commande>  


je récupère la main.

Mais quand je le fais dans un programme en C, je n'arrive pas à récupérer la main.

J'ai essayé avec popen(), system() et execlp().

Je reprends la main seulement après que la commande ait fini de s'exécuter, celle-ci ferme la connexion ssh qui redonne ensuite la main au programme.

                fp=popen( "/usr/bin/ssh -q -o KbdInteractiveDevices=no -o PasswordAuthentication=no -o RSAAuthentication=yes -o StrictHostKeyChecking=no root@192.168.1.1", "w");  
                fprintf(fp, "export DISPLAY=:0 \n");fflush (fp);  
                fprintf(fp, "nohup xeyes &\n");fflush (fp);  
                fprintf(fp, "exit\n");fflush (fp);  
                pclose(fp);  


Le pclose() devient alors bloquant car ssh refuse de se terminer tant qu'il a un fils qui s'exécute.

Mon objectif serait d'exécuter la commande en fond de tache puis de récupérer la main au sein du programme.

PS : La connexion ssh se fait via clé publique/privé dsa, pas de problème de ce côté.

2 réponses

debianhunter Messages postés 119 Date d'inscription   Statut Membre Dernière intervention   24
 
Bonjour,

Dans ce cas de figure, utilise un fork ; le processus fils executant la commande.

Bon courage !
0
viro_ucp Messages postés 3 Date d'inscription   Statut Membre Dernière intervention  
 
J'ai essayé avec un fork(), le problème est que la commande s'exécute bien dans le fils, j'ai la main dans le processus père mais le lien ssh ne se ferme qu'après la fin de l'exécution du programme et non pas après avoir lancer le programme. Du coup, je me trimballe toujours avec un processus ssh.
0
viro_ucp Messages postés 3 Date d'inscription   Statut Membre Dernière intervention  
 
le code source de screen a résolu mon problème

le programme appeler doit inclure :
 freopen("/dev/null", "r", stdin); 
 freopen("/dev/null", "w", stdout); 
 freopen("/dev/null", "w", stderr); 

ou le programme appelant :
 system( "/usr/bin/ssh -q -o KbdInteractiveDevices=no -o PasswordAuthentication=no -o RSAAuthentication=yes -o StrictHostKeyChecking=no root@192.168.1.1 \" export DISPLAY=:0; nohup xeyes </dev/null 1>/dev/null 2>/dev/null &\" "  );
0