Laravel执行php artisan tinker报mkdir(): Permission denied权限错误求助
Laravel Tinker: mkdir(): Permission Denied Error in Configuration.php Line 352
我之前也碰到过类似的权限问题,结合你的场景和环境信息,给你几个可行的解决思路:
先明确你的问题场景:你以webmaster用户(项目目录demo的所有者)在全新Laravel 5.5环境运行php artisan tinker时,触发了权限拒绝错误,核心提示如下:
In Configuration.php line 352:
mkdir(): Permission denied
完整异常追踪信息:
Illuminate\Foundation\Bootstrap\HandleExceptions->handleError() at n/a:n/a mkdir() at /media/usb/drive1/websites/demo/vendor/psy/psysh/src/Psy/Configuration.php:352 Psy\Configuration->getRuntimeDir() at /media/usb/drive1/websites/demo/vendor/psy/psysh/src/Psy/Shell.php:185 Psy\Shell->getDefaultCommands() at /media/usb/drive1/websites/demo/vendor/symfony/console/Application.php:1211 Symfony\Component\Console\Application->init() at /media/usb/drive1/websites/demo/vendor/symfony/console/Application.php:435 Symfony\Component\Console\Application->add() at /media/usb/drive1/websites/demo/vendor/psy/psysh/src/Psy/Shell.php:134 Psy\Shell->add() at /media/usb/drive1/websites/demo/vendor/symfony/console/Application.php:421 Symfony\Component\Console\Application->addCommands() at /media/usb/drive1/websites/demo/vendor/laravel/tinker/src/Console/TinkerCommand.php:54 Laravel\Tinker\Console\TinkerCommand->handle() at n/a:n/a call_user_func_array() at /media/usb/drive1/websites/demo/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:29 Illuminate\Container\BoundMethod::Illuminate\Container{closure}() at /media/usb/drive1/websites/demo/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:87 Illuminate\Container\BoundMethod::callBoundMethod() at /media/usb/drive1/websites/demo/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:31 Illuminate\Container\BoundMethod::call() at /media/usb/drive1/websites/demo/vendor/laravel/framework/src/Illuminate/Container/Container.php:549 Illuminate\Container\Container->call() at /media/usb/drive1/websites/demo/vendor/laravel/framework/src/Illuminate/Console/Command.php:183 Illuminate\Console\Command->execute() at /media/usb/drive1/websites/demo/vendor/symfony/console/Command/Command.php:252 Symfony\Component\Console\Command\Command->run() at /media/usb/drive1/websites/demo/vendor/laravel/framework/src/Illuminate/Console/Command.php:170 Illuminate\Console\Command->run() at /media/usb/drive1/websites/demo/vendor/symfony/console/Application.php:938 Symfony\Component\Console\Application->doRunCommand() at /media/usb/drive1/websites/demo/vendor/symfony/console/Application.php:240 Symfony\Component\Console\Application->doRun() at /media/usb/drive1/websites/demo/vendor/symfony/console/Application.php:148 Symfony\Component\Console\Application->run() at /media/usb/drive1/websites/demo/vendor/laravel/framework/src/Illuminate/Console/Application.php:88 Illuminate\Console\Application->run() at /media/usb/drive1/websites/demo/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php:121 Illuminate\Foundation\Console\Kernel->handle() at /media/usb/drive1/websites/demo/artisan:37
你的环境信息:
- 发行版:Raspbian GNU/Linux 8 (jessie)
- Web服务器:Apache/2.4.25
- Laravel版本:5.5(最新)
- DocumentRoot:
/var/www/websites -> /media/usb/drive1/websites/ - Apache用户:
www-data(拥有项目目录权限)
解决思路:
手动指定PsySH运行目录
Tinker依赖的PsySH交互式shell需要创建运行时目录,默认路径可能没有权限。你可以手动创建一个专属目录并赋予权限:- 在项目根目录创建目录:
mkdir .psysh - 设置权限并指定所有者:
chmod 775 .psysh && chown webmaster:webmaster .psysh - 或者通过环境变量临时指定:
export PSYSH_RUNTIME_DIR=/media/usb/drive1/websites/demo/.psysh,之后再运行php artisan tinker
- 在项目根目录创建目录:
检查系统临时目录权限
如果PsySH尝试使用/tmp等系统临时目录,确认webmaster用户对该目录有读写权限:- 查看权限:
ls -ld /tmp,正常权限应为drwxrwxrwt - 若权限不足,临时调整:
chmod o+rwx /tmp,用完后建议调回原权限保证安全
- 查看权限:
切换到www-data用户运行
既然www-data拥有项目目录权限,直接以该用户身份执行Tinker:- 执行命令:
sudo -u www-data php artisan tinker
- 执行命令:
检查USB挂载目录权限
项目目录在USB挂载盘上,挂载参数可能限制了用户访问:- 查看挂载参数:
mount,确认USB盘没有ro(只读)或noexec等限制选项 - 若需要,修改
/etc/fstab中的挂载配置,添加uid=webmaster,gid=webmaster,rw参数,之后重新挂载:mount -a
- 查看挂载参数:
内容的提问来源于stack exchange,提问作者pixelmusik




