Ruby Net :: SSH使用变量插值更改目录

我对Ruby很新,所以如果我遗漏了一些明显的东西,请原谅我。

问题是Ruby似乎没有在Net :: SSH.exec中进行变量插值! 方法。

VCL_DIR = "/usr/local/etc/varnish/" host = '0.0.0.0' Net::SSH.start(host, 'root') do |ssh| puts "Changing directories to #{VCL_DIR}" ssh.exec!("cd #{VCL_DIR}") res = ssh.exec!("pwd") puts "Server reports current directory as #{res}" end 

输出:

 Changing directories to /usr/local/etc/varnish/ Server reports current directory as /root 

任何帮助表示赞赏。 使用Ruby 1.9.3p194

问题是Net :: SSH为每个exec调用使用不同的shell。 解决方案是使用有状态shell。 有一个gem可以做到这一点,但它已经过时了。 Net :: SSH :: Shell通过https://github.com/mitchellh/net-ssh-shell

我选择使用Rye来处理这个任务。 http://code.google.com/p/rye/

Net::SSH.start( "10.2.10.1", "botp:)", :password=>"secret=)") do |session| puts session.exec! "ls -la; cd /etc; ls -la" end

参考: https : //www.ruby-forum.com/topic/160890

请注意:你必须每个.exec! “cd” .exec! 命令运行。
像下面这样的东西,会告诉你在一个exec中使用cd! 命令不会更改下一个exec命令的位置。

Net::SSH.start( "10.2.10.1", "botp:)", :password=>"secret=)") do |session| puts session.exec!("ls -la; cd /etc; ls -la") puts session.exec!("ls -la") end