Ruby: 如何在 ssh 中执行 scp?

Ruby: how to do scp within ssh?

我正在尝试登录机器B,然后将文件从机器A复制到机器B。目标是直接将文件从A传输到B,我不想在中间使用第三台机器.但是我发现在Ruby中很难完成。这是起始代码。

#!/usr/bin/env ruby

require 'rubygems'
require 'net/ssh'

cmd = 'scp -v -o UserKnownHostsFile=/dev/null -o GlobalKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@machineA:~/some.tar.gz .'
Net::SSH.start("machineB", "user", :password => "pwd") do |session|
  session.exec!(cmd) do |channel, stream, data|
    channel.send_data "pwd"
  end
end

我的想法是,我首先通过 ssh 连接到机器 B,然后尝试从它 运行 scp。第一个挑战是我无法将密码提供给 scp(没有 ssh 抱怨的 tty)。

有没有办法从 Net::SSH 生成 Net::SCP 对象?

谢谢。

好了,回答你的问题: 显然是的,您可以将 ssh 会话作为参数传递。

scp = Net::SCP.new(session)

这就是 Net::SCP.start 所做的 https://github.com/net-ssh/net-scp/blob/master/lib/net/scp.rb#L202

如果您的脚本在 machineA 上运行,您不能这样做:

Net::SCP.upload!("machineB", "user",
  "~/some.tar.gz",
  "~/.",
  ssh: { password: "pwd" })