如何将文件scp到Unix主机,以便文件轮询服务在复制完成之前不会看到它?

时间:2012-07-30 15:56:58

标签: unix scp

我正在尝试使用scp将文件传输到远程Unix服务器。在该服务器上,有一个服务轮询目标目录以检测传入的文件以进行处理。我想确保在复制完成之前,轮询服务不会获取新文件。有没有办法做到这一点?

我的文件传输过程是嵌入在较大的Java程序中的简单scp命令。理想情况下, not 的解决方案涉及更改Jana是最好的(出于涉及变更控制流程的原因)。

2 个答案:

答案 0 :(得分:2)

  • 您可以将文件scp到另一个(/ tmp)目录并移动 传输完成后通过ssh文件。不同的目录需要与最终目标目录位于同一分区上,否则将出现复制操作,您将面临类似的问题。目标计算机上的另一项服务可以执行此移动操作。

  • 您可以将文件复制为隐藏文件(使用.作为文件名前缀)并复制,然后移动

  • 如果您可以修改轮询服务,则可以检查活动的scp进程并忽略与scp参数匹配的文件。

  • 您可以使用lsof +d $directory检查打开的文件,并在轮询服务器中忽略它们

答案 1 :(得分:2)

我建议使用rsync而不是scp复制文件。 rsync已将新文件复制到临时文件名,并且还具有许多其他有用的文件同步功能。

$ rsync -a source/path/ remotehost:/target/path/

当然,如果您愿意,也可以逐个文件进行复制。

如果rsync的临时文件名足以避免被您的轮询服务选中,那么您只需将scp命令替换为shell脚本,该脚本充当{{1}的包装器无需更改Java程序。

您需要知道Java程序用于调用rsync命令的确切格式,以确保您向scp提供的选项符合您的预期。

您还需要弄清楚Java程序如何调用rsync。如果它是通过完整路径名(即scp)这样做的话,那么这个解决方案可能会让你的系统上存在依赖于scp的其他风险(比如你,例如,期望scp的行为与通常的行为一样,而不是像包装)。更改像/usr/bin/scp这样的软件包安装二进制文件也可能会“破坏”软件包注册,因此很难安装未来的安全更新,因为二进制文件已更改为shell脚本。当然,对您所做的任何更改都可能存在安全隐患。

总而言之,我怀疑你最好改变你的Java程序,使其完全符合你的要求,即使是启动一个shell脚本来处理你希望能够改变的自动化方面。未修改Java的未来。

祝你好运!