【问题标题】:Is it possible to download a file from one server (sftp) and upload it to my server using php?是否可以从一台服务器 (sftp) 下载文件并使用 php 将其上传到我的服务器?
【发布时间】:2012-06-11 13:32:44
【问题描述】:

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

我的网站:ExampleSiteA.com

要下载的文件:ExampleSiteB.com

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

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

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

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

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

【问题讨论】:

标签: php sftp


【解决方案1】:

去这里下载你需要的东西: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();
  • 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 "成功上传$file\n"; } 别的 { echo "上传$file时出现问题\n"; } ftp_close($conn_id);

【讨论】:

  • 登录失败... ../../../Net/SFTP.php 第 376 行中的预期 SSH_FXP_VERSION
  • 1.尝试下载最新版本的 SSH2.php 和 SFTP.php,如果他们解决了问题,请告诉我。 2. 检查您的密码和登录名是否有效。
  • 此代码是从 sftp 下载并上传到普通 ftp 还是反之亦然?
  • 这两个代码都用于 sftp,而第一个代码是从公开可用的 HTTP 资源下载文件...我更新了第一篇文章并包含了记录连接时发生的情况的代码,等等……
  • 我不是从公开的 http 下载...原始文件位于 sftp 上...然后我需要将其上传到常规 ftp(我的服务器)。我是这方面的新手,如有任何困惑,请见谅。
【解决方案2】:

是的,这可以使用 ssh2_sftp。

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

【讨论】:

  • 然后使用file_put_contents 将流保存到目标服务器上的文件中。 php.net/manual/en/function.file-put-contents.php
  • 这看起来不错...迫不及待想试试。我将不得不让你知道它是如何工作的!谢谢你们!
  • :-( - 调用未定义的函数 ssh2_connect() 我做错了什么?
  • 删除 ;在 php.ini 中的 extension=php_ssh2.dll 之前并重新启动您的服务器。
【解决方案3】:

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

【讨论】:

  • 我希望我现在可以处理这个......我迫不及待地想要处理这个。每天手动执行此操作很痛苦。感谢您的帮助,我会及时通知您我的进度!
  • 感谢您的更新和信息。非常感谢您的帮助。
  • 再次感谢您的工作...我自己也尝试了很多东西,但还没有成功。
【解决方案4】:

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

【讨论】:

  • 包含不是一个选项,您是否尝试过包含 25MB 大的文件?
  • 好点。只是好奇如果其他人不起作用,这是否是一个很好的备份选择。谢谢!
【解决方案5】:

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

告诉你不能这样做的人可能会混淆 JavaScript 和跨站点脚本浏览器限制,这些限制会阻止从一个域下载的 JavaScript 访问不同域中的内容。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    相关资源
    最近更新 更多