我尝试使用PHP&cURL和密钥文件身份验证将文件上传到备份服务器。我创建了一对公钥和私钥,并将公钥存储在备份服务器上。我将私钥上载到名为“ private_key.txt”的文件中的Web服务器。 当我将私钥文件加载到filezilla中进行身份验证时,登录可以正常工作,因此应该正确设置备份服务器。使用PHP cURL,我不断收到“身份验证失败”消息。
这是我的剧本:
$certpath = $_SERVER['DOCUMENT_ROOT'].'private_key.txt';
$curl = curl_init();
$fp = fopen('testfile_ORIG', 'r');
curl_setopt($curl, CURLOPT_URL,"sftp://server.com/is/htdocs/testfile_MOVED");
curl_setopt($curl, CURLOPT_USERNAME, 'user');
curl_setopt($curl, CURLOPT_SSLKEY, $certpath);
curl_setopt($curl, CURLOPT_SSLENGINE, 'ssh-rsa');
curl_setopt($curl, CURLOPT_UPLOAD, 1);
curl_setopt($curl, CURLOPT_INFILE, $fp);
curl_exec ($curl);
echo curl_error($curl);
curl_close ($curl);
有人看到我的失败吗? 我尝试了2天的不同设置,但无法正常工作。 谢谢所有提示
答案 0 :(得分:0)
您的代码永远不会检查curl_setopt调用是否失败,请解决此问题,并且该错误应清除。也许像
function ecurl_setopt ( /*resource*/$ch , int $option , /*mixed*/ $value ):bool{
$ret=curl_setopt($ch,$option,$value);
if($ret!==true){
//option should be obvious by stack trace
throw new RuntimeException ( 'curl_setopt() failed. curl_errno: ' . return_var_dump ( curl_errno ($ch) ).'. curl_error: '.curl_error($ch) );
}
return true;
}
您这里的实际问题是(可能)您假设$ _SERVER ['DOCUMENT_ROOT']以directory separator(在Mac / linux / bsd / etc系统中为/
,\
在Windows系统中),这是不正确的,不是这样,因此,假设您的www根目录是/srv/http/default/www
,而私钥文件是/srv/http/default/www/private_key.txt
,您的代码将尝试访问名为{{ 1}}位于文件夹wwwprivate_key.txt
中,而不是尝试访问文件夹/srv/http/default
中名为private_key.txt
的文件-解决方案:
/srv/http/default/www
(常数DIRECTORY_SEPARATOR是php's global constants中的1,在Windows系统上设置为$certpath = $_SERVER['DOCUMENT_ROOT'].DIRECTORY_SEPARATOR.'private_key.txt';
,其他任何地方都设置为\
。)