Подтвердить что ты не робот

Ruby $stdin.gets без отображения символов на экране

Я хочу попросить пользователей ввести пароль, но я не хочу, чтобы символы появлялись на экране по мере их ввода.

Как это сделать в Ruby?

4b9b3361

Ответ 1

Существует такой камень для такого взаимодействия с пользователем: highline.

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

Или даже:

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

Ответ 2

Если вы находитесь в системе с stty:

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

Ответ 3

Вы можете использовать метод STDIN.noecho из модуля IO/console:

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

Ответ 4

Вы хотите убедиться, что ваш код является идемпотентным... другие перечисленные здесь решения предполагают, что вы хотите выйти из этого блока функций с включенным эхом. Ну, что, если он был выключен, прежде чем вводить код, и он ожидал остаться?

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}"

Ответ 5

Это решение для систем 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