Ответ 1
Существует такой камень для такого взаимодействия с пользователем: highline.
password = ask("Password: ") { |q| q.echo = false }
Или даже:
password = ask("Password: ") { |q| q.echo = "*" }
Я хочу попросить пользователей ввести пароль, но я не хочу, чтобы символы появлялись на экране по мере их ввода.
Как это сделать в Ruby?
Существует такой камень для такого взаимодействия с пользователем: highline.
password = ask("Password: ") { |q| q.echo = false }
Или даже:
password = ask("Password: ") { |q| q.echo = "*" }
Если вы находитесь в системе с stty
:
`stty -echo`
print "Password: "
pw = gets.chomp
`stty echo`
puts ""
Вы можете использовать метод STDIN.noecho из модуля IO/console:
pw = STDIN.noecho(&:gets).chomp
Вы хотите убедиться, что ваш код является идемпотентным... другие перечисленные здесь решения предполагают, что вы хотите выйти из этого блока функций с включенным эхом. Ну, что, если он был выключен, прежде чем вводить код, и он ожидал остаться?
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}"
Это решение для систем 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
Подобный ответ как glenn, но более полный: http://dmathieu.com/articles/development/ruby-console-ask-for-a-password/