在libcurl中执行SFTP / FTP命令而不进行实际传输

时间:2012-11-22 09:40:34

标签: curl ftp libcurl sftp

是否可以在libcurl中执行SFTP命令而无需实际尝试文件传输。

我使用CURLOPT_QUOTE设置命令执行(实际上是文件删除),但是在执行操作(并且执行成功,文件被删除)后,curl正在尝试上传或下载文件(基于CURLOPT_UPLOAD),所以我得到了CURLE_REMOTE_FILE_NOT_FOUND错误错误代码。

到目前为止我尝试了 - 没有设置URL导致“格式错误的网址错误”,设置CURLOPT_CONNECT_ONLY导致报价也没有执行。有没有标准的方式?

curl_global_init(CURL_GLOBAL_DEFAULT);

char temp[2000];
_snprintf(STRPARAM(temp),"%s://%s:%d/%s","sftp",m_url,m_port,a_ftpPath);
curl_easy_setopt(m_curl, CURLOPT_URL,temp);
_snprintf(STRPARAM(temp),"%s:%s",m_name,m_pass);
curl_easy_setopt(m_curl, CURLOPT_USERPWD, temp);
curl_easy_setopt(m_curl, CURLOPT_SSH_AUTH_TYPES, CURLSSH_AUTH_PASSWORD);

curl_easy_setopt(m_curl, CURLOPT_UPLOAD, 0L);
curl_easy_setopt(m_curl, CURLOPT_READFUNCTION, NULL);
curl_easy_setopt(m_curl, CURLOPT_NOBODY, 1L);
curl_easy_setopt(m_curl, CURLOPT_HEADER, 1L);

struct curl_slist *headerlist=NULL;
_snprintf(STRPARAM(temp),"rm /%s",a_ftpPath);
headerlist = curl_slist_append(headerlist, temp);
curl_easy_setopt(m_curl, CURLOPT_QUOTE, headerlist); 

m_res = curl_easy_perform(m_curl);

curl_easy_setopt(m_curl, CURLOPT_QUOTE, NULL); 
curl_easy_setopt(m_curl, CURLOPT_HEADER, 0L);
curl_easy_setopt(m_curl, CURLOPT_NOBODY, 0L);
curl_slist_free_all (headerlist);

curl_global_cleanup();

2 个答案:

答案 0 :(得分:4)

CURLOPT_NOBODY是要求没有“身体”转移的关键。

答案 1 :(得分:1)

您可以尝试phpseclib, a pure PHP SFTP implementation

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

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

$sftp->delete('filename.remote'); // doesn't delete directories
// recursive delete
$sftp->delete('dirname.remote', true); // deletes a directory and all its contents
?>