首页 > 解决方案 > 丢失通过 ssh 执行设置的环境变量。Ruby 和 net-ssh

问题描述

我想在 net-ssh start 中设置 Linux 环境变量,并在我的代码中进一步使用它们。但我失去了变量的范围。您能否告知如何实现这一目标。

我正在使用 net-ssh 并通过 rsa 密钥登录 Linux。我已经设置了一个环境变量,我想进一步使用它,但我失去了变量的范围。

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 "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"

标签: rubynet-ssh

解决方案


每个 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

或者使用 gem net-ssh-session


推荐阅读