2010-04-11 2 views
2

Je suis en cours d'exécution d'une commande pour pousser les fichiers Google App Engine, et il pourrait me demander mon email et mot de passe:Terminal demande un email et un mot de passe, comment le remplir par programme (en Ruby)?

$ appcfg.py update . 
Application: my-cdn; version: 3. # printed out 
Server: appengine.google.com. # printed out 
Scanning files on local disk. # printed out 
Initiating update. # printed out 
Email: [email protected] # now it asks me... 
Password: 

Je suis en cours d'exécution que Ruby dès maintenant en utilisant ceci: %x[appcfg.py update .]. Comment puis-je remplir le courriel et le mot de passe? Je l'ai vu quelque chose comme ça avec Capistrano:

%x[appcfg.py update .] do |channel, stream, data| 
    channel.send_data "#{yaml['production']['email']}\n" if data =~ /^Email:/ 
end 

... mais ne l'ai pas compris comment configurer que sans elle.

Quelle est la meilleure façon de remplir les choses que la ligne de commande demande par programme?

Un autre problème est que si je lance la commande par Ruby, je peux voir la sortie que la commande est exécutée, mais il me montre jamais « Email: » la ligne, il arrête ici:

Application: my-cdn; version: 3. 
Server: appengine.google.com. 
Scanning files on local disk. 
Initiating update. 
# ... can't see "Email: " 

Merci pour les conseils.

Répondre

1

Généralement, vous pouvez utiliser Open3.popen3(command) do |input, output, error| ... end pour invoquer une commande, écrire dans son flux d'entrée et lire ses flux de sortie et d'erreur (vous devez d'abord require "open3").

Cependant, cela ne fonctionne généralement pas avec les programmes qui demandent un mot de passe (parce qu'ils accèdent directement au terminal au lieu de simplement lire depuis stdin). Dans ce cas, vous devez utiliser PTY (require "pty") au lieu de open3. PTY.getpty génère un shell et renvoie un tableau contenant le flux de sortie du shell, le flux d'entrée et le pid. Vous pouvez les utiliser pour invoquer des commandes et lire leur entrée (sachez que la sortie que vous lisez inclura également l'invite du shell et l'invocation de la commande).

+0

merci, cela aide beaucoup! –

Questions connexes