1

这段代码

$user = 'user';
$pass = 'password';
$filename = 'text.txt';
error_reporting(E_ALL);
ini_set('display_errors', 1);
$ch = curl_init();
$localfile = 'text.txt';
$fp = fopen($localfile, 'r');
curl_setopt($ch, CURLOPT_URL, 'sftp://$user:$pass@myserver.com/upload/$filename');
curl_setopt($ch, CURLOPT_UPLOAD, 1);
curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_SFTP);
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localfile));
curl_exec ($ch);
$error_no = curl_errno($ch);
curl_close ($ch);
if ($error_no == 0) {
        $error = 'File uploaded succesfully.';
} else {
        $error = 'File upload error.';
}
echo $error.' '.$error_no;

给我这个错误:

文件上传错误。7(无法将文件写入磁盘)

我的要求很简单,我只需要text.txt使用 curl 在实时服务器上上传文件。

4

4 回答 4

2

因此,对于诊断 SSH / SFTP 问题,我认为phpseclib,一个纯 PHP SFTP 实现,是最好的方法。就是这样:

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

define('NET_SFTP_LOGGING', NET_SFTP_LOG_COMPLEX);

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

$sftp->put('text.txt', 'text.txt', NET_SFTP_LOCAL_FILE);

echo $sftp->getSFTPLog();
?>

特别是,phpseclib 的有用之处在于它能够创建日志文件,以便您查看正在发生的事情。

我认为它也更容易使用,哈哈,但这取决于你。

于 2013-08-13T14:30:24.230 回答
1

Answers to this question helped me today.

I just want to point out that your vars in 'sftp://$user:$pass@myserver.com/upload/$filename' will never get interpreted since you're using single quotes. You should either use double quotes or concatenate your vars to single quoted strings.

于 2015-03-12T16:36:59.837 回答
1

也许这个链接可以帮助你,

有一些使用 CURL 上传文件的不同方法的示例。

或试试这个

$ch = curl_init();

$localfile = ‘sample.txt’;

$fp = fopen($localfile, ‘r’);

curl_setopt($ch, CURLOPT_URL, ‘sftp://user:pass@ftp.remote.com/’.$localfile);

curl_setopt($ch, CURLOPT_UPLOAD, 1);

curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_SFTP);

curl_setopt($ch, CURLOPT_INFILE, $fp);

curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localfile));

curl_exec ($ch);

$error_no = curl_errno($ch);

curl_close ($ch);

if ($error_no == 0) {

$error = ‘File uploaded succesfully.’;

} else {

$error = ‘File upload error.’;

}
于 2013-08-12T06:56:27.953 回答
0

我还有一个问题,即我用作起点的脚本不起作用。所以我只是设置了 CURLOPT_VERBOSE 并将 curl_error 结果添加到输出中。这样,我意识到 curl 在我的情况下没有启用 ssh 支持,我可以通过重新出现(=在其他系统上重新构建,我在 gentoo 上)支持 ssh 来解决。此外,代码中的单引号会阻止正确的变量替换。在解决了这些问题和一些拼写错误之后,我使用我的测试凭证和主机的函数结果现在看起来像这样:

  • 试 ...
  • TCP_NODELAY 设置
  • 连接到 () 端口 22 (#0)
  • SSH MD5指纹:4dbea14faf74ee128d5874017332f4ef
  • 可用的 SSH 身份验证方法:publickey、keyboard-interactive
  • 使用 SSH 私钥文件 '/root/.ssh/id_rsa'
  • SSH 公钥认证失败:用户名/公钥组合无效
  • 连接代理失败
  • 初始化键盘交互认证
  • 认证完成
  • 我们已经完全上传并且很好
  • 与主机的连接 #0 保持不变
  • 关闭连接 0

文件上传成功。0

于 2019-05-08T12:18:16.437 回答