如何在sftp服务器上用curl上传文件

xzlaal3s  于 2022-11-13  发布在  其他
关注(0)|答案(4)|浏览(181)

此代码

$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(无法将文件写入磁盘)
我的要求很简单,我只需要使用curl在live服务器上上传text.txt文件。

lndjwyie

lndjwyie1#

因此,对于诊断SSH / SFTP问题,我认为phpseclib, a pure PHP SFTP implementation是最好的方法。

<?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的有用之处在于它能够创建日志文件,这样您就可以看到正在发生的事情。
我认为它也更容易使用,哈哈,但这取决于你。

yh2wf1be

yh2wf1be2#

这个问题的答案今天帮助了我。
我只想指出,'sftp://$user:$pass@myserver.com/upload/$filename'中的变量永远不会被解释,因为你使用的是单引号。你应该使用双引号,或者将变量连接到单引号字符串中。

evrscar2

evrscar23#

也许这个link能帮到你,
有一些使用CURL上传文件的不同方法的示例。
或者试试这个

$localfile = 'sample.txt';
$user      = 'user';
$password  = 'pass';
$host      = 'ftp.remote.com';

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

curl_setopt($ch, CURLOPT_URL, "sftp://{$user}:{$password}@{$host}/{$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.';
}
fslejnso

fslejnso4#

我还遇到了一个问题,就是我使用的脚本不起作用。所以我设置了CURLOPT_VERBOSE,并在输出中添加了curl_error结果。这样,我意识到,在我的例子中curl没有启用ssh支持,这可以通过重新出现来解决。(=在其他系统上重新构建,我在gentoo上)。另外,代码中的单引号会妨碍正确的变量替换。解决这些问题后,和主机,我对您函数的结果现在看起来像这样:

  • 正在尝试...
  • TCP_节点延迟设置
  • 已连接到()端口22(#0)
  • SSH MD5指纹:128 d,2000年12月18日,纽约
  • 可用的SSH身份验证方法:公钥,键盘交互式
  • 使用SSH私钥文件'/root/.ssh/id_rsa'
  • SSH公共密钥验证失败:用户名/公钥组合无效
  • 无法连接到代理
  • 已初始化键盘交互式身份验证
  • 验证完成
  • 我们已经完全上传了
  • 到主机的连接#0保持不变
  • 正在关闭连接0

已成功上载文件。0

相关问题