net-ssh и удаленная среда - PullRequest
4 голосов
/ 28 июля 2011

Я хочу выполнить некоторую удаленную команду на моем сервере, используя библиотеку 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 ]

6 голосов
/ 28 июля 2011

вы пробовали что-то вроде:

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

?

1 голос
/ 03 июня 2013

Не используйте Net / SSH для запуска нескольких команд.

Попробуйте net-ssh-session .

Команды не являются независимыми и загружают env vars вашего пользователя.

1 голос
/ 01 марта 2012

На самом деле нашел способ обойти эту проблему.Это довольно хорошее решение.Спасибо Vald за сообщение, что каждый exec независим от самого себя, поэтому вы можете просто использовать && для связывания команд.

Например, у меня есть скрипт ruby, который можно запустить, и я используюzsh, так что я просто использую это:

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

Работает как шарм!Конечно, вы также можете быть в безопасности и использовать полный путь или ~, но он выполняет свою работу.

Редактировать: Извините, также только что видел, как вы поставили решение выше.Есть ли разница между использованием ; и &&?

...