Ignore F1-F12 keys when user enters text input on console

Discussion in 'Ruby' started by Deiva Rajasingam, Jul 29, 2009.

  1. I am writing a Ruby script to accept a user's input which will be used
    as a password later on. The user input it taken using STDIN.getc. Since
    it is a password input, when the user enters the characters on the
    keyboard, the entered characters are not displayed and each character is
    obscured by displaying an asterix (*).

    The code snippet is shown below.

    ---------START---------
    def TestFunc
    myPassword = ""

    print "Password: "
    myPassword = getPassword

    print "My password: #{myPassword}\n"
    end

    def read_char
    system "stty raw -echo"
    ch = STDIN.getc
    ensure
    system "stty -raw echo"
    return ch
    end

    def getPassword
    password = ""
    input = ""
    isValidLastChar = 1
    invalidCharacterDetected = 0

    while (password == "") || (password != "" && input != "\r")
    char = read_char
    input = char.chr
    if input == "\r"
    next
    end

    if char == 127 # backspace character pressed
    if password != ""
    password = password.chop
    print "\b \b"
    end
    elsif input != "" && input[0] > 32 && input[0] < 127
    print "*"
    password = password + input
    end
    end

    print "\n"
    return password
    end
    ----------END----------

    For this code, if I entered "1234" (without the quotes), followed by the
    F1 key, the PageUp key, the Right arrow key and finally pressed Enter, I
    see the following output on the screen:

    -----SCREEN OUTPUT-----

    [root@morpheus ~]# irb
    irb(main):001:0> load "TestRuby.rb"
    => true
    irb(main):002:0> testStub
    Password: ***********
    My password: 1234[11~[5~[C
    => nil
    irb(main):004:0>

    -----------------------

    Observe the printed output.
    1 -> displayed as 1
    2 -> displayed as 2
    3 -> displayed as 3
    4 -> displayed as 4
    F1 -> displayed as [11~
    PgUp -> displayed as [5~
    Right arrow -> displayed as [C

    I am finding it difficult to figure out a way to ignore/process special
    keys (F1-F12, Up/Down/Left/Right, PgUp, PgDn, Home, End, etc.).

    Any suggestions or help?
     
    Deiva Rajasingam, Jul 29, 2009
    #1
    1. Advertisements

  2. Sorry a small correction. The test function definition line should be
    changed.

    Replace
    def TestFunc
    with
    def testFunc

    -DR
     
    Deiva Rajasingam, Jul 29, 2009
    #2
    1. Advertisements

  3. Deiva Rajasingam

    Heesob Park Guest

    Hi,

    Try Kernel#select like this:

    def read_char
    system "stty raw -echo "
    ch =3D STDIN.getc
    if ch.chr=3D=3D27.chr
    STDIN.getc while(select([STDIN],nil,nil,0))
    end
    ensure
    system "stty -raw echo "
    return ch
    end

    Regards,

    Park Heesob
     
    Heesob Park, Jul 29, 2009
    #3
  4. Excellent! It works like a charm. Thanks a bunch. :)
     
    Deiva Rajasingam, Jul 29, 2009
    #4
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.