你是如何给一个phar包打补丁的?例如,如果我想要修补程序
if (function_exists('posix_getuid') && posix_getuid() === 0) {
if ($commandName !== 'self-update' && $commandName !== 'selfupdate') {
$io->writeError('<warning>Do not run Composer as root/super user! See https://getcomposer.org/root for details</warning>');
从作曲家到
if (false && posix_getuid() === 0) {
if ($commandName !== 'self-update' && $commandName !== 'selfupdate') {
$io->writeError('<warning>Do not run Composer as root/super user! See https://getcomposer.org/root for details</warning>');
我该怎么做?仅仅编辑代码通常会导致
PHP Fatal error: Uncaught PharException: phar "/usr/local/bin/composer" has a broken signature in /usr/local/bin/composer:28
Stack trace:
#0 /usr/local/bin/composer(28): Phar::mapPhar()
#1 {main}
thrown in /usr/local/bin/composer on line 28
发布于 2022-06-01 01:58:18
您可以将php配置为告诉phars不要在运行时使用导致该错误的签名检查。
将以下内容配置为false https://www.php.net/manual/en/phar.configuration.php#ini.phar.require-hash
此选项将强制所有打开的Phar存档包含某种签名(当前支持MD5、SHA1、SHA256、SHA512和OpenSSL ),并且拒绝处理任何不包含签名的Phar存档。
编辑:
https://github.com/composer/composer
您需要使用phar.require-hash=0命令重新编译composer并使用运行
发布于 2022-06-01 03:40:47
首先打开phar:
rm -rfv unpacked;
mkdir unpacked;
php --define open_basedir= --define phar.readonly=0 -r '(new Phar("composer.phar"))->convertToExecutable(Phar::TAR,Phar::NONE)->extractTo("unpacked/");'
然后在未打包的dir (在您的例子中是unpacked/src/Composer/Console/Application.php
)中进行修补,然后重新打包phar:
rm -f hotpatched.phar;
php --define open_basedir= --define phar.readonly=0 -r '$phar=new Phar("hotpatched.phar");$phar->buildFromDirectory("unpacked");$phar->setStub("#!/usr/bin/env php\n".$phar->createDefaultStub("bin/composer"));'
但是将bin/composer
替换为phar包的真正入口点(在composer的情况下,它是bin/composer
),然后使热修补的phar可执行:
chmod +x hotpached.phar
瞧,您的phar被修补了:) phar甚至与php.ini phar.require_hash=1
一起工作。
提示:如果您希望phar压缩/缩小,可以添加$phar->compress(Phar::BZ2);
。
https://stackoverflow.com/questions/72437690
复制