Потеря переменной среды, установленной через выполнение ssh. Руби и net-ssh

Я хотел бы установить переменные среды 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 "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"

person Naga    schedule 21.06.2019    source источник
comment
Вы убедились, что csh действительно работает на удаленной стороне?   -  person user1934428    schedule 21.06.2019


Ответы (2)


Каждый 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.

person peter    schedule 21.06.2019
comment
Питер, спасибо за идею net-ssh-session, но теперь я столкнулся с ошибкой ниже ruby/gems/2.5.0/gems/net-ssh-2.9.4/lib/net/ssh/authentication/pageant.rb:1 :in `require': невозможно загрузить такой файл -- dl/import (LoadError) - person Naga; 22.06.2019
comment
Извини, Нага, сам не использовал драгоценный камень, так что не могу помочь. Попробуйте установить необходимый гем отдельно. - person peter; 23.06.2019

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

person Naga    schedule 25.06.2019