情况如下:
我有对ServerA的SSH访问
我有对ServerB的SFTP访问权限,但仅限于ServerA
我想使用Ruby连接到ServerA,然后使用从ServerB到ServerA的SFTP文件。
我可以使用Net :: SSH中的文档连接到ServerA:
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?
答案 0 :(得分:1)
假设您设置了私钥,请运行:
$ 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
答案 1 :(得分:1)
您可以在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
答案 2 :(得分:1)
将网关库直接扩展到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
答案 3 :(得分:0)
从命令行,您可以指定在SSH进入服务器后在服务器上执行的命令
首先是谷歌搜索结果:http://bashcurescancer.com/run_remote_commands_with_ssh.html
所以你可以想象将ssh命令放在Ruby代码中的反引号中,然后执行SFTP命令
#!/usr/bin/env ruby
`ssh myserver 'sftp another-server'`
要研究的东西