2008-09-25 10 views
35

Estoy ejecutando Ruby y MySQL en una caja de Windows.¿Cómo puedo leer una contraseña desde la línea de comando en Ruby?

Tengo un código Ruby que necesita conectarse a una base de datos MySQL para realizar una selección. Para conectarme a la base de datos, debo proporcionar la contraseña, entre otras cosas.

El código de Ruby puede mostrar un mensaje que solicita la contraseña, el usuario escribe la contraseña y pulsa la tecla Intro. Lo que necesito es que la contraseña, tal como está escrita, se muestre como una línea de asteriscos.

¿Cómo puedo hacer que Ruby muestre la contraseña ingresada como una línea de asteriscos en el 'cuadro de dos'?

Respuesta

50

Para responder a mi propia pregunta, y para el beneficio de cualquier otra persona que le gustaría saber, no es una joya llamada Rubí HighLine que necesita.

require 'rubygems' 
require 'highline/import' 

def get_password(prompt="Enter Password") 
    ask(prompt) {|q| q.echo = false} 
end 

thePassword = get_password() 
+0

highline no funcionaría para mí, aún se hizo eco de la contraseña. Creo que tenía algo que ver con que termios no se instalaran, pero aún así no funcionó después de instalar ruby-termios. Usé ruby-password en su lugar. – user2063200

24

solución del pobre hombre:

system "stty -echo" 
# read password 
system "stty echo" 

O usando http://raa.ruby-lang.org/project/ruby-password/

El público objetivo de esta biblioteca es administradores de sistemas que necesitan para escribir programas de Ruby que incitan a, generan, verificar y cifrar las contraseñas.

Editar: chillidos no me di cuenta de que necesita esta para Windows :(

+0

He intentado esto en combinación con readline y pude sigue viendo la contraseña – Besi

+1

contraseña = STDIN.noecho (&: obtiene) .chomp; # <- esto debería funcionar también (probablemente no para Windows) – jonS90

12

de acuerdo con el documento Highline, esto parece funcionar. No estoy seguro de si funcionará en Windows.

#!/usr/local/bin/ruby 
require 'rubygems' 
require 'highline/import' 

username = ask("Enter your username: ") { |q| q.echo = true } 
password = ask("Enter your password: ") { |q| q.echo = "*" } 

Aquí está la salida en la consola:

$ ruby highline.rb 
Enter your username: doug 
Enter your password: ****** 
+1

Si está ejecutando el script con el comando 'ruby', no necesita el' #!/Usr/local/bin/ruby', si ejecuta el script directamente, con './Highline.rb', lo harías. –

+3

Permítanme agregar que usualmente #!/Usr/bin/env ruby ​​es mejor como primera línea ya que encuentra la instalación de ruby ​​independientemente de dónde se encuentre. – user132837

3

Las siguientes obras (lobin.rb) en Ruby no jruby

require 'highline/import' 

$userid = ask("Enter your username: ") { |q| q.echo = true } 
$passwd = ask("Enter your password: ") { |q| q.echo = "*" } 

de salida de la consola:

E:\Tools>ruby login.rb 
Enter your username: username 
Enter your password: ******** 

Howerver si funciono en jruby falla y no da oportunidad de ingresar su contraseña.

E:\Tools>jruby login.rb 
Enter your username: username 
Enter your password: 
0

La gema fancy_gets tiene una cosa contraseña que funciona bien con jruby:

https://github.com/lorint/fancy_gets

Código termina como:

require 'fancy_gets' 
include FancyGets 

puts "Password:" 
pwd = gets_password 
# ... 
Cuestiones relacionadas