[C] supprimer les echos de caracteres sur Unix

supprimer les echos de caracteres sur Unix [C] - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 11-02-2004 à 14:35:18    

Voilà j'aimerais savoir comment on peut supprimer l'echo des caracteres a l'ecran (en tapant dans une console). Je dois faire le programme en consequence. Quelle(s) fonction(s) dois-je utiliser ?
Ce cas de figure apparait lorsque on saisi son mot de pass pour se logger par exemple.
J'ai deja pas mal chercher mais je n'ai pas trouver.  
(je reflechissais autour de dup() et dup2()...mais kedalle) :/
 
Dans un 2eme tps, j'aimerais savoir comment un programme lance en arriere plan peut recuperer des caracteres saisis sur une console. ex : le gars tape une commande et moi je recupere ce qu'il a tape grace au programme tournant en arriere plan et qui les stocke ds un fichier (je ne sais pas si c possible mais je demande!)
 
Merci


Message édité par Giz le 11-02-2004 à 14:36:13
Reply

Marsh Posté le 11-02-2004 à 14:35:18   

Reply

Marsh Posté le 11-02-2004 à 14:41:38    

ce sujet a plutôt sa place dans programmation je pense.
 
t'as regardé du coté de la lib readline ??

Reply

Marsh Posté le 11-02-2004 à 14:44:02    

Amuses toi avec la commande stty
Il me semble que l'option est stty echoe / stty -echoe
A confirmer je n'ai d'unix sous la main en c moment.
 
Pour la deuxième question, en cherchant bien, ca doit pouvoir ce faire.
 
Tu serais pas en train d'essayer de nous faire un cheval de troie par hazard?  :whistle:

Reply

Marsh Posté le 11-02-2004 à 14:46:39    

Hmm de mémoire, tu ouvres "/dev/tty" et tu utilises ioctl.

Reply

Marsh Posté le 11-02-2004 à 16:56:22    

monsieur veut récupérer les mots de passes des utilisateurs ? :D


---------------
Mandriva : parce que nous le valons bien ! http://linux-wizard.net/index.php
Reply

Marsh Posté le 11-02-2004 à 16:58:56    

Dark_Schneider a écrit :

monsieur veut récupérer les mots de passes des utilisateurs ? :D

c'est pas marrant, parce que c'est un sujet beaucoup plus complexe que ça, masquer l'echo ne suffit pas

Reply

Marsh Posté le 11-02-2004 à 17:03:40    

mauvaise cat d'ailleurs. modo :o

Reply

Marsh Posté le 11-02-2004 à 18:33:10    

Extrait de pure-ftpd :
 

Code :
  1. #ifdef HAVE_POSIX_TERMIOS
  2. # include <termios.h>
  3. #elif defined(HAVE_TERMIO_H)
  4. # include <termio.h>
  5. #elif defined(HAVE_SGTTY_H)
  6. # include <sgtty.h>
  7. #endif
  8. static void disable_echo(void)
  9. {
  10.     if (!isatty(0)) {
  11.         return;
  12.     }
  13. #ifdef ECHO
  14. # ifdef HAVE_POSIX_TERMIOS
  15.     {
  16.         struct termios p;
  17.         if (tcgetattr(0, &p) != 0) {
  18.             return;
  19.         }
  20.         p.c_lflag &= ~ECHO;
  21. #  ifndef TCSAFLUSH
  22. #   define TCSAFLUSH 0
  23. #  endif
  24.         tcsetattr(0, TCSAFLUSH, &p);
  25.     }
  26. # elif defined(HAVE_TERMIO_H) && defined(TCGETA)
  27.     {
  28.         struct termio tty;
  29.         if (ioctl(0, TCGETA, &tty) != 0) {
  30.             return;
  31.         }
  32.         tty.c_lflag &= ~ECHO;
  33.         ioctl(0, TCSETA, &tty);
  34.     }
  35. # else
  36.     {
  37.         struct sgttyb tty;
  38.         if (ioctl(0, TIOCGETP, &tty) != 0) {
  39.             return;
  40.         }
  41.         tty.sg_flags &= ~ECHO;
  42.         ioctl(0, TIOCSETN, &tty);
  43.     }
  44. # endif
  45. #endif


 

Reply

Marsh Posté le 12-02-2004 à 14:30:59    

axey a écrit :

Extrait de pure-ftpd :
 

Code :
  1. #ifdef HAVE_POSIX_TERMIOS
  2. # include <termios.h>
  3. #elif defined(HAVE_TERMIO_H)
  4. # include <termio.h>
  5. #elif defined(HAVE_SGTTY_H)
  6. # include <sgtty.h>
  7. #endif
  8. static void disable_echo(void)
  9. {
  10.     if (!isatty(0)) {
  11.         return;
  12.     }
  13. #ifdef ECHO
  14. # ifdef HAVE_POSIX_TERMIOS
  15.     {
  16.         struct termios p;
  17.         if (tcgetattr(0, &p) != 0) {
  18.             return;
  19.         }
  20.         p.c_lflag &= ~ECHO;
  21. #  ifndef TCSAFLUSH
  22. #   define TCSAFLUSH 0
  23. #  endif
  24.         tcsetattr(0, TCSAFLUSH, &p);
  25.     }
  26. # elif defined(HAVE_TERMIO_H) && defined(TCGETA)
  27.     {
  28.         struct termio tty;
  29.         if (ioctl(0, TCGETA, &tty) != 0) {
  30.             return;
  31.         }
  32.         tty.c_lflag &= ~ECHO;
  33.         ioctl(0, TCSETA, &tty);
  34.     }
  35. # else
  36.     {
  37.         struct sgttyb tty;
  38.         if (ioctl(0, TIOCGETP, &tty) != 0) {
  39.             return;
  40.         }
  41.         tty.sg_flags &= ~ECHO;
  42.         ioctl(0, TIOCSETN, &tty);
  43.     }
  44. # endif
  45. #endif


 
 


 
Merci de m'avoir mis sur la piste  :jap: .
 
PS: j'ai mis ca dans OS alternatif, j'ai peur que dans programmation peu de gens connaissent la programmation systeme Unix spour ca :/...mais ici j'ai peur qu'il ne connaissent pas assez la programmation C syteme tout court.
Conclusion : je crois que je vais poster sur les 2 :D

Reply

Marsh Posté le 23-02-2004 à 11:57:08    

axey a écrit :

Extrait de pure-ftpd :
 

Code :
  1. #ifdef HAVE_POSIX_TERMIOS
  2. # include <termios.h>
  3. #elif defined(HAVE_TERMIO_H)
  4. # include <termio.h>
  5. #elif defined(HAVE_SGTTY_H)
  6. # include <sgtty.h>
  7. #endif
  8. static void disable_echo(void)
  9. {
  10.     if (!isatty(0)) {
  11.         return;
  12.     }
  13. #ifdef ECHO
  14. # ifdef HAVE_POSIX_TERMIOS
  15.     {
  16.         struct termios p;
  17.         if (tcgetattr(0, &p) != 0) {
  18.             return;
  19.         }
  20.         p.c_lflag &= ~ECHO;
  21. #  ifndef TCSAFLUSH
  22. #   define TCSAFLUSH 0
  23. #  endif
  24.         tcsetattr(0, TCSAFLUSH, &p);
  25.     }
  26. # elif defined(HAVE_TERMIO_H) && defined(TCGETA)
  27.     {
  28.         struct termio tty;
  29.         if (ioctl(0, TCGETA, &tty) != 0) {
  30.             return;
  31.         }
  32.         tty.c_lflag &= ~ECHO;
  33.         ioctl(0, TCSETA, &tty);
  34.     }
  35. # else
  36.     {
  37.         struct sgttyb tty;
  38.         if (ioctl(0, TIOCGETP, &tty) != 0) {
  39.             return;
  40.         }
  41.         tty.sg_flags &= ~ECHO;
  42.         ioctl(0, TIOCSETN, &tty);
  43.     }
  44. # endif
  45. #endif


 
 


 
merci, cela m'a mis sur la voie  :jap:  
 
ma solution pour le masquage de l'echo :
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6. #include <fcntl.h>
  7. #include <termios.h>
  8. #define BUF_SIZE 100
  9. int main()
  10. {
  11. int fd;
  12. char buf[BUF_SIZE] = {0};
  13. struct termios pass;
  14. /*
  15.  * ouverture du fichier device type caractere
  16.  * il s'agit du terminal d'entree/sortie
  17.  * on le reconnait par la commande shell "tty"
  18.  *
  19.  */
  20. if ((fd = open ("/dev/pts/1", O_RDONLY, 0777)) == -1)
  21. {
  22.  perror ("open" );
  23.  _exit (EXIT_FAILURE);
  24. }
  25. /* recuperation de la configuration courante du terminal */
  26. if (tcgetattr (fd, &pass) == -1)
  27. {
  28.  perror ("tcgetattr" );
  29.  _exit (EXIT_FAILURE);
  30. }
  31. /* suppression de l'echo a la configuration courante */
  32. pass.c_lflag = (pass.c_lflag) & (~ECHO);
  33. /* invite de saisie */
  34. printf ("mot de passe :\n" );
  35. /* modification de la configuration du terminal avec mise a jour instantanee */
  36. if (tcsetattr (fd, TCSANOW, &pass) == -1)
  37. {
  38.  perror ("tcsetattr" );
  39.  _exit (EXIT_FAILURE);
  40. }
  41. /* saisie du mot de passe */
  42. fgets (buf, BUF_SIZE, stdin);
  43. /* retablissement des parametres du terminal */
  44. pass.c_lflag = (pass.c_lflag) | (ECHO);
  45. if (tcsetattr (fd, TCSANOW, &pass) == -1)
  46. {
  47.  perror ("tcsetattr" );
  48.  _exit (EXIT_FAILURE);
  49. }
  50. /* mot de passe saisi */
  51. printf ("vous avez saisi : %s", buf);
  52. return 0;
  53. }


 
mais bon, pour toper ce qu'ecrit l'utilisateur sur une console (programme lance en arriere plan), c'est autre chose  :whistle:  
du fait que les 2 progs (celui en arriere plan et celui de l'utilisateur) sont independants :/
une idée la dessus  ? :??:


Message édité par Giz le 23-02-2004 à 11:59:25
Reply

Marsh Posté le 23-02-2004 à 11:57:08   

Reply

Marsh Posté le 02-02-2006 à 14:42:21    

Salut,  
je decouvre le message et je vois que tu na pa ecouter les cours. Je vois bien de quoi tu parle comme une fonction script a recoder par exemple !!!!!!!!!!!!!
Passons, sinon ta pa trop ecouter les cours toi. T aurais du savoir que pour eviter les echo a l ecran, ce n est pa du tout avec dup, ca n a rien avoir !!!!
Dup sert seulement pour modifier les files descriptor. (cf Cours C/Unix 4 Les termcaps ) Regarde bien ioctl et tu va trouver. En plus, je soupsonne que tu l ai deja fait dans un autre projet auparavant. Et si t avais ete au cour, tu saurais qu il faut jouer avec les tty et les pty ... et forkpty et openpty ... Pfff je t ai pratiquement tout filer, tu recode le tout et voila.
@+

Reply

Marsh Posté le 02-02-2006 à 16:04:43    

Le message date d'il y'a 2 ans, je suis sur que ton aide lui est très précieuse là :D

Reply

Marsh Posté le 05-02-2006 à 15:51:06    

mdr excellent :d

Reply

Marsh Posté le 05-02-2006 à 16:01:47    

loupin a écrit :

Salut,  
je decouvre le message et je vois que tu na pa ecouter les cours. Je vois bien de quoi tu parle comme une fonction script a recoder par exemple !!!!!!!!!!!!!
Passons, sinon ta pa trop ecouter les cours toi. T aurais du savoir que pour eviter les echo a l ecran, ce n est pa du tout avec dup, ca n a rien avoir !!!!
Dup sert seulement pour modifier les files descriptor. (cf Cours C/Unix 4 Les termcaps ) Regarde bien ioctl et tu va trouver. En plus, je soupsonne que tu l ai deja fait dans un autre projet auparavant. Et si t avais ete au cour, tu saurais qu il faut jouer avec les tty et les pty ... et forkpty et openpty ... Pfff je t ai pratiquement tout filer, tu recode le tout et voila.
@+


 
Elu boulet du jour  :love:

Reply

Sujets relatifs:

Leave a Replay

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