4

我对 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

4

2 回答 2

5

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

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

于 2012-05-16T19:01:41.337 回答
0

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”。
如下所示,将向您展示在一个执行程序中使用 cd !command 不会更改下一个 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

于 2017-04-10T03:01:16.223 回答