Терминал запрашивает электронную почту и пароль, как мне программно заполнить его (в Ruby)? - PullRequest
2 голосов
/ 11 апреля 2010

Я запускаю команду для отправки файлов в Google App Engine, и она может запросить у меня адрес электронной почты и пароль:

$ 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@gmail.com # now it asks me...
Password:

Я запускаю это в Ruby прямо сейчас, используя это: %x[appcfg.py update .]. Как я могу заполнить электронную почту и пароль? Я видел что-то подобное с Capistrano:

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

... но не выяснили, как это настроить без него.

Какой лучший способ заполнить то, что запрашивает командная строка программно?

Другая проблема заключается в том, что если я запускаю команду через ruby, я могу видеть вывод при выполнении команды, но она никогда не показывает мне строку «Email:», она останавливается здесь:

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

Спасибо за советы.

1 Ответ

1 голос
/ 11 апреля 2010

Как правило, вы можете использовать Open3.popen3(command) do |input, output, error| ... end для вызова команды, записи в ее входной поток и чтения из ее потоков вывода и ошибок (сначала вам нужно require "open3").

Однако это обычно не работает с программами, которые запрашивают пароль (потому что они обращаются к терминалу напрямую, а не просто читают из стандартного ввода). В этом случае вам нужно использовать PTY (require "pty") вместо open3. PTY.getpty порождает оболочку и возвращает массив, содержащий выходной поток оболочки, входной поток и pid. Вы можете использовать их для вызова команд и чтения их ввода (имейте в виду, что прочитанный вами вывод будет также включать приглашение оболочки и вызов команды).

...