2010-09-13 20 views
18

Tôi muốn yêu cầu người dùng nhập mật khẩu, nhưng tôi không muốn ký tự xuất hiện trên màn hình khi họ nhập.

Làm cách nào để thực hiện điều này trong Ruby?

Trả lời

14

Có một đá quý cho tương tác người dùng như vậy: highline.

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

Hoặc thậm chí:

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

ngọt ngào! (15chars) – st0le

+10

Nếu thiết bị đầu cuối của người dùng không có nền đen thì sao? –

+0

của nó chỉ cho một kịch bản trong nhà, do đó, nó không phải là một vấn đề :) tốt để chỉ ra cho những người khác mặc dù –

24

Nếu bạn đang ở trên một hệ thống với stty:

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

Không có đá quý xin vui lòng, tôi thích câu trả lời này ;-) – lzap

2

Đây là giải pháp cho hệ thống 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

Bạn muốn đảm bảo mã của bạn là không cần thiết ... các giải pháp khác được liệt kê ở đây giả sử bạn muốn thoát khỏi đoạn chức năng này bằng tiếng vọng được bật trở lại. Vâng, nếu nó đã bị tắt trước khi nhập mã, và nó dự kiến ​​sẽ ở lại?

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

Bạn có thể sử dụng phương pháp STDIN.noecho từ các module IO/console:

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

'NoMethodError: phương pháp không xác định 'noecho' cho # >' trên 'ruby 2.0.0p648 (2015-12-16 phiên bản 53162) [universal.x86_64-darwin15]' – Ian

+4

'require 'io/console'' – ddubs

+1

Đây là người chiến thắng. –

Các vấn đề liên quan