【问题标题】:Losing environment variable set via ssh execute. Ruby & net-ssh丢失通过 ssh 执行设置的环境变量。 Ruby 和 net-ssh
【发布时间】:2019-06-25 09:22:43
【问题描述】:

我想在 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 "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"

【问题讨论】:

  • 您确认csh 确实在远程端运行了吗?

标签: ruby net-ssh


【解决方案1】:

每个 exec 都会自己创建一个环境,environmont 变量会丢失。 就像您使用 &&(如果第一次成功则执行下一个命令)或使用 ;(仍然执行)一样,您可以链接命令。

你也可以像这样发送一个块来做多个动作

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

【讨论】:

  • 彼得,感谢 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)
  • 很抱歉 Naga,我自己没有使用过宝石,所以无能为力。尝试 gem 单独安装所需的 gem。
【解决方案2】:

@peter 感谢您推荐 net-ssh-session。 但是 net-ssh-session 需要重新编译以使其与 net-ssh 5.2.0 版本兼容。 Example here 效果很好,是我需要的。

【讨论】:

    猜你喜欢
    • 2016-01-23
    • 2015-09-28
    • 1970-01-01
    • 2011-04-09
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多