Как скрыть ввод пароля с терминала в скрипте ruby

Я новичок в рубине. Мне нужно получить пароль в качестве ввода с помощью команды gets.

Как скрыть ввод пароля, введенный в терминале, во время вызова gets

70 голосов | спросил jsampath 26 FebruaryEurope/MoscowbFri, 26 Feb 2010 04:15:05 +0300000000amFri, 26 Feb 2010 04:15:05 +030010 2010, 04:15:05

6 ответов


0

Лучший метод из ответа @ eclectic923:

 require 'io/console'
password = STDIN.noecho(&:gets).chomp

Для 1.9.3 (и выше) это требует добавления require 'io/console' в ваш код.

Оригинальный ответ:

Ruby " пароль " является еще одной альтернативой.

ответил ghostdog74 26 FebruaryEurope/MoscowbFri, 26 Feb 2010 04:19:53 +0300000000amFri, 26 Feb 2010 04:19:53 +030010 2010, 04:19:53
0

Можно также использовать основной рубин.

$ ri IO.noecho

 (from ruby core)
 ------------------------------------------------------------------------------
   io.noecho {|io| }
  ------------------------------------------------------------------------------

 Yields self with disabling echo back.

   STDIN.noecho(&:gets)

 will read and return a line without echo back.

Для 1.9.3 (и выше) это требует добавления require 'io/console' в ваш код.

require 'io/console'
text = STDIN.noecho(&:gets)
ответил eclectic923 1 PM000000100000000731 2012, 22:29:07
0

Существует библиотека под названием highline , которая работает следующим образом:

require 'rubygems'
require 'highline/import'

password = ask("Enter password: ") { |q| q.echo = false }
# do stuff with password
ответил Otto Allmendinger 26 FebruaryEurope/MoscowbFri, 26 Feb 2010 04:18:17 +0300000000amFri, 26 Feb 2010 04:18:17 +030010 2010, 04:18:17
0

Как упоминают другие, вы можете использовать IO#noecho для Ruby> = 1,9. Если вам нужна поддержка 1.8, вы можете отправлять на read встроенная функция оболочки:

begin
  require 'io/console'
rescue LoadError
end

if STDIN.respond_to?(:noecho)
  def get_password(prompt="Password: ")
    print prompt
    STDIN.noecho(&:gets).chomp
  end
else
  def get_password(prompt="Password: ")
    `read -s -p "#{prompt}" password; echo $password`.chomp
  end
end

Теперь получить пароль так же просто, как:

@password = get_password("Enter your password here: ")

Примечание: . В реализации, использующей read выше, у вас возникнут проблемы, если вы (или другой клиент get_password) передает специальные символы оболочки в приглашении (например, $ /" /' /и т.д.). В идеале вы должны экранировать строку приглашения, прежде чем передавать ее в оболочку. К сожалению, Shellwords недоступно в Ruby 1.8. К счастью, легко перенести соответствующие биты самостоятельно (особенно shellescape ). С этим вы можете сделать это небольшое изменение:

  def get_password(prompt="Password: ")
    `read -s -p #{Shellwords.shellescape(prompt)} password; echo $password`.chomp
  end

Я упомянул пару проблем с использованием read -s -p в комментарии ниже:

  

Ну, кейс 1.8 немного дерган; это не позволяет   обратная косая черта, если вы не нажмете обратную косую черту дважды: «Символ обратной косой черты   `\ 'может использоваться для удаления любого специального значения для следующего символа   читать и для продолжения строки. "Также:" Символы в значении   переменная IFS используется для разделения строки на слова. «Это должно   вероятно, подойдет для большинства маленьких сценариев, но вы, вероятно,   что-то более надежное для больших приложений.

Мы можем решить некоторые из этих проблем, засучив рукава и выполнив это с помощью ---- +: = 13 = + ---- . Краткое описание того, что нам нужно сделать:

  • Сохранить текущие настройки терминала
  • Поворот эха
  • Распечатайте приглашение & получить пользовательский ввод
  • Восстановите настройки терминала

Мы также должны позаботиться о восстановлении настроек терминала, если они прерваны сигналами и /или исключениями. Следующий код будет правильно обрабатывать сигналы управления заданиями (SIGINT /SIGTSTP /SIGCONT), в то же время хорошо играя с любыми существующими обработчиками сигналов:

stty(1)
ответил Charles 28 MarpmThu, 28 Mar 2013 18:54:37 +04002013-03-28T18:54:37+04:0006 2013, 18:54:37
0

Начиная с Ruby версии 2.3.0, вы можете использовать метод IO#getpass следующим образом:

require 'io/console'
password = STDIN.getpass("Password:")

Смотрите getpass метод в стандартной документации библиотеки.

ответил Zoran Majstorovic 26 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 26 Sep 2016 16:33:31 +0300 2016, 16:33:31
0

Для ruby ​​версии 1.8 (или Ruby <1.9) я использовал чтение встроенная оболочка, как упомянуто @Charles.

Размещение кода, достаточного для запроса имени пользователя & пароль, где имя пользователя будет отображаться на экране при вводе, однако введенный пароль будет молчать.

 userid = `read -p "User Name: " uid; echo $uid`.chomp
 passwd = `read -s -p "Password: " password; echo $password`.chomp
ответил Rishi 6 AM00000020000000031 2014, 02:02:00

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132