envoie du signal ctrl-d

envoie du signal ctrl-d - Perl - Programmation

Marsh Posté le 18-05-2010 à 14:58:38    

Bonjour,
 
J'aimerai que quelqu'un m'apporte son aide si possible dans mon script perl.
 
Je voudrai simplement envoyé le signal "ctrl-d" pour couper la connexion SSH.
L'utilisateur se connecte en ssh sur la machine, la un script est lancé qui lui permet de se crée un compte utilisateur pour une session unbuntu, je voudrai ensuite couper la connexion pour qu'il se reconnecte avec son nouveau compte.
 
Merci de votre aide.

Reply

Marsh Posté le 18-05-2010 à 14:58:38   

Reply

Marsh Posté le 18-05-2010 à 18:35:31    

En perl, Ctrl-D se représente par \cD donc tu envoies ce caractères la ou il faut.
Tu peux aussi utiliser le fait que Ctrl-D c'est EOT (end of transmission) ie la valeur numérique 4.
http://www.bbdsoft.com/ascii.html
A+,


Message édité par gilou le 18-05-2010 à 18:36:04

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 19-05-2010 à 10:44:58    

merci de ta réponse Gilou.
J'ai essayé print "\cD"; mais sans succès, j'avais également tester la valeur numérique, mais ca ne coupe pas la connexion, il ne se passe rien.

Reply

Marsh Posté le 19-05-2010 à 11:32:50    

Citation :

J'ai essayé print "\cD"; mais sans succès

Sans plus d'info sur comment tu as testé, c'est un peu difficile de t'en dire plus.
Il faudrait nous montrer un peu de code.

 

Il y a un truc qui me turlupine, mais avec le peu d'indications que tu donnes, je ne suis pas sur de ton scénario. Par hasard, tu n'ouvres pas depuis un client un shell SSH sur un serveur sur lequel tu fais executer un script perl? Parce que si le script perl est exécuté sur le serveur, et que le shell SSH est lancé depuis le client, je vois pas trop comment ça pourrait marcher, vu que le Ctrl-D doit être envoyé depuis le client.
Au mieux, un script perl pourrait marcher en récupérant le numéro de process du shell sur le serveur et en lui envoyant un kill
A+,


Message édité par gilou le 19-05-2010 à 11:34:32

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 19-05-2010 à 13:39:24    

Le client se connecte sur la machine unbuntu, ou il lance le script perl. Avec un ctrl-d en ligne de commande je peux couper la connexion SSH, mais avec le script en utilisant print "\cD" cela ne fonctionne pas; En fait il est impossible de le faire de cette manière? J'avais aussi penser a tuer le process.
Merci de ton aide


Message édité par jaysiat le 19-05-2010 à 13:40:51
Reply

Marsh Posté le 19-05-2010 à 13:44:13    

sub creation{
 
$email = <STDIN>;
chomp $email;
 
system ("echo $email >> /home/test/mail.log" );
print "\cd";
 
 
 
}

Reply

Marsh Posté le 19-05-2010 à 14:00:47    

Qu'est ce que tu penses si l'envoie du caractère EOT est envoyé au niveau des connexion pts/ ?

Reply

Marsh Posté le 19-05-2010 à 14:36:31    

Citation :

print "\cd";


Si j'avais mis le D en majuscule dans ma réponse, ce n'était pas pour des prunes!

 

A+,


Message édité par gilou le 19-05-2010 à 14:43:51

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 19-05-2010 à 14:43:37    

faire "exit" ou "logout" c'est quand même plus simple :D


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 19-05-2010 à 15:01:38    

Désolé le D est bien en majuscule.

Reply

Marsh Posté le 19-05-2010 à 15:01:38   

Reply

Marsh Posté le 19-05-2010 à 15:05:47    

j'ai déja essayer un system ("exit" )  
J'ai le message can't exec "exit" aucun fichier ou dossier de ce type.
Pareil logout ne foncitonne pas.

Reply

Marsh Posté le 19-05-2010 à 16:23:24    

Et
print STDOUT "\cD\n";  
a tout hasard, au cas ou on aurait un pb de buffering
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 19-05-2010 à 17:14:02    

merci de ta réponse mais ca ne fonctionne pas non plus :(

Reply

Marsh Posté le 19-05-2010 à 17:17:21    

Et si tu fais  
print STDOUT "toto\n";  
ça apparait sur ta console?
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 20-05-2010 à 10:50:02    

Oui, j'ai bien toto d'afficher.

Reply

Marsh Posté le 20-05-2010 à 14:21:24    

Donc envoyer un caractère CTRL-D ne fait rien. Donc c'est la partie client qui intercepte cette séquence, et non la partie serveur.
Dans ce cas la, tu peux essayer de récupérer le proces id du shell:
$ppid = getppid();
(je suppose que c'est le process père du script, sinon, il faudra filtrer la commande ps pour trouver le bon)
et lancer un kill dessus
kill 9 $ppid;
J'ai mis le signal 9 (SIGKILL), mais a toi de voir lequel est le plus approprié (SIGTERM, SIGQUIT...)
A+,


Message édité par gilou le 20-05-2010 à 14:23:08

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 20-05-2010 à 14:26:42    

merci bien Gilou, j'avais déjà penser à ca mais j'utiliserai cette méthode qu'en dernier recours. Je vais essayer de chercher encore :)

Reply

Marsh Posté le 20-05-2010 à 14:42:40    

Le pb, c'est que le flux de sortie du script perl n'a aucune raison d'être le flux d'entrée de ton secure shell  (et vu la manière donc c'est lancé, je vois pas trop comment le faire, a moins que tu puisses le faire dans la partie shell qui lance le script), donc même si tu fait un print STDOUT "\cD\n"; ca va sur le flux de sortie de ton shell, pas sur son flux d'entrée, donc ça n'a pas d'effet.
Donc c'est plus un pb de shell script que un pb de perl script a la base.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 20-05-2010 à 14:49:38    

Dans ton shell, tu peux pas recupérer la valeur de fin d'execution de ton script perl, et faite un logout basé sur cette valeur?
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 20-05-2010 à 14:50:58    

En tuant le process getppid()-1 ca fonctionne, mais je pourrai pas expliquer pourquoi.
J'ai essayé lancer plusieurs connexion ssh et à tout les coups ca me tue bien la bonne connexion qui à lancer le script.

Reply

Marsh Posté le 20-05-2010 à 15:16:30    

Oui, c'est bizarre, c'est comme s'il y avait un process intermédiaire entre le ssh et le script perl (? un sous shell).
C'est donc un poil risqué cette technique.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 20-05-2010 à 15:18:10    

ssh=>shell=>script ?
Je sais pas si ca fonctionne de cette manière pour les PID

Reply

Marsh Posté le 20-05-2010 à 15:22:56    

Je pense que c'est bien ca.
 
Mon ssh a le PID 20139, mon -bash le PID 20140, en lancant mon script shell je récuperer le PPID donc 20140 et je le décrémente de 1, ca tue donc ma session SSH

Reply

Marsh Posté le 20-05-2010 à 15:40:46    

Oui, ca colle, mais il suffit que la bécane ou cela s'exécute soit un poil chargée pour que ca déconne. Le getppid est bon, mais pour trouver le pid de son père, il va falloir le vérifier en filtrant ps, car ça pourrait être autre chose que getppid()-1
Si tu es sous unix, ca doit pouvoir se faire aussi a partir du module Proc::ProcessTable
A+,


Message édité par gilou le 20-05-2010 à 15:41:10

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 20-05-2010 à 16:14:27    

Tuer le shell ne suffit pas?


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 20-05-2010 à 19:10:35    

J'ai pas l'impression que tuer bash suffise a tuer la connexion ssh, sinon il se serait contenté de faire kill 9 sur ppid comme je lui avait suggéré je pense, au lieu de faire cela sur ppid-1  (je peux pas tester, j'ai que windows sous la main, la debian que j'ai sur une partition, si elle a bien trouvé mon réseau WiFi pour l'installation, n'a jamais voulu fonctionner avec une fois le noyeau installé)
A+,


Message édité par gilou le 20-05-2010 à 19:13:10

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 21-05-2010 à 11:12:29    

Je confirme, testé mais cela ne fonctionne pas.

Reply

Marsh Posté le 21-05-2010 à 11:50:41    

jaysiat a écrit :

Je confirme, testé mais cela ne fonctionne pas.


 
Bizarre, quitter mon shell m'a toujours fait quitter la session ssh. ;)  
 
Tu utilisais quel signal?  (La premiere chose que j'essaierais c'est SIGHUP)


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 21-05-2010 à 15:42:07    

j'ai testé qu'avec le 15.

Reply

Marsh Posté le 21-05-2010 à 15:59:18    

Ca ne suffit generalement pas a terminer un shell.  Bash par exemple ignore SIGTERM, SIGQUIT et fait des choses mais ne quitte pas avec SIGINT.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 21-05-2010 à 16:04:19    

le signal 1 fonctionne bien :)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed