PHP 7 SSH2.SFTP stat() 错误解决方法

2023-12-29

我有一个使用 SFTP 连接下载文件的应用程序。它在 PHP 5.6 中工作正常,但在 PHP 7 中则不然。我得到的错误如下:

PHP 警告:filesize():ssh2.sftp 统计失败...

我的代码如下:

 public function retrieveFiles($downloadTargetFolder,$remoteFolder = '.') {

            $fileCount = 0;

                echo "\nSftpFetcher retrieveFiles\n";

        $con = ssh2_connect($this->host,$this->port) or die("Couldn't connect\n");
        if($this->pubKeyFile){
                $isAuth = ssh2_auth_pubkey_file($con, $this->user, $this->pubKeyFile, $this->privKeyFile);
        } else {
                $isAuth = ssh2_auth_password($con,  $this->user,  $this->pass);
        };


        if ($isAuth) {

                $sftp = ssh2_sftp($con);
                $rd = "ssh2.sftp://{$sftp}{$remoteFolder}";

                if (!$dir = opendir($rd)) {
                        echo "\nCould not open the remote directory\n";
                } else {
                        $files = array();
                                while (false != ($file = readdir($dir))) {
                                    if ($file == "." || $file == "..")
                                        continue;
                                    $files[] = $file;
                                }

                        if (is_array($files)) {
                            foreach ($files as $remoteFile) {
                                                echo "\ncheck file: $remoteFile vs filter: " . $this->filter."\n";
                                if ($this->filter !== null && strpos($remoteFile,$this->filter) === false) {
                                    continue;
                                }
                                                echo "file matched\n";
                                $localFile = $downloadTargetFolder . DIRECTORY_SEPARATOR . basename($remoteFile);


                                //$result = ftp_get($con,$localFile,$remoteFile,FTP_BINARY);
                                $result = true;
                                // Remote stream
                                if (!$remoteStream = @fopen($rd."/".$remoteFile, 'r')) {
                                        echo "Unable to open the remote file $remoteFolder/$remoteFile\n";
                                        $return = false;
                                } else {
                                        // Local stream
                                        if (!$localStream = @fopen($localFile, 'w')) {
                                                echo "Unable to open the local file $localFile\n";
                                                $return = false;
                                        } else {
                                                // Write from our remote stream to our local stream

                                                $read = 0;
                                                $fileSize = filesize($rd."/".$remoteFile);
                                                while ($read < $fileSize && ($buffer = fread($remoteStream, $fileSize - $read))) {
                                                        $read += strlen($buffer);
                                                        if (fwrite($localStream, $buffer) === FALSE) {
                                                                echo "Unable to write the local file $localFile\n";
                                                                $return = false;
                                                                break;
                                                        }
                                                }


                                                echo "File retrieved";
                                                // Close
                                                fclose($localStream);
                                                fclose($remoteStream);

                                        }

                                }

                                if ($result) {
                                    $fileCount++;
                                }
                            }
                        }

                        ssh2_exec($con, 'exit');
                        unset($con);
                }

        } else {
                echo "Error authenticating the user ".$this->user."\n";
        }

            return $fileCount;

    }
}

经过一番研究,我发现 stat() 存在问题:

http://dougal.gunters.org/blog/2016/01/18/wordpress-php7-and-updates-via-php-ssh2/ http://dougal.gunters.org/blog/2016/01/18/wordpress-php7-and-updates-via-php-ssh2/ https://bugs.php.net/bug.php?id=71376 https://bugs.php.net/bug.php?id=71376

我的问题

鉴于我当前的情况,是否有解决方法允许我通过 SFTP 下载code或者还有其他人可以推荐使用的库吗?

我的PHP版本: PHP 7.0.8-0ubuntu0.16.04.3(cli)(NTS)


Quoting PHP ssh2.sftp opendir/readdir 修复 http://paul-m-jones.com/archives/6439,

而不是使用"ssh2.sftp://$sftp"作为流路径,将 $sftp 转换为整数,如下所示:"ssh2.sftp://" . intval($sftp) . "/"。然后它就会工作得很好。

变更原因如下:

PHP 5.6.28(显然是 7.0.13)引入了 URL 解析的安全修复,导致 $sftp 资源句柄的字符串插值不再被识别为有效 URL。反过来,在升级到这些 PHP 版本之一后,当您在路径字符串中使用 $sftp 资源时,这会导致 opendir()、readdir() 等失败。

至于其他图书馆......我只知道其他图书馆是phpseclib http://phpseclib.sourceforge.net/,它有一个 libssh2 的模拟器:

https://github.com/phpseclib/libssh2-compatibility-layer https://github.com/phpseclib/libssh2-compatibility-layer

这个“模拟器”当然可以改进。比如应该添加composer.json文件等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP 7 SSH2.SFTP stat() 错误解决方法 的相关文章

随机推荐

  • Python:按任意列对文件进行排序,其中列包含时间值

    我有一个人的 txt 文件 每个人旁边都有两次 这是 txt 文件 Xantippe 09 00 11 00 Erica 10 00 12 06 Marcia 09 30 11 45 Elizabeth 10 15 12 10 Angela
  • 使用 AWS Java SDK v2 从 AWS EKS 获取身份验证令牌

    如何使用 AWS Java SDK v2 从 AWS EKS 获取 Kubernetes 身份验证令牌 然后可用于使用 Kubernetes SDK 向 Kubernetes 进行身份验证的身份验证令牌 换句话说 我想从 EKS 获取身份验
  • 如何更新 Dynamodb 中字符串集 (SS) 类型的项目?

    我创建了一个字符串集类型的属性 当我创建项目并分配 SS 类型的属性时 一切正常 但是当我尝试更新此属性时 数据类型更改为列表 L 我试试这个 qw new AWS DynamoDB DocumentClient var params Ta
  • jQuery UI Sortable/Draggable 导致窗口跳转

    在我的网页上 我有一个包含可排序 UL 的 div 每当我滚动到页面底部并拖动最后一个 LI 时 我的页面就会跳转 并且滚动条 在整个窗口上 会增长 这是一个几乎解决了我的问题的 JSFiddle www jsfiddle net u5af
  • 在Django中的特定时间执行任务

    我必须在用户指定的特定时间执行任务 这不会是固定时间 它将根据用户 到时候我就得执行我的任务了 为了实现这一点 我尝试使用 django cron 也尝试使用 django crontab 但在这两种情况下 我们都必须在中指定 cron 详
  • 源代码控制政策

    我正在寻找不同源代码控制策略的概述 我只了解到主线政策 并希望在加入团队之前更好地了解其他政策 有人可以提供一个概述的链接 甚至给我一些政策名称 以便我可以启动谷歌吗 没有空的提交消息
  • 如何将内存流加载到 LibVLC 中?

    我想使用 LibVLC 播放内存流中的媒体文件 如下所示 Ideally it would go like this LibVLC MediaFromStream new MemoryStream File ReadAllBytes Fil
  • Javascript 中的通配符字符串比较

    假设我有一个包含许多字符串的数组 称为 birdBlue birdRed 和其他一些动物 比如 pig1 pig2 现在我运行一个 for 循环来遍历数组并应该返回所有鸟类 这里什么样的比较才有意义 Animals bird 这是我的第一个
  • 什么时候应该真正使用访问者模式

    在文中我什么时候应该使用访客设计模式 https stackoverflow com questions 255214 when should i use the visitor design pattern第一个回答者指出 现在我们要向层
  • 使用airflow hive操作符并输出到文本文件

    您好 我想使用气流 hive 运算符执行 hive 查询并将结果输出到文件 我不想在这里使用 INSERT OVERWRITE hive ex HiveOperator task id hive ex hql sql hive ex sql
  • Swift 2 AVPlayer - 播放下一个视频上一个视频

    我对这一部分的研究已经不止一天了 请提出任何想法 我必须完成播放视频 我有一个视频列表 如果用户将其设为全屏视频 则上一个和下一个播放器按钮将启用 并在单击时播放 这是我的代码 var commmentQueuePlayer AVQueue
  • Java 接口和 Objective-C 协议之间的区别?

    我了解 Java 现在正在学习 Objective C Java 接口和 Objective C 协议到底有什么区别 首先 一点点关于该主题的历史观点 http www virtualschool edu objectivec influe
  • 为什么参数处于逆变位置?

    我试图在特征中使用协变类型参数来构造一个案例类 如下所示 trait MyTrait T private case class MyClass c T 编译器说 error covariant type T occurs in contra
  • 使用 Scala 延续实现收益(收益回报)

    如何实现 C yield return使用 Scala 延续 我希望能够编写 ScalaIterator风格相同 评论里有刺这篇 Scala 新闻文章 http www scala lang org node 2096 但它不起作用 尝试使
  • Rails 3 Active Record 关系顺序:使用散列而不是字符串

    要在 Rails 3 中对关系进行排序 我们必须这样做 User where activated gt true order id ASC 但我认为 User where activated gt true order id gt asc
  • 使用 Leiningen 部署 Clojure 应用程序

    到目前为止 这是我的project clj 文件 defproject raj 0 0 1 SNAPSHOT description FIXME write description dependencies org clojure cloj
  • 从 DLL 导出生成标头

    是否有工具可以提取 生成 DLL 导出的 h 标头 仅给出 DLL 手动输入它们被证明是一种痛苦 对于通用 C Dll 来说这是不可能的 C 过程符号没有类型信息被毁坏了 dumpbin 可以列出过程名称 但无法推断出返回类型 参数数量等
  • 如何知道 jQuery 对象的类型?

    我需要检测它是否是
  • 为什么iPhone 6使用@2x图像资源?

    iPhone 6 加 uses 3x图像资产 但是iPhone 6 uses 2x图像资产 就像iPhone 4 and iPhone 5 新 iPhone 6 和 6 的图像分辨率 添加了 3x 支持吗 https stackoverfl
  • PHP 7 SSH2.SFTP stat() 错误解决方法

    我有一个使用 SFTP 连接下载文件的应用程序 它在 PHP 5 6 中工作正常 但在 PHP 7 中则不然 我得到的错误如下 PHP 警告 filesize ssh2 sftp 统计失败 我的代码如下 public function re