【问题标题】:PHP cURL SFTP Not WorkingPHP cURL SFTP 不工作
【发布时间】:2014-07-01 09:45:36
【问题描述】:

我正在尝试将文本文件上传到亚马逊 FTP 站点(用于亚马逊产品广告)。

我想使用 PHP 和 cURL,因为我知道我可以使用 cURL 对我们使用的另一台主机进行 FTP-ing,并且我想使用相同的代码(所以我不想使用 phpseclib)。我很确定 cURL 应该能够做到这一点。

我有来自亚马逊的连接详细信息(用户名、密码和主机地址),我知道这些信息 100% 有效,因为我使用 FileZilla 进行连接并且一切正常,而且我在我的 cURL 中使用相同的连接详细信息代码。

这是我的代码:

$ftp_username = 'xxxx';
$ftp_password = 'xxxx';
$ftp_url = 'dar-eu.amazon-digital-ftp.com';
$localfile = 'feeds/amazon-gifts.txt';
$remotefile = 'amazon-gifts.txt';

$ch = curl_init();
$fp = fopen($localfile,'r');

curl_setopt($ch, CURLOPT_URL, 'sftp://'.$ftp_username.':'.$ftp_password.'@'.$ftp_url.'/'.$remotefile);
curl_setopt($ch, CURLOPT_UPLOAD, true);
curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_SFTP);
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localfile));
curl_exec ($ch);

if (curl_errno($ch) == 0) {
    echo 'File uploaded succesfully.';
} else {
    echo 'File upload error. '.curl_errno($ch).' - '.curl_error($ch);
}

curl_close($ch);

我没有在这里指定端口号,因为我也没有使用 FileZilla。但是我已经尝试了 22 和 21, 22 工作,我得到下面的错误,并且 21 说could not connect。所以我很确定上面的代码可以连接到服务器。

我得到的错误信息是:

9 - Upload failed: Permission denied (3/-31)

就像我说的,我在 FileZilla 和 cURL 中使用相同的连接细节,而且 FileZilla 正常工作,没有错误,没有权限被拒绝消息。

我已经联系了亚马逊支持,他们说因为使用 FileZilla 连接没有问题,所以问题一定是我的代码。

谁能帮忙..?我是否错过了我应该设置的选项..?

更新

来自日志:

* About to connect() to dar-eu.amazon-digital-ftp.com port 22 (#0)
*   Trying 46.137.126.98... * connected
* Connected to dar-eu.amazon-digital-ftp.com (46.137.126.98) port 22 (#0)
* SSH authentication methods available: publickey,password
* Using ssh public key file id_dsa.pub
* Using ssh private key file id_dsa
* SSH public key authentication failed: Unable to open public key file
* Initialized password authentication
* Authentication complete
* Upload failed: Permission denied (3/-31)
* Connection #0 to host dar-eu.amazon-digital-ftp.com left intact
* Closing connection #0

所以它显然使用密码完成了身份验证。

有什么想法吗?

【问题讨论】:

  • 不知道是否有帮助,但是您尝试过这里提供的验证码吗?stackoverflow.com/questions/9906555/…
  • 抱歉,我在该页面或它链接到的页面上看不到任何有关授权码的信息...您发布了正确的链接吗..?
  • 我的意思是将 CURLOPT_USERPWD 与 CURLOPT_URL 分开
  • 哦,我明白了...我已经尝试过了,没有任何区别...正如您从上面的日志更新中看到的密码验证正在工作。
  • 服务器上的目标文件夹怎么样?您应该使用 chmod 检查该目录是否为只读。您可以上传到与 FileZilla 相同的(根)文件夹吗?

标签: php curl ftp


【解决方案1】:

解决方案是在连接到第三方 FTP 站点时检查您的子文件夹。

使用 FileZilla,即使我没有指定要转到的默认目录(所以我假设是根目录),它会自动将我带到一个子文件夹:/ebs_data/[my username]/

使用 cURL 时,我试图上传到 / (root),但我没有权限。

FileZilla = /ebs_data/[my username]/(我确实有权限)

cURL = /(root - 我没有权限)

...因为FileZilla直接把我跳到了子文件夹,我错过了。

【讨论】:

    【解决方案2】:

    如果您尝试使用 phpseclib,一个纯 PHP SFTP 实现会怎样?例如。

    <?php
    include('Net/SFTP.php');
    
    $sftp = new Net_SFTP('dar-eu.amazon-digital-ftp.com');
    if (!$sftp->login('xxxx', 'xxxx')) {
        exit('bad login');
    }
    
    $sftp->put('amazon-gifts.txt', 'feeds/amazon-gifts.txt', NET_SFTP_LOCAL_FILE);
    

    【讨论】:

    • 没关系 - 我没有看到你的回复。根据我的经验,phpseclib 默认为登录用户的主目录 - 而不是 / 目录。很快
    • 感谢 stopock - 我在问题中确实说过我想避免使用 phpseclib...
    • 哦-抱歉-我也没看到:(
    猜你喜欢
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 2018-08-08
    相关资源
    最近更新 更多