如何使用机器A将机器B的sftp自动化到机器C?

我有一些文件需要从机器B(linux)sftp到机器C.我们需要在机器A(Windows Server 2003)中启动任务,并在Windows调度程序中进行调度。 我该怎么做?

我会这样做交互式的:

  1. ftp从机器A到机器B.
  2. telnet到机器B.
  3. 用telnet,从机器B到机器C,从机器B到机器C.

我怎样才能做到这一点与机器A的脚本是一个窗口? 我无法安装任何其他软件来帮助。

你提到了ftp,telnet和sftp。 这些可以通过类似的期望,或通过一些可能复杂的脚本A上脚本化。但是,你也许能够使用这个unix技巧做到这一切从A.你需要能够从A到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上做过这样的事情。 我不知道它会如何与其他窗口工具一起工作…

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

再次,不知道这是否是您的环境中的一个选项。 希望能帮助到你。

正确的做法是使用'scp',它通常与ssh和sftp在同一个软件包中,除了一个或两个路径可以是远程的以外,它和'cp'一样工作。

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

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

你可能想要在RabbitMQ之类的东西看得太迟。 使用消息队列和远程脚本将有助于确保像这些任务正确完成。

我知道这不是你正在寻找的答案,因为它不仅仅需要一个简单的脚本,而是使用消息传递可以大大减少跨平台管理。

如果你真的需要按照描述执行一个动作,那么你可以使用Rob的答案 ,但是使用空白键是违背最佳安全实践的。 另一种方法是B上的一个简单的drop目录,B上的一个脚本监视同步到C(通过ftp / sftp / rsync甚至是远程挂载) – 再次需要脚本B.

由于您似乎在两台Linux机器之间使用Windows中介,因此最常用的建议是您可以探索用于Windows系统的 SSHFS 。

你的理想情况是,如果在Windows环境中维护A和C机器之间的流水线是理想的,那么可以同时连接到拾取点(在A上)和下降点(在C上),只需要写一些批处理自动发送文件自动。 这对于失败是不适应的,请注意(你需要建立某种重新连接协议),但是当出现问题或者当你通过这个系统的时候,它还能够在你的GUI中做到这一点给别人。

否则,如果这是一个可以容忍地从shell运行的快速工作, Rob是正确的 。 这可以通过简单的管道装订简单而正确地完成。

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

从方框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,请使用方框B防火墙,以允许仅从方框A连接到该端口。

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