19

n個のリモートサーバーを介してプログラムでファイルを取得する必要があるため、PHPで単純なSFTPクライアントを作成しています。PECLSSH2拡張機能を使用しています。

しかし、私は障害物にぶつかりました。php.netのドキュメントは、これを実行できることを示唆しています。

$stream = fopen("ssh2.sftp://$sftp/path/to/file", 'r');

しかし、私は似たようなことを試みるlsメソッドを持っています

public function ls($dir)
{
    $rd = "ssh2.sftp://{$this->sftp}/$dir";
    $handle = opendir($rd);
    if (!is_resource($handle)) {
        throw new SFTPException("Could not open directory.");
    }

    while (false !== ($file = readdir($handle))) {
        if (substr($file, 0, 1) != '.'){
            print $file . "\n";
        }
    }
    closedir($handle);
}

次のエラーが発生します。

PHP Warning:  opendir(): Unable to open ssh2.sftp://Resource id #5/outgoing on remote host

これは、リソースを文字列にキャストするときに発生するため、完全に理にかなっています。ドキュメントは間違っていますか?リソースをhost、username、hostに置き換えてみましたが、どちらも機能しませんでした。コマンドラインからSFTPを実行でき、正常に機能するため、パスが正しいことがわかります。

他の誰かがSFTPでSSH2拡張機能を使用しようとしましたか?ここで明らかな何かが欠けていますか?

アップデート:

社内の別のマシンでsftpをセットアップしましたが、問題なく動作します。だから、私が接続しようとしているサーバーについて何かが機能していないに違いありません。

4

10 に答える 10

7

拡張機能などをインストールせずに PHP 内 (Windows 上でも) で SFTP を動作させる最も簡単な方法は、PHPSECLIB: http://phpseclib.sourceforge.net/です。SSH は完全に PHP クラスに実装されています。

あなたが使用するのは次のようなものです:

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

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

echo $sftp->pwd();
?>
于 2011-08-23T09:15:52.833 に答える
7

私は同様の問題を抱えています。これに似たようなことをしていると思います:

    $dir = "ssh2.sftp://{$sftp}{$remote_dir}"; 
    $handle = opendir($dir);

$remote_dirルートからのフルパスが機能するのはいつopen_dirですか。「/」または「」だけの場合$remote_dir、「開くことができません」というエラーが表示されます。

私の場合、ssh は ftp のように「ホーム」ディレクトリではなく、ルート フォルダに接続しているようです。あなたはそれが別のサーバーで動作したと述べたので、それは単なる設定の問題なのだろうか.

于 2009-10-23T00:15:59.210 に答える
4

そのページのドキュメントにはエラーが含まれています。代わりに、次の例を見てください: http://php.net/ssh2_sftp - 実際に必要なのは、fopen() で使用する前に、ssh2_sftp() を使用して特別な SFTP リソースを開くことです。はい、文字列に変換すると「Resource #24」など、そのように見えます...少し奇妙ですが、明らかに機能します。

もう 1 つの注意点は、SFTP はリモート ユーザーのホーム ディレクトリではなくルート ディレクトリで開始されるため、URI のリモート パスは常に絶対パスにする必要があることです。

于 2012-05-21T14:36:46.643 に答える
1

同じ問題が発生しましたが、問題を特定できました。

私の場合、サーバーに接続するときに、アカウントのルートに移動していましたが、サーバーの構成が原因で、そこに書き込むことができませんでした。

fireFTPを使用してアカウントに接続したので、アカウントのルートがどこにあるかを確認できました...それはサーバーのルートでした。

書き込みが許可されているフォルダーまでのパス全体を含める必要があったため、問題を解決できました。

したがって、私のアドバイスは、グラフィックインターフェイスを使用してパスを取得し(私はfireFTPを使用しました)、パス全体をコードに追加することです。


$pathFromAccountRootFolderToMyDestinationFolder = '/Account/Root/Folder/To/My/Folder';
$stream = fopen("ssh2.sftp://".$sftp."/".$pathFromAccountRootFolderToMyDestinationFolder."/myFile.ext", 'r');

これがあなたと同じ問題を抱えている他の人々に役立つことを願っています!

乾杯!

于 2010-03-25T03:22:50.057 に答える
0

私は最近、PHP で SFTP を動作させようとしましたが、phpseclib の方がはるかに使いやすいことがわかりました。

http://phpseclib.sourceforge.net/

共有ホストにいないという余裕があり、必要な拡張機能をインストールできる場合は、PECL 拡張機能の方が良いかもしれませんが、私たち全員がそれほど幸運というわけではありません。さらに、phpseclib の API は OOP であるため、もう少し直感的に見えます。

于 2009-11-23T03:55:41.533 に答える
0

私の問題は、関数で接続し、リソースを内部に含む文字列 URL を返すことでした。残念ながら、リソースは関数コンテキストで作成され、ガベージ コレクターは関数終了時にリソースを切断しています。解決策: 参照によってリソースを返し、より複雑なコンテキストでは手動で設定を解除します。

于 2016-11-28T23:35:18.500 に答える