2014-04-14 16 views
0

由于net-ssh手册中说“exec”方法在通道上异步执行一个命令。 http://net-ssh.github.io/ssh/v1/chapter-3.html#s6如何用ruby net ssh通道执行教程?

但是,当我希望以执行一些教官,例如:

def work(session, instructor) 
    session.open_channel do |channel| 
    channel.on_data do |ch, data| 
     puts data.strip 
    end 
    channel.exec instructor 
    end 
end 

Net::SSH.start('host') do |session| 
    work session, "touch a.file" 
    work session, "mv a.file b.file" 
    work session, "rm b.file" 
    session.loop 
end 

执行命令异步真的让这样的代码无法正常工作。

有人能帮我解决这个问题吗?

谢谢!

回答

1

使用sync shell service它,这样做:

Net::SSH.start('localhost') do |session| 
    shell = session.shell.sync 
    shell.touch 'a.file' 
    shell.mv 'a.file', 'b.file' 
    shell.send_command("rm", 'b.file') 
    shell.exit 
end 

或者只是组织的命令上-A线:

work session, "touch a.file; mv a.file b.file; rm b.file" 
+0

如果我想给exec命令不是一个基本的shell命令?我认为第二种方式是可以的。但目前还不清楚我的命令是否很长。谢谢。 – wonderflow

+0

@wonderflow文件说不是shell只是bash,我相信这只是默认的删除shell。 –

+0

@МалъСкрылевъ - 我有一个与ssh连接状态有关的小问题。请帮助我 - https://stackoverflow.com/questions/28799593/unix-commands-work-on-server-but-not-in-ruby-ssh-session谢谢。 – james