4

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")
4

3 に答える 3

6

次のようなことを試しましたか:

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

?

于 2011-07-28T06:05:14.687 に答える
1

実際、この問題を回避する方法を見つけました。とてもいい解決策です。すべての exec はそれ自体から独立していると教えてくれた Vald に感謝します。そのため、&& を使用してコマンドをリンクすることができます。

たとえば、実行可能な ruby​​ スクリプトがあり、zsh を使用しているので、これを使用します。

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

魔法のように動作します!もちろん、安全のためにフル パスまたは ~ を使用することもできますが、それで問題は解決します。

編集:申し訳ありませんが、上記の解決策を見たところです。;と の使用に違いはあり&&ますか?

于 2012-03-01T03:55:41.080 に答える
1

複数のコマンドを実行するために Net/SSH を使用しないでください。

net-ssh-session を試してください。

コマンドは独立しておらず、ユーザーの環境変数をロードします。

于 2013-06-02T23:32:39.710 に答える