4

この Stack Overflow question threadのアドバイスに従いましたが、問題が発生し続けています。

次のエラー メッセージが表示されます: サポートされていないプロトコル: sftp

これが私のコードです:

$ch = curl_init();
if(!$ch)
{
    $error = curl_error($ch);
    die("cURL session could not be initiated.  ERROR: $error."");
}


$fp = fopen($docname, 'r');
if(!$fp)
{
    $error = curl_error($ch);
    die("$docname could not be read.");
}

curl_setopt($ch, CURLOPT_URL, "sftp://$user_name:$user_pass@$server:22/$docname");
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($docname));

//this is where I get the failure
$exec = curl_exec ($ch);
if(!$exec)
{
    $error = curl_error($ch);
    die("File $docname could not be uploaded.  ERROR: $error.");
}

curl_close ($ch);

curl_version() 関数を使用して curl 情報を確認したところ、サポートされているプロトコルの配列に sftp が含まれていないようであることがわかりました。

[version_number] => 462597
    [age] => 2
    [features] => 1597
    [ssl_version_number] => 0
    [version] => 7.15.5
    [host] => x86_64-redhat-linux-gnu
    [ssl_version] =>  OpenSSL/0.9.8b
    [libz_version] => 1.2.3
    [protocols] => Array
        (
            [0] => tftp
            [1] => ftp
            [2] => telnet
            [3] => dict
            [4] => ldap
            [5] => http
            [6] => file
            [7] => https
            [8] => ftps
        )

これは、使用している cURL のバージョンが古くなっているためでしょうか、それとも SFTP プロトコルがまったくサポートされていないだけなのでしょうか?

どんなアドバイスでも大歓迎です。

4

2 に答える 2

3

たぶん、純粋な PHP SFTP 実装である phpseclibを使用してみてください。例えば。

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

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

// puts a three-byte file named filename.remote on the SFTP server
$sftp->put('filename.remote', 'xxx');
?>
于 2012-06-27T03:11:31.013 に答える
1

この記事の執筆時点では、php にアクセスできる場合は、curl の sftp 実装に依存して使用する必要はなくなりました。php.net にアクセスして、ssh2 サポートを調べてください。そこには、プログラムで sftp を展開する方法が記載されています。

別の方法として、まだ php で、phpseclib.sourceforge.net にある Net_SFTP クラス/パッケージを使用する方法があります。

ドキュメントは http://phpseclib.sourceforge.net/documentation/net.html#net_sftpにあります。

予想?

php にアクセスできない、または php を使用したくない場合でも、expect を使用して curl の sftp 実装について心配する必要はありません。システムにまだ期待していない場合は、www.nist.gov/el/msid/expect.cfm にアクセスして入手してください。入手してインストールすると、sftp のスクリプトは次のようになります。

#!/usr/bin/expect
spawn /usr/bin/sftp <user@hostname>
expect "password:"
send "<mypassword>\r"
expect "sftp> "
send "get <remotefile> \r"
expect "sftp> "
send "bye \r"
exit 0

独自の値に置き換えます。

アイデアは、curl で sftp を使用しようとして時間を無駄にするのをやめることです。PHP の実装を使用するか、expect を使用して sftp をスクリプト化できます。これが助けになり、誰かが時間を無駄にするのを防ぐことを願っています.

于 2012-09-14T13:47:28.913 に答える