Net::SSH serialized commands

L

lyrics

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
 
S

Sebastian W.

lyrics said:
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
 
L

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

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
 
S

Sebastian W.

lyrics said:
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.
 
L

lyrics

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.

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

Sebastian W.

lyrics said:
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. :)

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. :p
 
R

Rodrigo Bermejo

Sebastian said:
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.
 
L

lyrics

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. :)

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. :p

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

lyrics

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

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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,766
Messages
2,569,569
Members
45,042
Latest member
icassiem

Latest Threads

Top