Как я могу выполнить 2 или более команд в одном сеансе SSH? - PullRequest
5 голосов
/ 08 сентября 2010

У меня есть следующий скрипт:

#!/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/")
    ssh.exec!( "pwd" ) do |channel, stream, data|
        stdout << data if stream == :stdout
    end
    puts stdout

    ssh.loop
end

и я получаю /root вместо /var/example/engines/

Ответы [ 7 ]

2 голосов
/ 09 сентября 2010

В 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.

2 голосов
/ 17 июня 2015

Вы можете просто давать разные команды, разделенные новой строкой.Примерно так:

@result = ssh.exec!("cd /var/example/engines/
                    pwd
                   ")
puts @result

Вероятно, проще (и понятнее) передать команду переменной, а затем передать переменную в exec.Тот же принцип, хотя.

2 голосов
/ 08 сентября 2010
ssh.exec("cd /var/example/engines/; pwd")

Это выполнит команду cd, затем команду pwd в новом каталоге.

Я не рубин, но я собираюсь догадаться, что естьболее элегантные решения.

1 голос
/ 09 сентября 2010

Раньше имелся сервис оболочки, который разрешал команду с сохранением состояния, как вы пытались сделать в net / ssh v1, но она была удалена в v2.Однако есть сторонний проект автора net / ssh, который позволяет вам это сделать.Посмотрите здесь: http://github.com/jamis/net-ssh-shell

1 голос
/ 09 сентября 2010

посмотрите, есть ли что-то аналогичное синтаксису блока cd файла (utils?), В противном случае просто запустите команду в том же подоболочке, например, ssh.exec "cd / var / example / engine /; pwd"?

1 голос
/ 08 сентября 2010

Я не программист ruby, но вы можете попытаться объединить ваши команды;или &&

0 голосов
/ 19 марта 2015

Текущее местоположение net-ssh-shell изменено.

Я решил использовать случайный сценарий оболочки, чтобы скопировать файл на удаленный компьютер и отправить его в оболочку. В основном это делается: File.write(script_path, script_str) gear.ssh.scp_to(script_path, File.dirname(script_path)) gear.ssh.exec(". script_path")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...