2010-09-13 12 views
18

Chcę poprosić użytkowników o wpisanie hasła, ale nie chcę, aby znaki pojawiały się na ekranie podczas pisania.

Jak to zrobić w Ruby?

Odpowiedz

14

Jest taki klejnot dla takiej interakcji użytkownika: highline.

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

Albo nawet:

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

słodki! (15chars) – st0le

+10

Co zrobić, jeśli terminal użytkownika nie ma czarnego tła? –

+0

to tylko dla skryptu w domu, więc nie jest to problem :) dobrze zwrócić uwagę na innych, chociaż –

24

Jeśli jesteś na systemie z stty:

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

Brak klejnotów, podoba mi się ta odpowiedź ;-) – lzap

2

To rozwiązanie dla systemów 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

Chcesz się upewnić, że twój kod jest idempotentny ... inne wymienione tutaj rozwiązania zakładają, że chcesz wyjść z tego kawałka funkcjonalności, gdy echo jest ponownie włączone. Cóż, a jeśli to było wyłączone przed wpisaniem kodu i oczekuje się, że pozostanie wyłączone?

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

Można użyć metody STDIN.noecho z modułu IO/konsoli:

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

'NoMethodError: niezdefiniowana metoda 'noecho' dla # >' na 'ruby 2.0.0p648 (wersja 2015-12-16 53162) [universal.x86_64-darwin15]' – Ian

+4

'require 'io/console'' – ddubs

+1

To jest zwycięzca. –

Powiązane problemy