1

有人告诉我这是不可能的,但我想在这里得到一些其他的意见。当涉及到这样的事情时,我有点新手。

我的网站:ExampleSiteA.com

要下载的文件:ExampleSiteB.com

基本上,我正在从 ExampleSiteB.com 下载一个 csv 文件来更新我的站点 ExampleSiteA.com。为此,我通过 CoreFTP 手动下载 csv 文件,然后手动将其上传到 ExampleSiteA.com。文件每天都在变化,我想跳过这一步,这样我就可以自动化这个过程。

请记住,我需要通过 SFTP 从 ExampleSiteB.com 下载 csv 文件...

如果一个服务器是 SFTP,我不确定是否可以直接将文件从一台服务器下载/上传到另一台服务器。文件大小也相当大,平均约为 25,000 KB / 25 MB。

我尚未探索的另一个选项是要求或包含来自另一台服务器的文件......这是一个选项还是可能性?该文件位于我的站点专用的文件夹中,SFTP 下载需要登录。

任何见解将不胜感激。提前致谢!

4

5 回答 5

7

去这里下载你需要的东西:http: //phpseclib.sourceforge.net/

更新

  • 对于 SFTP

然后在你的脚本中:

<?php
include('Net/SFTP.php');

$url = 'http://www.downloadsite.com';
$fileToDownload = "yourCSV.csv";
$cmd = "wget -q \"$url\" -O $fileToDownload";
exec($cmd);

$sftp = new Net_SFTP('www.uploadsite.com');
if (!$sftp->login('username', 'password')) {
    exit('Login Failed');
}

echo $sftp->pwd() . "\r\n";
$sftp->put('remote.file.csv', 'yourCSV.csv', NET_SFTP_LOCAL_FILE);
print_r($sftp->nlist());
?>

如果您需要连接到第二台服务器进行下载:

$sftp2 = new Net_SFTP('www.serverFromWhichToDownload.com');
if (!$sftp2->login('username', 'password')) {
    exit('Login Failed');
}

echo $sftp2->pwd() . "\r\n";
$sftp2->get('localFileName.csv', 'remoteFileName.csv');
print_r($sftp2->nlist());

阅读文档以获取更多帮助和示例: http: //phpseclib.sourceforge.net/documentation/net.html#net_sftp_get

要记录连接失败时的操作等,请使用以下命令:

include('Net/SSH2.php');
define('NET_SSH2_LOGGING', true);
$ssh = new Net_SSH2('www.domain.tld');
$ssh->login('username','password');
echo $ssh->getLog();
  • 对于FTP 上传- SO 已经发疯了,不想格式化我的代码,但无论如何都在这里:
$file = 'somefile.txt';
$remote_file = 'readme.txt';
$conn_id = ftp_connect($ftp_server);
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
if (ftp_put($conn_id, $remote_file, $file, FTP_ASCII)) {
    echo "成功上传$file\n";
} 别的 {
    echo "上传$file时出现问题\n";
}
ftp_close($conn_id);
于 2012-06-11T15:34:20.877 回答
2

是的,这可以使用 ssh2_sftp。

http://php.net/manual/en/function.ssh2-sftp.php

于 2012-06-11T13:37:24.303 回答
2

过去我在 cURL 上运气不错。如果您使用的是 Linux 机器,那么设置一个CRON 作业来为您执行此更新过程将是微不足道的。可以在此处找到 cURL 中 CLI HTTP 脚本的一个很好的参考,但是您可能需要 -T 标志(用于文件传输)来完成上传部分。说到上传,如果你可以从你想更新的服务器上运行脚本/进程/crontab,我建议你网络服务器下载,以避免一次旅行和第三方。或者,如果您需要按需更新,您可以编写一个使用内置PHP cURL 函数的 PHP 脚本。如果您采用 Linux+CLI 路线,您也可以使用sftp

更新:在使用 sftp ( curl -u uname:pword sftp://domain.tld) 测试 curl 时,我收到以下错误:curl: (1) Protocol sftp not supported or disabled in libcurl在 Kubuntu 12.04 上。所以 cURL 可能不是一个好主意。我还测试了 CLI sftp ( sftp uname@domain.tld:/dir/file.ext),但找不到发送身份验证的方法(没有使用 ssh 密钥)。因此,除非您确实在服务器之间设置了 ssh 密钥,否则这必然是一个手动过程。由于听起来您没有对 ExampleSiteB.com 的那种访问权限,因此这可能是不可接受的。

更新 2:由于我最初的答案没有什么用,我想我会扩展上述答案之一。我试图找到一个不涉及 PECL 扩展的解决方案,但我对ftp_ssh_connect()运气不佳。我建议您尝试一下,您可能会有更好的运气并且可以放弃 PECL 扩展路线。

叹了口气,进一步阅读,可以理解的是,它似乎ftp_ssh_connect与 sftp 协议不兼容。ssh2_connect()但是,我发现了一篇关于使用和的不错的博客文章ssh2_sftp()(如先前的答案中所述),并认为我会发布该文章来为您提供一些额外的帮助。它不像调用大多数 PHP 发行版的函数那么简单。 这是博客文章。其中一些步骤可能不是必需的,或者您可能需要执行我在此处 遇到的另一篇博客文章中列出的一些其他事情。

在我的系统上,我所要做的就是运行apt-get install libssh2-1-dev libssh2-php并且能够在我的php -m输出中找到 ssh2。

于 2012-06-11T13:49:41.293 回答
1

拥有一个包含,只要您在从中获取文件的网站上具有读/写权限就应该可以工作,但这只是猜测工作 atm,因为我没有任何检查它的方法。不过祝你好运!

于 2012-06-11T13:36:07.897 回答
1

是的,你应该能够做到这一点。

告诉您不能执行此操作的人可能会对 JavaScript 和跨站点脚本浏览器限制感到困惑,这些限制会阻止从一个域下载的 JavaScript 访问不同域中的内容。

话虽这么说,如果您使用的是 PHP,这对我来说意味着您正在谈论在 Web 服务器上运行的 PHP,您应该能够使用 PHP 或任何其他脚本或编程语言从 SiteB.com 下载文件,然后更新文件,然后最后将文件 FTP 到不同的 Web 服务器 (SiteA.com)。

于 2012-06-11T13:37:08.143 回答