Ruby 如何通过SSH连接到一台服务器,然后从那里将SFTP连接到另一台服务器?
情况如下: 我有对服务器A的SSH访问权限 我可以通过SFTP访问ServerB,但只能从ServerA访问 我想使用Ruby将SSH连接到ServerA,然后将SFTP文件从ServerB连接到ServerA 我可以使用Net::SSH中的文档连接到ServerA:Ruby 如何通过SSH连接到一台服务器,然后从那里将SFTP连接到另一台服务器?,ruby,net-ssh,net-sftp,Ruby,Net Ssh,Net Sftp,情况如下: 我有对服务器A的SSH访问权限 我可以通过SFTP访问ServerB,但只能从ServerA访问 我想使用Ruby将SSH连接到ServerA,然后将SFTP文件从ServerB连接到ServerA 我可以使用Net::SSH中的文档连接到ServerA: require 'net/ssh/gateway' gateway = Net::SSH::Gateway.new('server_a', 'user') gateway.ssh("server_a", "user") do
require 'net/ssh/gateway'
gateway = Net::SSH::Gateway.new('server_a', 'user')
gateway.ssh("server_a", "user") do |ssh|
# how to SFTP into server_b here and run SFTP commands?
end
gateway.shutdown!
我搞不懂的是如何从ServerA的上下文中SFTP到ServerB?从命令行,您可以指定在SSH到服务器后在服务器上执行的命令 第一个谷歌结果: 因此,您可以想象将ssh命令放在Ruby代码的backticks中,然后执行SFTP命令
#!/usr/bin/env ruby
`ssh myserver 'sftp another-server'`
要查看的内容假设您已设置私钥,请运行:
$ ssh-add
写下这样的话:
require 'net/ssh'
# Set :forward_agent => true so that it will automatically authenticate with server_b
Net::SSH.start('server_a', 'user', :forward_agent => true) do |ssh|
puts ssh.exec!("scp -r server_b:dir_i_want_to_copy dir_to_copy_to/")
end
您可以在Net::SSH::Gateway类中声明scp方法 我复制了类似的ssh方法,效果很好
class Gateway < Net::SSH::Gateway
def scp(host, user, options={}, &block)
local_port = open(host, options[:port] || 22)
begin
Net::SCP.start("127.0.0.1", user, options.merge(:port => local_port), &block)
ensure
close(local_port) if block || $!
end
end
end
类网关local_port),&block)
确保
如果块| |$,则关闭(本地_端口)!
结束
结束
结束
将网关库直接扩展到net/sftp对我来说效果很好:
class Net::SSH::Gateway
def sftp(host, user, options={}, &block)
local_port = open(host, options[:port] || 22)
begin
Net::SFTP.start("127.0.0.1", user, options.merge(:port => local_port), &block)
ensure
close(local_port) if block || $!
end
end
end
我认为你不能只用在本地机器上运行的代码来实现这一点——我认为你需要用在A上运行的代码启动A->B连接。不确定scp是否能工作,因为我只有对服务器的FTP访问权