35 votes

Comment lire un mot de passe depuis la ligne de commande en Ruby ?

J'utilise Ruby et MySQL sur une machine Windows.

J'ai du code Ruby qui doit se connecter à une base de données MySQL et effectuer une sélection. Pour se connecter à la base de données, je dois notamment fournir le mot de passe.

Le code Ruby peut afficher une invite demandant le mot de passe, l'utilisateur tape le mot de passe et appuie sur la touche Entrée. Ce dont j'ai besoin, c'est que le mot de passe, tel qu'il est tapé, soit affiché comme une ligne d'astérisques.

Comment puis-je faire en sorte que Ruby affiche le mot de passe saisi sous la forme d'une ligne d'astérisques dans la "boîte à outils" ?

51voto

Simon Knights Points 894

Pour répondre à ma propre question, et pour le bénéfice de tous ceux qui voudraient le savoir, il existe une gemme Ruby appelée HighLine dont vous avez besoin.

require 'rubygems'
require 'highline/import'

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

thePassword = get_password()

0 votes

Highline n'a pas fonctionné pour moi, il a toujours renvoyé le mot de passe. Je pense que cela avait quelque chose à voir avec le fait que termios n'était pas installé, mais cela ne fonctionnait toujours pas après avoir installé ruby-termios. J'ai utilisé ruby-password à la place.

24voto

jk. Points 4421

La solution du pauvre :

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

Ou en utilisant http://raa.ruby-lang.org/project/ruby-password/

Cette bibliothèque s'adresse aux administrateurs système qui doivent écrire des programmes Ruby pour demander, générer, vérifier et chiffrer des mots de passe.

Editar: Oups, je n'ai pas remarqué que vous avez besoin de cela pour Windows :(

0 votes

J'ai essayé ceci en combinaison avec readline et je pouvais toujours voir le mot de passe.

1 votes

Password = STDIN.noecho(&:gets).chomp ; # <-- ceci devrait aussi fonctionner (probablement pas pour Windows)

12voto

Eric Monti Points 101

Selon la documentation de Highline, cela semble fonctionner. Je ne suis pas sûr que cela fonctionne sous 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 = "*" }

Voici la sortie sur la console :

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

1 votes

Si vous exécutez le script avec la commande ruby vous n'avez pas besoin de la commande #!/usr/local/bin/ruby si vous exécutez le script directement, avec ./highline.rb vous le feriez.

3 votes

Permettez-moi d'ajouter que généralement #!/usr/bin/env ruby est mieux comme première ligne car il trouve l'installation de ruby indépendamment de l'endroit où elle se trouve.

7voto

Kris Points 3781

À partir de Ruby 2.3, vous pouvez utiliser la fonction IO#getpass en tant que telle :

require 'io/console' 

STDIN.getpass("Password: ")

http://ruby-doc.org/stdlib-2.3.0/libdoc/io/console/rdoc/IO.html#method-i-getpass

Ce qui précède est copié à partir d'une réponse supprimée par Zoran Majstorovic .

4voto

Jesse Schwartz Points 11

Ce qui suit fonctionne (lobin.rb) dans ruby pas dans jruby

require 'highline/import'

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

Sortie de la console :

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

Cependant, si je l'exécute en jruby, il échoue et ne donne aucune possibilité d'entrer votre mot de passe.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X