代码之家  ›  专栏  ›  技术社区  ›  Andrew Bullock

ruby$stdin.gets不在屏幕上显示字符

  •  20
  • Andrew Bullock  · 技术社区  · 14 年前

    我想让用户输入一个密码,但我不希望这些字符在输入时出现在屏幕上。

    我怎么用红宝石做这个?

    6 回复  |  直到 6 年前
        1
  •  13
  •   Brady Marcin Majchrzak    10 年前

    这样的用户交互有一个gem: highline .

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

    甚至:

    password = ask("Password:  ") { |q| q.echo = "*" }
    
        2
  •  24
  •   glenn jackman    14 年前

    如果你的系统 stty :

    `stty -echo`
    print "Password: "
    pw = gets.chomp
    `stty echo`
    puts ""
    
        3
  •  24
  •   Shai Coleman    6 年前

    您可以使用 STDIN.noecho IO/控制台模块的方法:

    require 'io/console'
    pw = STDIN.noecho(&:gets).chomp
    
        4
  •  6
  •   listrophy    12 年前

    你要确保你的代码是等幂的…这里列出的其他解决方案假设您希望在echo重新打开的情况下退出此功能块。好吧,如果在输入代码之前关闭了它,并且希望它保持关闭状态呢?

    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
  •  2
  •   lzap    13 年前

    这是解决方案 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
    
        6
  •  0
  •   A B    11 年前