В Net :: SSH #exec
& #exec!
одинаковы, например, они выполняют команду (за исключением того, что exec! Блокирует другие вызовы, пока это не будет сделано).Главное, что нужно помнить, это то, что Net :: SSH запускает каждую команду из каталога пользователя при использовании exec / exec !.Итак, в вашем коде вы запускаете cd /some/path
из каталога /root
, а затем pwd
- снова из каталога /root
.
Самый простой способ, которым я знаю, как запустить несколько команд в последовательностиэто связать их вместе с && (как упоминалось выше другими авторами).Таким образом, это выглядело бы примерно так:
#!/usr/bin/env ruby
require 'rubygems'
require 'net/ssh'
Net::SSH.start('host1', 'root', :password => "mypassword1") do |ssh|
stdout = ""
ssh.exec!( "cd /var/example/engines/ && pwd" ) do |channel, stream, data|
stdout << data if stream == :stdout
end
puts stdout
ssh.loop
end
К сожалению, служба оболочки Net :: SSH была удалена в версии 2.