我有一些文件需要从机器B(linux)到机器C的sftp。我们需要在机器A(Windows Server 2003)中启动任务并在Windows Scheduler中安排它。我该怎么办?
我会这样交互式地做:
如何使用机器A中的脚本来执行此操作?我无法安装任何其他软件来帮助。
答案 0 :(得分:3)
你提到过ftp,telnet和sftp。这些可以通过诸如期望之类的东西编写脚本,或者通过A上的一些可能复杂的脚本编写脚本。但是,您可以使用此unix技巧从A完成所有操作。您需要能够从A到B进行ssh,从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程序提供了一种管道,用于在本地和远程计算机之间来回移动数据。通常,此管道连接到远程端的shell,它与telnet具有相同的用途,但具有更好的安全性。但是,此管道可用于任何事情。 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
。
同样,不确定这是否是您环境中的一个选项。希望它有所帮助。
答案 1 :(得分:2)
执行此操作的正确方法是使用'scp',它通常与ssh和sftp位于同一个包中,其工作方式与'cp'类似,只是其中一个或两个路径都可以是远程的:
scp user@machineA:/path/to/file user@machineB:/path/to/file
你需要一个ssh客户端,它在启动机器上包含scp,但你可能已经拥有了它。
答案 2 :(得分:1)
您可能希望在为时已晚之前查看RabbitMQ之类的内容。使用消息队列和远程脚本将有助于确保正确完成这些任务。
我知道这不是您正在寻找的答案,因为它需要的不仅仅是一个简单的脚本,但使用消息传递可以大大减少跨平台管理。
如果您确实需要按照描述执行操作,则可以使用Rob's answer,但使用空白键是违反最佳安全措施的。另一种选择是B上的简单放置目录,B监视器上的脚本,同步到C(通过ftp / sftp / rsync甚至远程挂载) - 再次需要B上的脚本。
答案 3 :(得分:1)
由于您似乎在两台Linux计算机之间使用Windows中介,因此最常用的建议是探索SSHFS Windows systems。
理想情况是,如果在Windows环境中维护机器A和C之间的管道,则能够连接到拾取点(在A上)和放置点(在C上)并且只写一些{ {3}}自动发送文件。对于失败,这不具备弹性,请注意(您需要建立某种重新连接协议),但它还有一个额外的好处,即当出现问题或者您通过此系统时能够在GUI中执行此操作给别人。
否则,如果这是一个可以从shell运行的快速工作Batch automation。它可以通过简单的管道装订,简洁而正确地完成。
答案 4 :(得分:1)
如果你说只有B可以连接到C并且你想要从A到C获取文件,我建议使用从B到C的SSH隧道。 这样,您就可以通过B获得从A到C的访问权限。
从方框B开始使用ssh隧道到方框C:
ssh box-c.com -gL 3025:localhost:22
然后从方框A通过连接到:
连接到方框C sftpbox-b.com:3025
无论发生什么事情,为了自动化隧道并使其保持活动,我建议使用autossh - http://www.harding.motd.ca/autossh/(大多数Linux发行版附带)。
如果您想阻止他人访问box-b.com:3025,请使用方框B防火墙仅允许从方框A连接到该端口。
我有时遇到类似的情况,这是我找到的最简单的解决方案。