是否可以从一个服务器(sftp)下载文件并使用php将其上传到我的服务器?

时间:2012-06-11 13:32:45

标签: php sftp

我被告知这不能做,但我想在这里得到一些其他的意见。在涉及到这样的事情时,我有点像新手。

我的网站:ExampleSiteA.com

要下载的文件:ExampleSiteB.com

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

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

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

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

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

5 个答案:

答案 0 :(得分:6)

点击此处下载您需要的内容:http://phpseclib.sourceforge.net/

<强> 更新

  • FOR 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();
  • FOR 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 "successfully uploaded $file\n";
} else {
    echo "There was a problem while uploading $file\n";
}
ftp_close($conn_id);

答案 1 :(得分:2)

是的,可以使用ssh2_sftp。

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

答案 2 :(得分:2)

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

更新:在使用sftp(curl -u uname:pword sftp://domain.tld)测试curl时,我在Kubuntu 12.04上收到以下错误:curl: (1) Protocol sftp not supported or disabled in libcurl。所以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发行版调用函数那么简单。 Here is the blog post.其中一些步骤可能没有必要,或者您可能需要在我遇到的另一篇博文here中列出一些其他内容。

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

答案 3 :(得分:1)

拥有一个包含,只要你在网站上拥有读取/写入权限就可以使用该文件,但是这只是猜测工作atm,因为我没有办法检查它。祝你好运!

答案 4 :(得分:1)

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

无论谁告诉您不能这样做,可能会对JavaScript和跨站点脚本浏览器限制感到困惑,这些限制会阻止从一个域下载的JavaScript访问不同域中的内容。

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