вход в систему ruby ​​net-ssh - PullRequest
6 голосов
/ 19 февраля 2011

Есть ли способ получить оболочку входа в ruby, используя net-ssh? Это вообще возможно?

Под оболочкой входа в систему я подразумеваю источник /etc/profile..

Ответы [ 2 ]

14 голосов
/ 17 марта 2011

Net-SSH - слишком низкий уровень, чтобы просто обеспечить это заранее (так или иначе, в любом случае).Вы можете проверить Net-SSH-Shell, который основан на Net-SSH для добавления функциональности оболочки входа в систему: https://github.com/mitchellh/net-ssh-shell

Реализация надежна и работает, однако я нашел ее не слишком полезной, поскольку вы не можете специальноизвлекать такие вещи, как stderr или exit status, потому что команды запускаются в под-оболочке, поэтому вы можете получить только stdout.Библиотека net-ssh-shell использует некоторые хаки для получения статуса выхода.

Мне нужна «оболочка входа» для моих собственных проектов Ruby, и для этого я обычно выполняю действия непосредственно в оболочке.используя следующий код:

def execute_in_shell!(commands, shell="bash")
  channel = session.open_channel do |ch|
    ch.exec("#{shell} -l") do |ch2, success|
      # Set the terminal type
      ch2.send_data "export TERM=vt100\n"

      # Output each command as if they were entered on the command line
      [commands].flatten.each do |command|
        ch2.send_data "#{command}\n"
      end

      # Remember to exit or we'll hang!
      ch2.send_data "exit\n"

      # Configure to listen to ch2 data so you can grab stdout
    end
  end

  # Wait for everything to complete
  channel.wait
end

В этом решении вы все равно не получите статус выхода или команды stderr, запущенные в оболочке входа, но по крайней мере команды выполняются в этом контексте.

Надеюсь, это поможет.

0 голосов
/ 06 мая 2018

Есть лучший способ сделать это сейчас. Вместо этого вы можете использовать подсистему оболочки с pty, чтобы получить все, что вы ожидаете от входа в оболочку:

Net::SSH.start(@config.host, @config.user, :port => @config.port, :keys => @config.key, :config => true) do |session|
  session.open_channel do |channel|
    channel.request_pty
    channel.send_channel_request "shell" do |ch, success|
      if success
        ch.send_data "env\n"
        ch.send_data "#{command}\n"
        ch.on_data do |c, data|
          puts data
        end
      end
      channel.send_data "exit\n"

      channel.on_close do
        puts "shell closed"
      end
    end
  end
end

конец

...