共享Linux主机升级Composer提示/opt/cpanel/composer/bin/composer无法写入如何解决
背景
- 2021年4月27日公开披露Composer存在影响PHP的安全漏洞
- 官方建议修复方案:升级到Composer 2.0.13版本
服务器环境
- Linux操作系统
- 共享虚拟主机
操作步骤及报错信息
步骤1:登录终端查看当前使用的Composer版本
执行命令:composer -vvv about
返回结果:
Running 2.0.6 (2020-11-07 11:21:17) with PHP 7.3.27 on Linux / 4.19.150-76.ELK.el6.x86_64
步骤2:执行Composer升级命令
执行命令:composer self-update
返回错误信息:
Upgrading to version 2.0.13 (stable channel).
[Composer\Downloader\FilesystemException]
Filesystem exception:
Composer update failed: "/opt/cpanel/composer/bin/composer" could not be written.
rename(/opt/cpanel/composer/bin/composer): failed to open stream: Read-only file systemself-update [-r|--rollback] [--clean-backups] [--no-progress] [--update-keys] [--stable] [--preview] [--snapshot] [--1] [--2] [--set-channel-only] [--] [< version>]
步骤3:查看目标路径文件权限
执行命令:ls -l /opt/cpanel/composer/bin/composer
返回结果:
-rwxr-xr-x 1 bin bin 2192976 Nov 10 13:37 /opt/cpanel/composer/bin/composer*
再执行命令:stat /opt/cpanel/composer/bin/composer
返回结果:
File: `/opt/cpanel/composer/bin/composer'
Size: 2192976 Blocks: 4288 IO Block: 4096 regular file
Device: 801h/2049d Inode: 266192 Links: 1
Access: (0755/-rwxr-xr-x) Uid: ( 1/ bin) Gid: ( 1/ bin)
Access: 2021-05-02 02:40:36.937400521 -0600
Modify: 2020-11-10 13:37:13.000000000 -0700
Change: 2021-04-14 16:25:27.129945713 -0600
解决方案
本次报错核心原因是共享虚拟主机的全局Composer安装路径为系统只读路径,归属bin用户,普通用户无写入修改权限,无法直接通过self-update命令修改系统级Composer文件,可通过以下两种方案解决:
联系主机服务商升级全局版本
共享主机的系统软件由服务商统一维护,直接提交工单说明需要将全局Composer升级到2.0.13及以上版本修复安全漏洞即可,服务商操作完成后可直接使用升级后的全局版本。用户目录下安装私有Composer版本
若服务商响应时效无法满足需求,可自行在个人用户目录下安装独立版本,无需修改系统文件,步骤如下:
- 进入个人用户家目录:
cd ~ - 下载Composer安装脚本:
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" - 执行安装指定2.0.13版本:
php composer-setup.php --version=2.0.13 - 删除临时安装脚本:
rm composer-setup.php - 配置命令别名优先调用本地版本:
echo "alias composer='~/composer.phar'" >> ~/.bashrc - 加载配置使其立即生效:
source ~/.bashrc - 验证版本:
composer -V,返回2.0.13即为安装成功。
配置完成后,用户名下所有站点执行Composer命令时都会优先调用本地安装的安全版本,不会再触发系统路径权限问题。
内容的提问来源于stack exchange,提问作者Jenny Is Still Learning

