如何在同一ssh会话中执行2个或多个命令?
我有以下脚本:如何在同一ssh会话中执行2个或多个命令?
#!/usr/bin/env ruby
require 'rubygems'
require 'net/ssh'
Net::SSH.start('host1', 'root', :password => "mypassword1") do |ssh|
stdout = ""
ssh.exec("cd /var/example/engines/")
ssh.exec!("pwd") do |channel, stream, data|
stdout << data if stream == :stdout
end
puts stdout
ssh.loop
end
,我也得到/root
,而不是/var/example/engines/
看看是否有什么东西类似于文件(utils的?)CD块语法,否则只是在同一子shell,例如运行命令ssh.exec“cd/var/example/engines /; pwd”?
请注意,在加入多个用于'system'调用的命令时,分号(;)可能无法在Windows中工作,即,您应该使用'sysetm“cd/var/example/engines/&& pwd' – 2013-01-28 09:14:06
ssh.exec("cd /var/example/engines/; pwd")
将执行cd
命令,然后在新目录中pwd
命令。
我不是一个红宝石的家伙,但我会猜测有可能是更优雅的解决方案。
我不是一个红宝石程序员,但你可以尝试连接你的命令;或& &
In Net :: SSH,#exec
& #exec!
是相同的,例如,他们执行一个命令(除了exec!阻塞其他调用的例外,直到它完成)。关键要记住的是,当使用exec/exec!时,Net :: SSH实质上运行用户目录中的每个命令。因此,在您的代码中,您从/root
目录运行cd /some/path
,然后运行pwd
- 再次从/root
目录运行。
我知道如何按顺序运行多个命令最简单的方法是将它们链接在一起,如& &(如上面其他海报所述)。因此,这将是这个样子:
#!/usr/bin/env ruby
require 'rubygems'
require 'net/ssh'
Net::SSH.start('host1', 'root', :password => "mypassword1") do |ssh|
stdout = ""
ssh.exec!("cd /var/example/engines/ && pwd") do |channel, stream, data|
stdout << data if stream == :stdout
end
puts stdout
ssh.loop
end
不幸的是,净:: SSH shell service的版本中删除2.
有曾经有一个Shell服务,允许有状态的命令,就像你试图做在网络/ ssh v1中,但它已在v2中删除。然而,net/ssh的作者有一个侧面项目可以让你做到这一点。看看这里:http://github.com/jamis/net-ssh-shell
当前位置我决定使用虽然叫随机shell脚本是一个文件到远程机器和源SCP的它进入外壳。基本上这样做: File.write(script_path, script_str) gear.ssh.scp_to(script_path, File.dirname(script_path)) gear.ssh.exec(". script_path")
你可以给不同的命令分隔一个新行。喜欢的东西:
@result = ssh.exec!("cd /var/example/engines/
pwd
")
puts @result
它可能更容易(更清晰)将命令传递给一个变量,然后传递变量为exec
。同样的原则。
这是Ruby的最佳答案net-ssh宝石。 – 2015-10-19 15:53:27
我有一个小的相关问题的SSH红宝石。请帮助我 - https://stackoverflow.com/questions/28799593/unix-commands-work-on-server-but-not-in-ruby-ssh-session – james 2015-03-01 22:00:22
太简单'Net :: SSH'不能执行随机脚本。它在我看来,它以某种方式吃新的线,并且bash不能正常工作......用';'拼接行不起作用,因为注释在它们后面渲染无效任何命令 – akostadinov 2015-03-19 15:18:41