【问题标题】:net-ssh and remote environmentnet-ssh 和远程环境
【发布时间】:2011-07-28 04:22:14
【问题描述】:

我想使用 net-ssh 库在我的服务器上执行一些远程命令。

我有以下例子:

Net::SSH::start(host, user, options = {:keys => '~/.ssh/id_rsa'}) do |ssh|
  puts ssh.exec!("echo $PATH")
  ssh.loop
end

结果是:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

我的问题是我的 PATH 没有按应有的方式加载。

我还应该有一些 RVM 路径,以及在我的 .zshrc 中定义的自定义路径。

如何更改此行为以让 net-ssh 使用我的 .zshrc 加载我的默认环境?

解决方案:

puts ssh.exec!("source ~/.zshrc; echo $PATH")

【问题讨论】:

    标签: ruby net-ssh


    【解决方案1】:

    您是否尝试过类似的方法:

    ssh.exec!("source /home/you/.zshrc")
    puts ssh.exec!("echo $PATH")
    

    ?

    【讨论】:

    • 感谢您的贡献。每个执行官!命令是独立的。这意味着每次都会重置环境。我已经更新了我的问题,解释了我是如何解决这个问题的。但是感谢您的帮助:-)
    【解决方案2】:

    实际上找到了解决这个问题的方法。这是一个很好的解决方案。感谢 Vald 告诉我每个 exec 都是独立的,所以你可以使用 && 将命令链接在一起。

    例如,我有一个可运行的 ruby​​ 脚本,而且我正在使用 zsh,所以我只使用这个:

    ssh.exec("source .zshrc && ./backup.rb")
    

    像魅力一样工作!当然,您也可以安全起见并使用完整路径或 ~,但它可以完成工作。

    编辑:对不起,刚刚看到你在上面提出了一个解决方案。使用;&&有区别吗?

    【讨论】:

    • 当使用&&时,第二个只会在第一个成功时触发。使用; 时,无论第一个命令的退出代码如何,都会触发第二个命令。
    • 是的。终于知道了哈哈
    【解决方案3】:

    不要使用 Net/SSH 运行多个命令。

    试试net-ssh-session

    命令不是独立的,它会加载用户的环境变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-14
      • 1970-01-01
      • 2011-06-29
      • 2011-01-29
      • 2010-12-10
      • 1970-01-01
      相关资源
      最近更新 更多