net-ssh和远程环境

时间:2011-07-28 04:22:15

标签: ruby net-ssh

我想使用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")

3 个答案:

答案 0 :(得分:5)

你尝试过类似的事情吗?

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

答案 1 :(得分:0)

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

例如,我有一个可运行的ruby脚本,我正在使用zsh,所以我只是使用它:

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

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

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

答案 2 :(得分:0)

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

尝试net-ssh-session

命令不是独立的,它会加载用户的env变种。