Net::SSH serialized commands

Hi,
I am using Net::SSH v2
I want to execute a command when the first one is complete.
But I can't make it working.
Here is my code:

Net::SSH.start( addr, user, :password => passwd) do |session|
session.exec! ("service X restart")
session.exec!("<command to configure service X>")
end

The issue is that the second "session.exec!" is executed before
service is restarted.

I guess I am not doing the right way but I don't know how to do it.
Can someone help me,please?

lyrics

lyrics wrote:

Hi,
I am using Net::SSH v2
I want to execute a command when the first one is complete.
But I can't make it working.
Here is my code:

Net::SSH.start( addr, user, :password => passwd) do |session|
session.exec! ("service X restart")
session.exec!("<command to configure service X>")
end

The issue is that the second "session.exec!" is executed before
service is restarted.

I guess I am not doing the right way but I don't know how to do it.
Can someone help me,please?

lyrics

Not sure if this would accomplish what you are looking for, but you
could try just doing this:

Net::SSH.start( addr, user, :password => passwd) do |session|
session.exec! ("service X restart; <command to configure service X>")
end

···

--
Posted via http://www.ruby-forum.com/\.

Thanks for replying.
The solution isn't suitable.
I need to execute other commands on another ssh connexion.
Actually, my code is more like this:

Net::SSH.start( addr, user, :password => passwd) do |session1|
  Net::SSH.start( addr2, user2, :password => passwd2) do |session2|
    session1.exec! ("service X restart;")
    session2.exec! ("<command...>")
    session1.exec! ("<command ...>")
  end
end

···

On 14 jan, 22:12, "Sebastian W." <switt...@yahoo.com> wrote:

lyrics wrote:
> Hi,
> I am using Net::SSH v2
> I want to execute a command when the first one is complete.
> But I can't make it working.
> Here is my code:

> Net::SSH.start( addr, user, :password => passwd) do |session|
> session.exec! ("service X restart")
> session.exec!("<command to configure service X>")
> end

> The issue is that the second "session.exec!" is executed before
> service is restarted.

> I guess I am not doing the right way but I don't know how to do it.
> Can someone help me,please?

> lyrics

Not sure if this would accomplish what you are looking for, but you
could try just doing this:

Net::SSH.start( addr, user, :password => passwd) do |session|
session.exec! ("service X restart; <command to configure service X>")
end
--
Posted viahttp://www.ruby-forum.com/.

lyrics wrote:

> end
could try just doing this:

Net::SSH.start( addr, user, :password => passwd) do |session|
�session.exec! ("service X restart; <command to configure service X>")
end
--
Posted viahttp://www.ruby-forum.com/.

Thanks for replying.
The solution isn't suitable.
I need to execute other commands on another ssh connexion.
Actually, my code is more like this:

Net::SSH.start( addr, user, :password => passwd) do |session1|
  Net::SSH.start( addr2, user2, :password => passwd2) do |session2|
    session1.exec! ("service X restart;")
    session2.exec! ("<command...>")
    session1.exec! ("<command ...>")
  end
end

Hm...that looks a bit odd to me. Why do the sessions have to be nested?

If you need to do more advanced stuff - which it sounds like - "exec!"
probably will not suffice as it is just a convenience method.

Here is the Net::SSHv2 docs, they're very helpful:
http://net-ssh.rubyforge.org/ssh/v2/api/index.html

What you are likely looking for is to use Net::SSH::Multi (maybe), build
up an aggregated event loop, and then run it with the "loop" method.

···

On 14 jan, 22:12, "Sebastian W." <switt...@yahoo.com> wrote:

--
Posted via http://www.ruby-forum.com/\.

Basically, I just want to manage 2 PCs.
"sending command to PC1
wait until command finished
sending command to PC2
wait until command finished
sending command to PC1
wait until command finished"

I thought open both sessions at the same time was a convenient way to
open them only once.

···

On 14 jan, 23:31, "Sebastian W." <switt...@yahoo.com> wrote:

lyrics wrote:
> On 14 jan, 22:12, "Sebastian W." <switt...@yahoo.com> wrote:
>> > end
>> could try just doing this:

>> Net::SSH.start( addr, user, :password => passwd) do |session|
>> session.exec! ("service X restart; <command to configure service X>")
>> end
>> --
>> Posted viahttp://www.ruby-forum.com/.

> Thanks for replying.
> The solution isn't suitable.
> I need to execute other commands on another ssh connexion.
> Actually, my code is more like this:

> Net::SSH.start( addr, user, :password => passwd) do |session1|
> Net::SSH.start( addr2, user2, :password => passwd2) do |session2|
> session1.exec! ("service X restart;")
> session2.exec! ("<command...>")
> session1.exec! ("<command ...>")
> end
> end

Hm...that looks a bit odd to me. Why do the sessions have to be nested?

If you need to do more advanced stuff - which it sounds like - "exec!"
probably will not suffice as it is just a convenience method.

Here is the Net::SSHv2 docs, they're very helpful:http://net-ssh.rubyforge.org/ssh/v2/api/index.html

What you are likely looking for is to use Net::SSH::Multi (maybe), build
up an aggregated event loop, and then run it with the "loop" method.

--
Posted viahttp://www.ruby-forum.com/.

lyrics wrote:

> � end
up an aggregated event loop, and then run it with the "loop" method.

--
Posted viahttp://www.ruby-forum.com/.

Basically, I just want to manage 2 PCs.
"sending command to PC1
wait until command finished
sending command to PC2
wait until command finished
sending command to PC1
wait until command finished"

I thought open both sessions at the same time was a convenient way to
open them only once.

Hm...I'm not an expert, but it seems to me in this case that it'd be
easier actually just to code it that way.

If your commands are short, you could always inline them with a {} style
block instead of do/end, if you really want to cut down on your line
count. :slight_smile:

I guess for establishing the sessions, maybe it's a little inefficient
since you're opening up four sessions instead of two, but sometimes you
just have to DTSTTCPW. :stuck_out_tongue:

···

On 14 jan, 23:31, "Sebastian W." <switt...@yahoo.com> wrote:

--
Posted via http://www.ruby-forum.com/\.

Sebastian W. wrote:

lyrics wrote:

I would enclose all the commands in a specific script on the target
client.
And then just execute this top level script from your ssh session..your
native script will take care of the rest.

(obviously it does not work if your a building your program logic on the
fly ..but you can also create your script on your box, scp to the target
box and then execute it)

..just another view

-r.

···

--
Posted via http://www.ruby-forum.com/\.

I may try this, but I want to avoid since this code is executed more
than 200 times.

···

On 15 jan, 00:30, "Sebastian W." <switt...@yahoo.com> wrote:

lyrics wrote:
> On 14 jan, 23:31, "Sebastian W." <switt...@yahoo.com> wrote:

>> > end
>> up an aggregated event loop, and then run it with the "loop" method.

>> --
>> Posted viahttp://www.ruby-forum.com/.

> Basically, I just want to manage 2 PCs.
> "sending command to PC1
> wait until command finished
> sending command to PC2
> wait until command finished
> sending command to PC1
> wait until command finished"

> I thought open both sessions at the same time was a convenient way to
> open them only once.

Hm...I'm not an expert, but it seems to me in this case that it'd be
easier actually just to code it that way.

If your commands are short, you could always inline them with a {} style
block instead of do/end, if you really want to cut down on your line
count. :slight_smile:

I guess for establishing the sessions, maybe it's a little inefficient
since you're opening up four sessions instead of two, but sometimes you
just have to DTSTTCPW. :stuck_out_tongue:
--
Posted viahttp://www.ruby-forum.com/.

I did more test.
I found out that I was working on the wrong issue:
the "exec!" command do it job well.
I think my issue comes from restarting a service.
It likes it takes times before really "up" whereas the command returns.

···

On 15 jan, 10:41, lyrics <robin.cy...@gmail.com> wrote:

On 15 jan, 00:30, "Sebastian W." <switt...@yahoo.com> wrote:

> lyrics wrote:
> > On 14 jan, 23:31, "Sebastian W." <switt...@yahoo.com> wrote:

> >> > end
> >> up an aggregated event loop, and then run it with the "loop" method.

> >> --
> >> Posted viahttp://www.ruby-forum.com/.

> > Basically, I just want to manage 2 PCs.
> > "sending command to PC1
> > wait until command finished
> > sending command to PC2
> > wait until command finished
> > sending command to PC1
> > wait until command finished"

> > I thought open both sessions at the same time was a convenient way to
> > open them only once.

> Hm...I'm not an expert, but it seems to me in this case that it'd be
> easier actually just to code it that way.

> If your commands are short, you could always inline them with a {} style
> block instead of do/end, if you really want to cut down on your line
> count. :slight_smile:

> I guess for establishing the sessions, maybe it's a little inefficient
> since you're opening up four sessions instead of two, but sometimes you
> just have to DTSTTCPW. :stuck_out_tongue:
> --
> Posted viahttp://www.ruby-forum.com/.

I may try this, but I want to avoid since this code is executed more
than 200 times.