From: Heesob Park Date: 2009-07-29T13:43:01+09:00 Subject: Re: Ignore F1-F12 keys when user enters text input on console Hi, 2009/7/29 Deiva Rajasingam : > 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? Try Kernel#select like this: def read_char system "stty raw -echo " ch = STDIN.getc if ch.chr==27.chr STDIN.getc while(select([STDIN],nil,nil,0)) end ensure system "stty -raw echo " return ch end Regards, Park Heesob