[C] - Problème ssh en c
Résolu
viro_ucp
Messages postés
3
Statut
Membre
-
viro_ucp Messages postés 3 Statut Membre -
viro_ucp Messages postés 3 Statut Membre -
Bonjour,
Quand j'exécute une commande de type depuis une console
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.
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é.
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
-
Bonjour,
Dans ce cas de figure, utilise un fork ; le processus fils executant la commande.
Bon courage ! -
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 &\" " );