質問
皆様にお伝えしたくて書き込みを簡単SFTPクライアントにPHPを誇り、お客さまからの多様な要programatically取得するファイル経由nすることができます。を使用していPECL SSH2います。
私たちに対する道路ブロックです。の説明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
この意味でいうときにキャストのリソース文字列になります。の文書が悪いのでしょうか。また代替資源とホストのユーザ名とホストが動作しなかった。かのパスが正しいからでSFTPコマンドラインから動作すること。
は誰でも利用しようとしたのSSH2extenstionとSFTP?私を見落とさないような。
更新:
Iセットアップsftp他の機内での作業だけます。それについて何かのサーバーに送っ接続う機会を設けていきたいと思います。
解決
接続する場合は、SFTPサーバーが必要に接続するにはrootフォルダ(インスタンスを読み込むためのコンテンツのフォルダー)おもにエラー使用時に"/"とします。
ソリューションを見つけたのパス"/./", ことになるで有効なパスへの参照のrootフォルダにまとめた。これは、ユーザーでログインとしてのみアクセスを独自のルートフォルダやフルパスが可能です。
その要求をサーバーにしようとした場合にの内容を読み込むシーケンスのファイル内に保すべきもののようになります:
$rd = "ssh2.sftp://{$this->sftp}/./";
他のヒント
のためのphpバージョン>5.6.27利用intval()
$sftpConnection = ssh2_connect($host);
$sftp = ssh2_sftp($sftpConnection);
$fp = fopen("ssh2.sftp://" . intval($sftp) . $remoteFile, "r");
ん類似の課題です。思を確認することができまうこと:
$dir = "ssh2.sftp://{$sftp}{$remote_dir}";
$handle = opendir($dir);
時 $remote_dir
をフルパスからのルートを open_dir
ます。の場合 $remote_dir
は'/'は、それを取得します。'がオープン"エラーとしてきました。
私の場合はそうではssh接続のルートフォルダの代わりに'home'ディレクトリとしてftpいます。るのでしょうかたが別のサーバかにはコンフィグの問題です。
もっとも簡単にSFTPではPHP(windows上であっても)をインストールせずに他の拡張子で作成されていることが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();
?>
の文書このページでエラーとなります。の例がここにではなく: http://php.net/ssh2_sftp -どんな特設のSFTP資源を利用ssh2_sftp()を使用する前にでfopen().り、一見何の変哲もないが、例えば"資源#24時文字列に変換され...ビットを作るのだそうです。
他の点に注意することSFTPのルートディレクトリではなく、ホームディレクトリのリモートユーザーは、リモートパスをURIは、常に絶対です。
これだったのと同じ問題ですが、私の問題です。
私の場合、接続する場合は、サーバ、プロジェクトのアカウントサーバーのconfigsん書くことができる。
私の口座を使用方法、このルートのアカウントがりとなっているためのルートサーバーです。
また全体をパスまでのフォルダにさせていただくとる事ができて本当に良かった問題を解決する.
なので、私のアドバイスをベースを用いたグラフィック-インターフェースしてくれてありがとうございますの使用方法)を追加し全体へのパスコードです。
$pathFromAccountRootFolderToMyDestinationFolder = '/Account/Root/Folder/To/My/Folder';
$stream = fopen("ssh2.sftp://".$sftp."/".$pathFromAccountRootFolderToMyDestinationFolder."/myFile.ext", 'r');
希望すことが大事だと申し上げましたその他の人が同じ発行いたします!
感謝!
私は最近手にSFTP PHP働くこphpseclibした多くの使いやす:
http://phpseclib.sourceforge.net/
ただし、次の贅沢な共有ホストをインストールできな拡張したいのかもしれなPECL拡張されていないのでラッキーだった。プラスphpseclibのAPIのパッケージをダウンロードするより直感的に、OOP。
私の行っていけるかを話し合いました接続関数の返却string URL資源です。Unfortunatelly資源でより作成された機能をコンテキストとガベージコレクタは切り離すリソースの機能ます。【解決リソース参照により、設定を解除に手動で複雑なコンテキスト
解決問題をsftpサポート(ユー)サーバ
これはバグのssh2パッケージから年前の投稿パッチをphp.net.を固定するのでこの問題で再構築にssh2peclパッケージです。お問い合わせください。 https://bugs.php.net/bug.php?id=69981.またパッチが、ssh2_fopen_wrappers.cファイルのパッケージへ固定します。ここで書いたコメント:
こちらはイーコードからssh2_fopen_wrappers.cの原因となるこのバグ:(コメント含む)
/*
Find resource->path in the path string, then copy the entire string from the original path.
This includes ?query#fragment in the path string
*/
resource->path = estrdup(strstr(path, resource->path));
このコンポーネントと、そのためこのバグ--"として紹介されてい問題の修正のバグ#59794.このコードがそうとしていることをアピールしを含む文字列の一部は、クエリー、およびフラグメントからのパスに変更します。この値のパス変数:
ssh2.sftp://Resource id #5/topdir?a=something#heading1
合資源>パスは"/topdir"の結果である"/topdir?a=っ#heading1"が割り当てられた資源->路のようにコメントは言う。
を考えた場合の資源->パスは"/".後にコードが実行され、資源->パスは"//リソースid#5/topdir#heading1".このことはないと考えている。こちらのコードは:
resource->path = estrdup( strstr( strstr( path, "//" ) + 2, "/" ) );
する"を参照してください、パッチバグ#73597を除去する"リソースidのパス文字列を呼び出す前に、php_url_parse().