2013-05-02 45 views
0

我已经通过SFTP文件从服务器上传到另一个上传与SFTP:CURLOPT_SSLKEY不使用

这里是我的SFTP()函数:

function transfert_curl_sftp($local_filename, $distant_filename, $host_destination, $user_destination,$pubkey_filename,$privkey_filename,$port) { 
if (!extension_loaded('curl')) return 'no_curl_extension'; 
$distant_filename = ltrim($distant_filename,'/'); 

$fp = fopen($local_filenam, 'r'); 
$sftp_server = $host_destination.'/'.$distant_filename; 
$curl = curl_init(); 
curl_setopt($curl, CURLOPT_UPLOAD, TRUE); 
curl_setopt($curl, CURLOPT_HEADER, TRUE); 
curl_setopt($curl, CURLOPT_VERBOSE, TRUE); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); 
curl_setopt($curl, CURLOPT_PROTOCOLS, CURLPROTO_SFTP); 
curl_setopt($curl, CURLOPT_NOPROGRESS, FALSE); 
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE); 

$trace = tempnam(dirname($local_filenam),'temp_curl_'); 
$fptrace = fopen($trace, 'w'); 
curl_setopt($curl, CURLOPT_FILE, $fptrace); 
curl_setopt($curl, CURLOPT_STDERR, $fptrace); 

curl_setopt($curl, CURLOPT_URL, 'sftp://@'.$sftp_server); 
curl_setopt($curl, CURLOPT_PORT, $port); 
curl_setopt($curl, CURLOPT_USERPWD, $user_destination.':'); 
curl_setopt($curl, CURLOPT_SSH_PUBLIC_KEYFILE, $pubkey_filename); 
curl_setopt($curl, CURLOPT_SSLENGINE, ''); 
curl_setopt($curl, CURLOPT_SSLKEY, $privkey_filename); 
curl_setopt($curl, CURLOPT_SSLKEYPASSWD, ''); 

curl_setopt($curl, CURLOPT_INFILESIZE, filesize($local_file)); 
curl_setopt($curl, CURLOPT_INFILE, $fp); 

$info = curl_getinfo($curl); 
$start_error_no = curl_errno($curl); 
$valid_operation = curl_exec($curl); 
$final_error_no = curl_errno($curl); 
curl_close($curl); 
fclose($fp); 
fclose($fptrace); 

echo '<pre>trace:',file_get_contents($trace),'<hr>'; var_dump($start_error_no,$valid_operation,$final_error_no); 

return true; 
} 

文件从未上传:-(

当我看到跟踪文件时,我看到 * SSH认证方法可用:publickey,password *使用ssh公钥文件/var/www/xxx/yyy/upload/dsa-zzz.pub *使用ssh私钥文件id_dsa * SSH公钥认证失败:回调返回错误* ,所以我认为这是CURLOPT_SSLKEY“参数没有真正建立...... 我所有的密钥文件都ok阅读...

是一个PHP错误?或者我写错了什么?

回答

1

SFTP协议使用SSH2来保护连接,因此您需要提供SSH私钥,而不是SSL。 SSH和SSL是确保连接安全的两种不同方式(more details about their difference)。

所以,你应该更换:

curl_setopt($curl, CURLOPT_SSLENGINE, ''); 
curl_setopt($curl, CURLOPT_SSLKEY, $privkey_filename); 
curl_setopt($curl, CURLOPT_SSLKEYPASSWD, ''); 

通过:

curl_setopt($curl, CURLOPT_SSH_AUTH_TYPES, CURLSSH_AUTH_PUBLICKEY); 
curl_setopt($curl, CURLOPT_SSH_PUBLIC_KEYFILE, $pubkey_filename); // you already did it 
curl_setopt($curl, CURLOPT_SSH_PRIVATE_KEYFILE, $privkey_filename); 
curl_setopt($curl, CURLOPT_KEYPASSWD, ''); 
+0

干得好!它解决了我的问题!非常感谢 ! – sly63 2013-05-02 18:04:06