Portál AbcLinuxu, 22. července 2025 22:41


Dotaz: Skryti textu

13.6.2005 11:09 kafi | skóre: 25 | blog: muj_prvni_blog
Skryti textu
Přečteno: 111×
Odpovědět | Admin
Zdravím potreboval bych poradit jestli nekdo nevite jak nezobrazovat psany text. Napriklad zadavam helo do prikazove radky a nechci aby se zobrazovalo co pisu (jak to treba je u passwd). Delam skript v Perlu a potrebuju to nejak vyresit. Uzivatel zadava jmeno a heslo a to se nesmi vypisovat.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

13.6.2005 11:13 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: Skryti textu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Vypnutím flagu ECHO terminálu -- hledej tcsetattr (tady v diskusi, v info libc). V Perlu toto API zpřístupňuje nějaký modul... A nezapomeň ho pak zase zapnout.
13.6.2005 12:56 kafi | skóre: 25 | blog: muj_prvni_blog
Rozbalit Rozbalit vše Re: Skryti textu
Neslo by uveste nejaky priklad? Nasel jsem to co jsi napsal ale nejsem z toho dvakrat moudry. Spis bych rekl, ze jsem z toho debil.
13.6.2005 13:20 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: Skryti textu
Ten příklad, který najde vyhledávání, je opsaný z info glibc, tudíž obsahuje ošetření chyb, kontrolu, zda je stdin terminál a vůbec. Co bys chtěl víc?
#define _GNU_SOURCE
#include <unistd.h>
#include <stdio.h>
#include <termios.h>

int
main(void)
{
    char *password = NULL;
    size_t len = 0;
    ssize_t passwlen;
    struct termios tattr, saved_tattr;

    fputs("Password: ", stdout);

    tcgetattr(STDIN_FILENO, &saved_tattr);
    tcgetattr(STDIN_FILENO, &tattr);
    tattr.c_lflag &= ~ECHO;
    tattr.c_lflag |= ECHONL;
    tcsetattr(STDIN_FILENO, TCSAFLUSH, &tattr);

    passwlen = getline(&password, &len, stdin);

    tcsetattr(STDIN_FILENO, TCSAFLUSH, &saved_tattr);

    if (passwlen > 0) {
        password[passwlen-1] = '\0';
        printf("Heslo = %s\n", password);
    }
    else
        fputs("Error...\n", stderr);

    return 0;
}
13.6.2005 13:28 mlz
Rozbalit Rozbalit vše Re: Skryti textu
Viz :
http://search.cpan.org/~persicom/Term-Prompt-1.03/lib/Term/Prompt.pm 

http://search.cpan.org/~jstowe/TermReadKey-2.30/ReadKey.pm
13.6.2005 16:29 KP
Rozbalit Rozbalit vše Re: Skryti textu
Odpovědět | | Sbalit | Link | Blokovat | Admin
V Perlu možná stačí jen něco takového
system 'stty', '-echo';
$pass = <STDIN>; chomp($pass);
system 'stty', 'echo';
i když zmiňovaný modul má asi řadu jiných a lepších možností.
13.6.2005 17:20 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: Skryti textu
A typická situace je pak taková, že to někdo pustí, uvědomí si, že nezná heslo, zmáčkne Ctrl+c a zůstane mu němý terminál.
13.6.2005 17:29 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: Skryti textu
Což o to, handler na SIGINT je zapotřebí vždy.

Ale zato se mi zdá, že tu někdo má mírně obrácenou definici ,stačí`. Spouštění externích programů znamená, že mi nestačí prostředy daného jazyka.
13.6.2005 17:45 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: Skryti textu
Ovšem možnina funkcí, které lze bezpečně používat v handleru signálu, je dost omezená. Nespoléhal bych na to, že
system 'stty', 'echo';
projde.
14.6.2005 10:35 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: Skryti textu
Měl by se k tomu vyjádřit někdo, kdo to umí v Perlu napsat čistě (což já nejsem). Nicméně v Pythonu existuje getpass.unix_getpass(), která se o postará o vše potřebné při zadávání hesla. Mám to otestováno na prográmku, co pípe, když se na pop3 serveru objeví nový mail a vypisuje počet mailů ve schránce. Ale to už s daným problémem nesouvisí.
#!/usr/bin/env python
import poplib, time, getpass, sys

pop3server = "pop3.seznam.cz"

user = getpass.unix_getpass("username at "+pop3server+":");
password = getpass.unix_getpass("Password for "+user+"@"+pop3server+":");

messages_prev = 0

while(1):
  try:
    M = poplib.POP3('pop3.seznam.cz')
    M.user(user)
    M.pass_(password)
#    break
  except poplib.error_proto, detail:
    print "Error occured", sys.exc_info()[0], detail
    continue
  res = M.stat()
  messages = res[0]
  M.quit()
  if (messages != messages_prev):
    print time.strftime("%H:%M:%S %d.%m.%Y"),": ", messages, Messages\a"
  messages_prev = messages
  time.sleep(1200)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.