PHP cURL SFTP Not Working



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

我想使用PHP和cURL,因为我知道我可以使用cURL ftp到另一个主机,我想使用相同的代码(所以我不想使用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。所以我很确定上面的代码连接到服务器ok。

我得到的错误信息是:

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

所以它清楚地使用密码完成身份验证。

有什么想法?

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

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

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

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

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

…因为FileZilla把我直接跳转到子文件夹,我错过了它

如果您尝试使用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);

最新更新