如何修复错误:mkdir():运行composer时权限被拒绝


How to fix Error: mkdir(): Permission denied when running composer

我有一个ec2映像,在尝试创建新的laravel项目时出现以下错误。

[ErrorException]mkdir((:权限被拒绝

这是命令:

composer create-project laravel/laravel mydir

我可以用我的ec2用户用户名写入文件夹,但我需要添加composer的写入权限吗?

快速答案:

出于安全考虑,让root作为所有者,只允许我们在将要工作的区域内读取、写入和执行

  1. 更改目录

    cd /var/www/

  2. 更改集团所有权

    sudo chown -Rv root:$USER .

  3. 将特权添加到我们的组

    sudo chmod -Rv g+rw .

  4. 对于大结局,继续创建您的新laravel项目

    composer create-project laravel/laravel项目名称--prefer-dist

祝贺你,我们完成了。:(

深入解释

解决方案背后的解释:默认情况下,您有两个用户;root$USER(这是全局变量,但实际名称是您输入的用户名(。创建的每个用户都有一个组。因此,如果我的用户名是john,那么我有一个名为john的组。有很多方法可以解决这个问题,但我之所以选择这条路线,有几个原因:

  1. 出于安全考虑,我仍然希望root成为这些文件的所有者。

  2. 我在本地主机上工作,所以不应该有任何其他(来宾(用户在我的文件上写东西。

为了实现这一点,我们需要编辑组所有权并添加适当的权限。我们将保持others的原样,只允许它们读取和执行文件。

让我们开始吧:

  1. 我喜欢在我正在进行更改的目录中,以避免错误,所以首先我们需要输入我们将要工作的目录。

    cd /var/www/

  2. 我们需要更改我们将要工作的目录的组所有权。从我们所在的目录开始,以及我们将在该目录下创建的所有未来目录和文件。因此,从现在起,基本上任何子目录都将由我们的小组所有。

    sudo chown -Rv root:$USER .

chown=命令changeowner。

-R=递归-这基本上是指对该目录中的所有目录执行相同的命令。

-v=详细-我们在这里说明是为了通过向我们展示实际发生的事情来保持更新。

root:$USER=这是我们正在设置所有权的情况。冒号(:(前的第一个单词表示root将是单个所有者。冒号(:(后的第二个单词表示组所有者将是$USER(当前用户(。

.=这只是表示"在这里,在这个目录中"。

  1. 现在,我们将为我们的组添加正确的特权。请记住,这是我们允许root作为主要所有者的地方,而只允许自己创建更改(当然,除了root之外(。正如我之前提到的,这不允许其他用户创建任何更改。

    sudo chmod -Rv g+rw .

chmod=对changemod指令的命令,在本例中为特权。

CCD_ 26=递归&详细

g=这说明谁将接收修改。在我们的例子中,g-group其他选项是u-user和o-Other。

+=象征添加

r=象征读取

w=象征写入

  1. 现在我们完成了。尝试创建一个新的laravel项目。

    composer create-project laravel/laravel项目名称`--首选dist

注意:如果不起作用,请在/var/www/目录中输入命令ls -al | grep $USER

如果你得到这个:drwxrw-r-x

您缺少该组的可执行文件(x(权限。第一个CCD_ 36用于用户,最后一个x用于其他用户。组应该有中间的x

运行以下命令,您应该已经做好了准备:

sudo chmod -Rv g+x .

现在,如果你运行ls -al | grep $USER,你应该得到:

drwxrwxr-x

  1. 添加"www"组并将您的用户添加到此组

    sudo groupadd www
    sudo usermod -a -G www ec2-user
    
  2. 注销/登录

  3. 设置所有权和写入权限

    sudo chown -R root:www /var/www
    sudo chmod 2775 /var/www
    find /var/www -type d -exec sudo chmod 2775 {} +
    find /var/www -type f -exec sudo chmod 0664 {} +
    

引用:http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/install-LAMP.html

在Homestead/Vagrant环境中创建额外项目时,我遇到了类似的ErrorException。我之前添加了Homestead.yaml.的文件夹和路径

Oscar和Jens A.Koch的回答指向了正确的方向,但在我的开发机器上走得太远了。

Homestead Box内部的工作范围较窄的解决方案:

sudo mkdir <ProjectDir> 
sudo chgrp vagrant <ProjectDir>
sudo chmod g+wx <ProjectDir>
composer create-project --prefer-dist laravel/laravel <Project>

问题的要点

/var/www/html文件夹中安装Laravel是一个常见的要求。但是,系统默认值通常会将此文件夹及其父文件夹(www(的用户和组设置为root。如果您将其作为root运行,则composer将抱怨。

解决方案

  • 查找与您的apache/nginx服务器对应的用户。它通常有wwwwww-data等名称。您可以运行以下命令来获得线索

      cat /etc/group | grep www
    
  • 有了服务器用户的知识(从上面(,您可以运行以下命令。我假设您的服务器用户是www-data

      # Under your user account, change directories
      cd /var/www/
      # Change group ownership
      sudo chown -Rv root:www-data .
      # Give all the privileges to the group
      sudo chmod -Rv g+rwx .
      # Add your user name to www-data group, use 'who' command to get your username
      sudo usermod -a -G www-data your_user_name
      # Verify that your user name is in the www-data group by typing
      group your_user_name
      # Very important, logout of the system and come back to this folder
      # Do the the laravel install
      composer create-project --prefer-dist laravel/laravel projectName
      # Not finished yet! recursive make the www-data the group owner of projecName which the folder in which Laravel site resides by now
      sudo chown -R :www-data projectName
    

确保您具有读/写文件夹权限。它对我有用。

就像在ubuntu

 var/www/html

因此,如果您想在html文件夹中创建dir,请首先授予html文件夹权限。那你就完了。谢谢

这个带有模糊框的问题

如果你试图在一个新的流浪者盒子里安装一些带有composer的东西,那么在安装流浪者时,你可能已经指定了允许使用的路径。

因此,请检查您的个人.yml文件,以便在''ansible''vars

你有这样的

vagrant_local:
  vm:
    name: oxideshop
    hostname: oxideshop.local
    aliases:
      - www.oxideshop.local
    app_shared_folder:
      source: oxideshop
      target: /var/www/oxideshop

您必须确保app_shared_folder目标与您用于composer安装的目标相同。

示例:

composer创建项目oxide-sales/oxideshop项目/var/www/oxideshopdev-b-6.1-ce

确保您具有读/写文件夹权限。喜欢:sudo chown-R用户名:www数据/项目路径/用户名/项目名称/

示例:

$ sudo chown -R tubai:www-data /home/tubai/firstlara/

运行以下命令

cd /var/www
sudo chown -R $USER:www-data html/
sudo chmod -R 775 html/

我也遇到了同样的问题,使用sudo执行命令对我来说很有效:

sudo composer create-project laravel/laravel mydir

cd到当前要安装laravel的目录,并使用更改目录访问

sudo chmod -R 777 ./

键入您的密码,您就可以继续安装