2010-09-13 15 views
18

Kullanıcılardan bir parola yazmasını istemek istiyorum ancak karakterlerin yazarken ekranda görünmesini istemiyorum.

Bunu Ruby'de nasıl yapıyorum?

cevap

14

Böyle bir kullanıcı etkileşimi için bir mücevher var: highline.

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

Hatta: Eğer stty ile bir sistemde iseniz

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

tatlı! (15chars) – st0le

+10

Kullanıcının terminali siyah arka plana sahip değilse ne olur? –

+0

sadece kendi içinde bir komut dosyası için, bu yüzden bir sorun değil :) –

24

: Glenn ama daha tam olarak

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

Hayır cevher lütfen, ben bu cevabı beğeniyorum ;-) – lzap

2

Bu çözümdür UNIX sistemleri için:

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

Sen kod İdempotent olduğundan emin olmak için ... Burada listelenen diğer çözümleri yankı ile işlevsellik bu öbek çıkmak istiyor geri döndü varsayalım. Peki, kodu girmeden önce kapatılmışsa ve uzak durması bekleniyorsa?

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

Sen IO/konsol modülünden STDIN.noecho yöntemi kullanabilirsiniz:

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

'NoMethodError: undefined method 'noecho' için # >' on' ruby ​​2.0.0p648 (2015-12-16 revizyon 53162) [universal.x86_64-darwin15] ' – Ian

+4

'gerektirir 'io/konsol' – ddubs

+1

Bu kazanan. –