在服务器之间复制文件(不使用SCP)

时间:2012-03-21 21:18:32

标签: linux drupal copy

在服务器之间复制文件(不使用SCP)。

有两台Linux服务器。一台服务器正在运行电子学习系统(服务器1)。第二台服务器是我们安装了Drupal的Web服务器(服务器2)。

现在我们必须将文件(复制)从服务器1传输到服务器2.我以为Drupal用户可以发起将文件从第一台服务器传输到第二台服务器的请求。 (但是如果在server2的目录中添加新文件时自动复制文件会更好(但对我来说这似乎是不可能的))。

第一个要求是它应该非常安全地发生,许多人将使用它,他们没有关于服务器2上发生的事情的业务。

第二个要求是用户不必登录Linux服务器来启动复制过程。

欢迎任何建议和/或示例!

亲切的问候

4 个答案:

答案 0 :(得分:2)

您可以使用rysnc同步目录,并每隔X分钟/小时或其他任何事情设置cronjob到rsync。

答案 1 :(得分:1)

scp使用下面的ssh连接。除非:

,否则很难打破ssh安全性
  • 您决定放弃私钥 - 即使在这种情况下,您也可以生成新的一对并撤销旧密钥

  • 或者您已将默认配置更改为令人讨厌的内容。但对大多数用例来说真的很安全。

正如其他用户所说,您可以创建一个cronjob来不时运行rsync,以复制您的文件。 rsync也可以在ssh上运行。此外,您还可以选择控制在第二台计算机上覆盖,更新,创建或删除的内容。

运行man rsync了解详情。示例部分将为您提供帮助。

答案 2 :(得分:0)

我认为对scp的反对意见是需要在没有密码短语的情况下保存私钥,因此副本可以自动运行。

这是安全成本。

如果您想要自动执行背景,您有两种选择:

  1. 将密码存储在进程可以读取的某个位置,并使用密码短语源代码来获取scp。这只会将问题推到一个水平。
  2. 存储未加密的私钥。应该可以使用适当的权限来保护它。如果您担心,请每隔几天重新生成一次。
  3. 第三种选择是使用第三个锁定系统,该系统不托管其他用户并进行远程scp-to-scp传输。这样,密码只存在于第三个系统上,可能更容易保护。

答案 3 :(得分:0)

这是一种没有SCP的方法。

IMO是一种更简单/更安全和及时的方法 - 假设您可以访问目标服务器并且可以在其各自的Web服务器下添加一些代码 - 就是在“客户端”上使用一些curl php代码(服务器2 - drupal)和“服务器”(服务器1 - 电子学习)上的一些PHP代码来接收文件并适当地存储它。

您应该查看有关通过POST上传文件的PHP文档: http://www.php.net/manual/en/features.file-upload.post-method.php

另请查看curl_setopt(),尤其是“示例#2上传文件”: http://www.php.net/manual/en/function.curl-setopt.php

因此,每当您选择的某个事件发生在drupal-server2上时,您运行将文件上传到php脚本的代码 - 如下所示:

  $remote_url = "http://elearning.server1.com/upload.php";

  $data = array('file' => '@'. $uploadfile);

  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $remote_url);
  curl_setopt($ch, CURLOPT_POST, true);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  curl_setopt($ch, CURLOPT_VERBOSE, true);
  $ce = curl_exec($ch);
  curl_close($ch);

上面的困难部分可能是捕获Drupal中的上传事件并访问上传文件信息。或者你可以打开并阅读文件 - 我不在这里讨论。

在elearning-server1上,您的接收代码,例如http://elearning.server1.com/upload.php应如下所示:

$uploaddir = '/var/www/elearning/drupal_file_uploads/';
$basename = basename($_FILES['file']['name']);
$uploadfile = $uploaddir . $basename;

if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) {
  echo "File is valid, and was successfully uploaded.\n";
} else {
  echo "Possible file upload attack!\n";
}

一旦文件传输完成,您可以将原始文件保留在drupal服务器上或将其删除(或者在删除之前执行完整性检查,例如md5哈希比较)。

您可以通过apache设置进一步保护elearning-server1上的代码(仅允许从drupal服务器的IP地址访问此脚本),使用HTTPS / SSL,并使用您选择的密码从一个脚本到另一个脚本。

我不确定这对您的IT部门是否足够安全 - 但它尊重您IT部门的要求 - 他们会看到您尊重他们的回应,您甚至可能获得一些善意并增加对回报的信任。

在任何人在php脚本中使用ssh / scp之前 - 你应该问自己是否有更简单的方法来做你需要做的事情?你用火箭筒杀死蚊子吗?

设置SSH / SCP访问权限,即使使用密钥身份验证仍会产生许多漏洞,上面的其他人已经提到过这些漏洞。此外,该连接现在有可能根据其在该目标服务器上的权限执行任何破坏。如果你不需要,为什么要承担风险?

Rsync cron作业是安全的,但它会在运行之前引入延迟 - 这可能是您可能接受的,也可能是不可接受的。