Потеря переменной окружения, установленной через ssh execute. Ruby & net-ssh - PullRequest
1 голос
/ 21 июня 2019

Я хотел бы установить переменные среды Linux при запуске net-ssh и использовать их далее в моем коде. Но я теряю область видимости переменных. Подскажите, пожалуйста, как этого можно достичь.

Я использую net-ssh и захожу в Linux через ключ rsa. Я установил переменную окружения, которую я хотел бы использовать ниже, но я теряю область действия переменной.

ssh = Net::SSH.start(host,
                     username
)
result = ssh.exec!('setenv SYBASE /opt/sybase && printenv') ### Can See environment variable SYBASE
puts result
puts "**********************************************************************************"
result = ssh.exec!('printenv')   #### Lost the environment variable SYBASE set above
puts result
puts "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

@ Питер, спасибо за предложение net-ssh-session. Однако net-ssh-session нужно было перекомпилировать, чтобы сделать его совместимым с версией net-ssh 5.2.0. Пример здесь прекрасно работает и это то, что мне нужно.

0 голосов
/ 21 июня 2019

Каждый exec создает среду самостоятельно, переменные окружения теряются.Как и в случае с && (выполнить следующую команду, если первый успешен) или с ; (выполнить в любом случае), вы можете объединять команды в цепочку.

Вы также можете отправить подобный блок для выполнения нескольких действий

Net::SSH.start("host", "user") do |ssh|
  ssh.exec! "cp /some/file /another/location"
  hostname = ssh.exec!("hostname")
  ssh.open_channel do |ch|
    ch.exec "sudo -p 'sudo password: ' ls" do |ch, success|
      abort "could not execute sudo ls" unless success

      ch.on_data do |ch, data|
        print data
        if data =~ /sudo password: /
          ch.send_data("password\n")
        end
      end
    end
  end

  ssh.loop
end

Или используйте гем net-ssh-session .

...