2010-09-13 14 views
18

Desidero chiedere agli utenti di digitare una password, ma non voglio che i caratteri vengano visualizzati sullo schermo mentre digitano.

Come si fa in Ruby?

risposta

14

C'è una gemma per tale interazione utente: highline.

password = ask("Password: ") { |q| q.echo = false } 

O anche:

password = ask("Password: ") { |q| q.echo = "*" } 
+0

dolce! (15 carati) – st0le

+10

Cosa succede se il terminale dell'utente non ha uno sfondo nero? –

+0

è solo per uno script interno, quindi non è un problema :) buono da segnalare per gli altri anche se –

24

Se siete su un sistema con stty:

`stty -echo` 
print "Password: " 
pw = gets.chomp 
`stty echo` 
puts "" 
+2

Nessuna gemma, mi piace questa risposta ;-) – lzap

2

Questa è la soluzione per sistemi UNIX:

begin 
    system "stty -echo" 
    print "Password: "; pass1 = $stdin.gets.chomp; puts "\n" 
    print "Password (repeat): "; pass2 = $stdin.gets.chomp; puts "\n" 
    if pass1 == pass2 
     # DO YOUR WORK HERE 
    else 
     STDERR.puts "Passwords do not match!" 
    end 
    ensure 
    system "stty echo" 
    end 
5

Si desidera assicurarsi che il codice è idempotente ... altre soluzioni elencate qui presuppongono che si desidera uscire da questa pezzo di funzionalità con eco riaccesa. Bene, cosa succede se è stato spento prima di inserire il codice, e si prevede che rimanga spento?

stty_settings = %x[stty -g] 
print 'Password: ' 

begin 
    %x[stty -echo] 
    password = gets 
ensure 
    %x[stty #{stty_settings}] 
end 

puts 

print 'regular info: ' 
regular_info = gets 

puts "password: #{password}" 
puts "regular: #{regular_info}" 
14

È possibile utilizzare il metodo STDIN.noecho dal modulo IO/console:

pw = STDIN.noecho(&:gets).chomp 
+1

'NoMethodError: metodo non definito 'noecho' per # >' on' ruby ​​2.0.0p648 (2015-12-16 revisione 53162) [universal.x86_64-darwin15] ' – Ian

+4

'require 'io/console'' – ddubs

+1

Questo è il vincitore. –

Problemi correlati