Losing environment variable set via ssh execute. Ruby & net-ssh

402 Views Asked by At

I would like to set Linux environment variables in net-ssh start and use them further down in my code. But I am losing the scope of the variables. Can you please advise how that can be achieved.

I am using net-ssh and logging into Linux via rsa key. I have set a environment variable which I would like to use further down but I am losing the scope of the variable.

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

There are 2 best solutions below

2
peter On BEST ANSWER

Each exec creates an environment on it's own, environmont variables are lost. Like you do with your && (execute next command if first succeeds) or with ; (execute anyway) you can chain commands.

You can also send a block like this to do multiple actions

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

Or use the gem net-ssh-session.

0
Naga On

@peter thank you for suggesting net-ssh-session. However net-ssh-session needed recompile to make it compatible with net-ssh 5.2.0 version. Example here works great and is what needed for me.