【问题标题】:How can automate sftp from machine B to machine C with machine A?如何使用机器 A 自动化从机器 B 到机器 C 的 sftp?
【发布时间】:2012-04-07 18:38:33
【问题描述】:

我有一些文件需要从机器 B (linux) sftp 到机器 C。我们需要在机器 A (windows server 2003) 中启动任务并在 Windows 调度程序中安排它。我该怎么做?

我会像这样以交互方式进行:

  1. 将文件从机器 A ftp 到机器 B。
  2. telnet 到机器 B。
  3. 使用 telnet,sftp 从机器 B 到机器 C,将文件从机器 B 到机器 C。

如何使用 Windows 机器 A 中的脚本执行此操作?我无法安装任何其他软件来提供帮助。

【问题讨论】:

  • 您的文件在 A 上,想通过 ftp 传输到 B,然后从 B 传输到 C?
  • 是的。这是因为只有 B 可以连接 C 并且文件在 A 上。
  • 没有。除非没有其他选择。
  • '已经设法使机器 B 可用于 cron 作业。不需要传输文件。我可能没有时间验证你们所有人的每个答案。我将赏金给予最高投票的答案。

标签: windows automation telnet


【解决方案1】:

您提到了 ftp、telnet 和 sftp。这些可以通过类似expect的脚本编写,或者通过A上的一些可能复杂的脚本编写。但是,您可以使用这个unix技巧从A完成所有操作。您需要能够从A ssh到B,从 B 到 C。您需要进行身份验证设置,因此这些连接不需要密码。 (您可以对两个连接都使用 A 上的身份代理转发。)然后在 A 上运行类似这样的操作:

cat file-on-a | ssh B "ssh C 'cat > file-on-c'"

这将通过 B 将文件从 A 移动到 C,而不会将文件存储在 B 上。

在使用属于 Cygwin 的 ssh 和 cat 之前,我已经在 windows 上做过这种事情。我不知道它与其他 Windows 工具的工作情况如何......

编辑:我应该对两个人说一下该命令的工作原理。 ssh 程序提供了一个管道 来在本地和远程机器之间来回移动数据。通常,这个 pipe 连接到远程端的 shell,它的用途与 telnet 相同,但安全性更高。然而,这个 pipe 可以用于任何事情。 sftp 实用程序使用该管道来移动文件。 ssh 命令可以带一个命令在远程系统上执行。例如,ssh B ls 将连接到 B,运行 ls,然后将结果发回给您。上面的命令所做的是 ssh 到 B,并要求 B 运行一个连接到 C 的 ssh。这给了我们一个从 A 到 B 到 C 的 管道。现在,在两端做什么? cat 程序读取文件并将它们写入标准输出。如果没有给出文件名,它将读取标准输入。cat file-on-a 读取A 机器上的文件并将其写入ssh 命令。 cat > file-on-c 读取发送给它的数据,> file-on-c 部分(感谢 shell)将其写入文件 file-on-c

同样,不确定这是否是您环境中的一个选项。希望对您有所帮助。

【讨论】:

    【解决方案2】:

    正确的方法是使用“scp”,它通常与 ssh 和 sftp 位于同一个包中,并且与“cp”一样工作,只是其中一个或两个路径都可以是远程的:

    scp user@machineA:/path/to/file user@machineB:/path/to/file
    

    您需要一个在启动机器上包含 scp 的 ssh 客户端,但您可能已经拥有它。

    【讨论】:

    • 这是一个很好的提醒,两个文件都可以是远程的,但问题是 A 必须启动传输,并且 A 没有直接访问 C(只有 B 可以访问 C)。不过,关于 scp 的好提醒。
    • 较新版本的scp 有一个-3 选项:openbsd.org/cgi-bin/man.cgi?query=scp&sektion=1
    【解决方案3】:

    您可能想在为时已晚之前查看RabbitMQ 之类的内容。使用消息队列和远程脚本将有助于确保正确完成此类任务。

    我知道这不是您要寻找的答案,因为它需要的不仅仅是一个简单的脚本,而且随着时间的推移,使用消息传递可以大大减少跨平台管理。

    如果您确实需要执行所描述的操作,则可以使用Rob's answer,但使用空白键是违反最佳安全实践的。另一种方法是在 B 上建立一个简单的放置目录,B 上的脚本会监控该目录,该目录会同步到 C(通过 ftp/sftp/rsync 甚至远程挂载)——同样需要 B 上的脚本。

    【讨论】:

      【解决方案4】:

      由于您似乎在两台 Linux 机器之间使用 Windows 中介,因此最惯用的建议是让您探索​​ SSHFS 以获得 Windows systems

      如果在 Windows 环境中需要维护机器 A 和 C 之间的管道,您的理想情况是能够连接到拾取点(在 A 上)和放置点(在 C 上),并且只需写一些 @ 987654323@自动发送文件。请注意,这对故障没有弹性(您需要建立某种重新连接协议),但它具有额外的好处,即当出现问题或传递此系统时,能够在您的 GUI 中执行此操作给别人。

      否则,如果这是一个可以从 shell 运行的快速作业,Rob is correct。它可以通过简单的管道装订来简洁而正确地完成。

      【讨论】:

        【解决方案5】:

        如果您说只有 B 可以连接到 C,并且您想从 A 获取文件到 C,我建议使用从 B 到 C 的 SSH 隧道。 这样您就可以通过 B 获得从 A 到 C 的访问权限。

        从盒子 B 建立 ssh 隧道到盒子 C:

        ssh box-c.com -gL 3025:localhost:22
        

        然后从盒子 A 连接到盒子 C sftp 通过连接到:

        box-b.com:3025

        要自动创建隧道并使其在发生任何情况下都保持活跃,我建议使用 autossh - http://www.harding.motd.ca/autossh/(大多数 Linux 发行版都附带)。

        如果您想阻止其他人访问 box-b.com:3025,请使用 box B 防火墙以仅允许从 box A 连接到该端口。

        我有时会遇到类似的情况,这是我找到的最简单的解决方案。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-02-11
          • 1970-01-01
          • 2019-01-07
          • 2019-01-25
          • 1970-01-01
          • 1970-01-01
          • 2010-09-22
          相关资源
          最近更新 更多