ウェブサービスを作っています。

highline を使いましょう

シェル上でパスワードを入力させたいときなど、エコーバックさせたくない場面があります。
このようなときは、

print 'Username: '
username = $stdin.readline.chomp
print 'Password: '
system 'stty -echo > /dev/null 2>&1'
password = $stdin.readline.chomp
system 'stty echo > /dev/null 2>&1'
puts

とやってもいいのですが、bash でパスワード入力中に C-d を押すと例外が発生して終了し、さらにエコーバックされないままになってしまいます。


このようなときは highline を使うのが簡単です。

sudo gem install highline
cd (highline インストール先)
sudo ruby setup.rb

なぜかうちの環境では、setup.rb を実行しないと、うまく動きませんでした。


highline を使用した実装例。

require 'highline'
HighLine.track_eof = false

ui = HighLine.new
username = ui.ask('Username: ')
password = ui.ask('Password: ') { |q| q.echo = false }


track_eof = false はなくても動くかもしれません。
ちゃんと調べていないのですが、特定の環境でのエラー回避策っぽいです。
Capistrano での highline 使用部分では track_eof = false となっています。
(このへんが参考になるのかも: http://www.mail-archive.com/capistrano@googlegroups.com/msg01756.html)


よいお年をお迎えください。