使用 PHP CLI 将用户 Chroot 监禁在家中,并运行 Magento 2 CLi 命令

使用 PHP CLI 将用户 Chroot 监禁在家中,并运行 Magento 2 CLi 命令

好的,首先我很确定会有大量“附加信息”请求,所以请将它们发布在 OP 评论中,我会尽力根据要求提供额外的信息!

以下是概要,首先是服务器:

它是一个共享的临时服务器,Ubuntu 16.4 LTS,带有 Apache2.4、Php7.1、Mysql 5.7。它安装了 Webmin、VirtualMin 和 UserMin(最新)。它还全局安装了 phpMyAdmin。它配置为允许使用 mod_php(使用 www-data)、CGI、FCGI(默认)或 FPM+FCGI 为网站提供服务。CGI/FPM 变体使用 SuExec 来执行网站。Web 服务器本身运行良好。

因此,现在的任务是设置一个 Chroot jail 以允许现有域用户使用 SSH 或 SFTP,但只能看到已经填充了最新 Magento 2 安装的主目录。

在此示例中,我们将使用这些详细信息:

用户 = 域 组 = 域 主目录 = /home/domain/ Chroot = /var/chroot/

现在,我可以很好地设置 Chroot,我所做的是复制所需的相关 lib/var/usr 文件,允许执行命令 ls、bash、sh、rm、rmdir、mkdir、touch、vi 和 php。

虽然花了一些功夫但我让 PHP 命令几乎正确地运行了(在找到所有模块依赖关系之后)。

CHroot jail 没问题,我将 /home/domain 挂载到 /var/chroot/home/domain,这样就没问题了。用户实际上被关进了监狱,可以看到用户的主目录,因此可以毫无问题地访问所有网站文件。

就数据库而言,我省略了 mysql 命令,因为我们有全局可用的 phpmyadmin,因此他们只能使用专用域 mysql 用户登录到相关数据库。没问题。

真正的问题出现在 Magento 2 中。我们知道您使用命令行工具来执行诸如缓存刷新、索引构建和其他部署任务,以下是一些示例:

domain@server:/home/domain/public_html# php bin/magento cache:flush
domain@server:/home/domain/public_html# php bin/magento indexer:reindex
domain@server:/home/domain/public_html# php bin/magento setup:static-content:deploy en_US

我们可以看到,这些命令是通过 PHP CLI 解释器运行的,因此所有工作都需要让 PHP 在被监禁的 CLI 上正确运行。

起初我遇到了数据库问题cache:flush,但通过对 CLI 的 php.ini 进行一些调整(我将 FCGI 从用户主目录复制到被监禁的位置)和一些“找到正确的 mysql.sock”,我修复了这个问题,没有任何问题(好吧,有些问题,但解决了!)

实际问题

我在使用 root 权限时遇到了问题,indexer:reindex这没有问题,但是在 Chroot 中作为用户域,由于某种原因,该命令除了第一个索引之外,其他所有索引都会抛出错误。结果如下:

-bash-4.3$ cd /home/domain/public_html/
-bash-4.3$ php bin/magento indexer:reindex
Design Config Grid index has been rebuilt successfully in 00:00:00
Customer Grid indexer process unknown error: 
Warning: SessionHandler::read(): open(/home/domain/tmp/sess_mfn527a808ntv8e3g9glcjg8aq, O_RDWR) failed: No such file or directory (2) in /home/domain/public_html/vendor/magento/framework/Session/SaveHandler/Native.php on line 22
Category Products indexer process unknown error:
Warning: SessionHandler::read(): open(/home/domain/tmp/sess_mfn527a808ntv8e3g9glcjg8aq, O_RDWR) failed: No such file or directory (2) in /home/domain/public_html/vendor/magento/framework/Session/SaveHandler/Native.php on line 22
Product Categories indexer process unknown error:
Warning: SessionHandler::read(): open(/home/domain/tmp/sess_mfn527a808ntv8e3g9glcjg8aq, O_RDWR) failed: No such file or directory (2) in /home/domain/public_html/vendor/magento/framework/Session/SaveHandler/Native.php on line 22
Product Price indexer process unknown error:
Warning: SessionHandler::read(): open(/home/domain/tmp/sess_mfn527a808ntv8e3g9glcjg8aq, O_RDWR) failed: No such file or directory (2) in /home/domain/public_html/vendor/magento/framework/Session/SaveHandler/Native.php on line 22
Warning: SessionHandler::read(): open(/home/domain/tmp/sess_mfn527a808ntv8e3g9glcjg8aq, O_RDWR) failed: No such file or directory (2) in /home/domain/public_html/vendor/magento/framework/Session/SaveHandler/Native.php on line 22
Warning: SessionHandler::read(): open(/home/domain/tmp/sess_mfn527a808ntv8e3g9glcjg8aq, O_RDWR) failed: No such file or directory (2) in /home/domain/public_html/vendor/magento/framework/Session/SaveHandler/Native.php on line 22
Catalog Rule Product indexer process unknown error:
Warning: SessionHandler::read(): open(/home/domain/tmp/sess_mfn527a808ntv8e3g9glcjg8aq, O_RDWR) failed: No such file or directory (2) in /home/domain/public_html/vendor/magento/framework/Session/SaveHandler/Native.php on line 22
Catalog Product Rule indexer process unknown error:
Warning: SessionHandler::read(): open(/home/domain/tmp/sess_mfn527a808ntv8e3g9glcjg8aq, O_RDWR) failed: No such file or directory (2) in /home/domain/public_html/vendor/magento/framework/Session/SaveHandler/Native.php on line 22
Catalog Search indexer process unknown error:
Warning: SessionHandler::read(): open(/home/domain/tmp/sess_mfn527a808ntv8e3g9glcjg8aq, O_RDWR) failed: No such file or directory (2) in /home/domain/public_html/vendor/magento/framework/Session/SaveHandler/Native.php on line 22

好的,我说,这是某种会话创建失败,随后索引器无法读取创建失败的会话。解释了为什么第一个成功但后续失败。我尝试将 PHp 的默认会话目录挂载到 chroot jail 中,因此我挂载到/var/lib/php//var/chroot/var/lib/php此目录具有粘性位,因此我认为我应该挂载而不是创建。

还是不行。不过,如果我一次重新索引一个会怎么样呢:

-bash-4.3$ php bin/magento indexer:reindex customer_grid
Customer Grid indexer process unknown error:
Warning: SessionHandler::read(): open(/home/domain/tmp/sess_en89p7h50m9mc1a0pb8l3c3tv1, O_RDWR) failed: No such file or directory (2) in /home/domain/public_html/vendor/magento/framework/Session/SaveHandler/Native.php on line 22

还是不行。我努力想看看它到底在挣扎什么,它从哪里得到这个所谓的会话 ID,它应该在哪里创建会话文件,以及我可以在哪里/哪些日志中查看信息!

有人能为我提供任何建议,让我继续前进并掌握 SH 对 Magento 2 网站用户的监禁吗?

答案1

尝试ls -l /home/domain/一下ls -l /home/domain/tmp,看起来您的目录具有错误的权限、错误的所有权,或者两者兼而有之。

PHP 尝试访问会话文件,但失败了。或者文件存在但domain没有读取权限,或者文件不存在且domain没有目录的写入权限。

答案2

当我设法解决这个问题时,我回答了我自己的问题。

有两点错误:

  1. 首先,为了避免在 chroot 中弄乱服务器其余部分的 php-cli 设置,我将 php.ini 复制到 jail 中。然后我适时将会话保存路径设置为没有粘性位的目录。

这就是为什么我可以以 root 身份在 /var/lib/php/sessions 中创建会话文件,但在 chroot jail 中却不能,因为它以错误的权限将其放在了错误的位置。

因此,更新了正确的 php.ini 并检查了权限,快乐的日子我们得到了一个会话!indexer:reindex正在享受乐趣!

  1. 那么,说到重头戏setup:static-content:deploy,我只能说“你知道当脚本抛出这么多错误时,你无法在 CLI 中找到它的顶部吗?”,是的。呃 :/

这是由于(最终发现)我的键盘技能不佳造成的。当我在 jail 中安装用户目录时,我输错了目录名称,因此路径 /home/domain/public_html 不是 jail 中的 /home/domain/public_html。快速重新安装后,一切又恢复正常。

现在问题解决了,感谢 ThoriumBR 提供的有用建议!吸取了教训,希望这个故事能对其他人有所帮助。

相关内容