sh: 1: cross-env: 权限被拒绝(laravel mix)

66

我尝试运行 npm run dev 但是出现以下错误:

sh: 1: cross-env: Permission denied
npm ERR! code ELIFECYCLE
npm ERR! errno 126
npm ERR! @ development: `cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js`
npm ERR! Exit status 126
npm ERR! 
npm ERR! Failed at the @ development script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/shanmaseen/.npm/_logs/2019-02-22T16_32_08_191Z-debug.log
npm ERR! code ELIFECYCLE
npm ERR! errno 126
npm ERR! @ dev: `npm run development`
npm ERR! Exit status 126
npm ERR! 
npm ERR! Failed at the @ dev script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/shanmaseen/.npm/_logs/2019-02-22T16_32_08_241Z-debug.log

我已经在互联网上搜索了一个星期,没有什么帮助!

我甚至尝试从package.json脚本中移除“cross-env”,但是随后出现了webpack:权限被拒绝的错误,这表明权限错误不是由cross-env自身引起的。

这是错误日志:

0 info it worked if it ends with ok
1 verbose cli [ '/usr/bin/node', '/usr/bin/npm', 'run', 'dev' ]
2 info using npm@6.7.0
3 info using node@v11.10.0
4 verbose run-script [ 'predev', 'dev', 'postdev' ]
5 info lifecycle @~predev: @
6 info lifecycle @~dev: @
7 verbose lifecycle @~dev: unsafe-perm in lifecycle true
8 verbose lifecycle @~dev: PATH: /usr/lib/node_modules/npm/node_modules/npm-lifecycle/node-gyp-bin:/media/e/www/mwar/node_modules/.bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
9 verbose lifecycle @~dev: CWD: /media/e/www/mwar
10 silly lifecycle @~dev: Args: [ '-c', 'npm run development' ]
11 silly lifecycle @~dev: Returned: code: 126  signal: null
12 info lifecycle @~dev: Failed to exec dev script
13 verbose stack Error: @ dev: `npm run development`
13 verbose stack Exit status 126
13 verbose stack     at EventEmitter.<anonymous> (/usr/lib/node_modules/npm/node_modules/npm-lifecycle/index.js:301:16)
13 verbose stack     at EventEmitter.emit (events.js:197:13)
13 verbose stack     at ChildProcess.<anonymous> (/usr/lib/node_modules/npm/node_modules/npm-lifecycle/lib/spawn.js:55:14)
13 verbose stack     at ChildProcess.emit (events.js:197:13)
13 verbose stack     at maybeClose (internal/child_process.js:984:16)
13 verbose stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:265:5)
14 verbose pkgid @
15 verbose cwd /media/e/www/mwar
16 verbose Linux 4.18.0-15-generic
17 verbose argv "/usr/bin/node" "/usr/bin/npm" "run" "dev"
18 verbose node v11.10.0
19 verbose npm  v6.7.0
20 error code ELIFECYCLE
21 error errno 126
22 error @ dev: `npm run development`
22 error Exit status 126
23 error Failed at the @ dev script.
23 error This is probably not a problem with npm. There is likely additional logging output above.
24 verbose exit [ 126, true ]

我正在使用 Laravel 5.7mix。

Node 版本:v11.10.0 NPM 版本:6.7.0

请问有什么帮助吗?


请查看此链接 https://laracasts.com/discuss/channels/laravel/sh-1-cross-env-permission-denied - Molda
@Molda 没有起作用。 我甚至尝试安装一个全新的 Laravel 项目,但仍然没有起作用。 - shamaseen
问题可能是JS文件权限。我通过在Homestead.yml文件夹部分添加以下内容解决了这个问题: ' type: "smb" mount_options: ["mfsymlinks,dir_mode=0775,file_mode=0775"] ' - Memonic
8个回答

184

我使用的是Ubuntu 18。

以下命令对我很有帮助 :-)

npm rebuild

如下所述,官方网站。

此命令在匹配的文件夹上运行npm build命令。当您安装新版本的node并必须使用新二进制重新编译所有C++插件时,这将非常有用。当使用--ignore-scripts--no-bin-links进行安装时,明确选择要构建和/或链接二进制文件的软件包也很有用。

如果提供了一个或多个软件包名称(以及可选的版本范围),则只会重建与指定符号之一匹配名称和版本的软件包。


你在哪里运行这个命令?在项目文件夹里还是其他地方?我尝试了但没成功。 - hakkikonu
在您的项目文件夹根目录中。 - zarpio
1
@Zarpio 这个解决方案刚刚对我有效,我正在运行 Ubuntu 22.04.2 LTS。 - Farid
在macOS Ventura上也有工作过。 - undefined

56

这是因为全局安装npm包时出现了权限问题,导致npm无法访问。

要解决此问题,请尝试:

1.

npm rebuild

npm run watch

或2

rm -Rf node_modules

npm install

npm run watch

希望它能够工作。


1
将用户设置为 /usr/local 的所有者是通过反模式解决问题。该目录应该通过为用户提供只读数据来“服务”用户。(手册) - Bas Peeters
@BasPeeters 我已经编辑了解决方案。根据您的建议,我已经删除了反模式点,谢谢。 - Tinashe
5
方法二有效。 - Mohamed Raza

53

以下方法适用于我:

chmod -R a+x node_modules

来源


谢谢。这对我很有效,而且很容易。可能是最好的答案。 - Ryan
谢谢,这个可行... 你只需要确保在运行 npm install 后运行它。 - lauksas
1
你不应该给所有文件,特别是每个人都执行权限。相反,要识别导致您权限错误的脚本,只修复它。或者至少执行以下命令:find -type d -name bin -exec chmod -R u+x {} \; 仅向文件所有者授予执行权限,并且仅在bin目录中操作文件。 - ruuter

20
如果文件和/或目录权限被更改为更严格的权限,则在Ubuntu Linux上可能会发生以下权限错误:
$ npm run watch

> watch
> mix watch

sh: 1: mix: Permission denied

在Ubuntu Linux上解决这个问题,对我有效的方法是:

chmod -R u+x node_modules

它会递归地给予用户u执行权限x,以及节点文件夹node_modules和其中所有内容的执行权限-R

要小心,考虑安全性,不要使用aog标志代替u标志,这将授予allothersgroup执行权限。如果您信任组中的所有用户,则可以使用g标志。

如ruuter在评论中所述,为了安全起见,最好找到需要执行权限的确切文件,并仅为这些文件授予执行权限。


我展示了一个快速的解决方案,如何尽可能限制地为当前用户授予执行权限,而无需耗费时间识别需要执行权限的脚本。我还解释了安全性问题,即权限应该是限制性的。例如,www-data用户将无法执行。 此外,@ruuter,为什么您在这个答案下写了这个安全问题,而不是在habib的答案下,habib的答案显示如何给所有用户执行权限? - Emil Carpenter
我不会说它是尽可能限制的。你可以这样做:find -type d -name bin -exec chmod -R u+x {} \; 来更加严格。识别脚本不应该耗费太多时间。OP 的错误是关于 cross-env 的。所以只需找到 cross-env 文件即可。另外,如果 www-data 用户是文件的所有者怎么办?在共享主机上,运行 Web 服务器的用户通常与所有文件的所有者相同。关于 habib 的答案,你是对的,我已经纠正了我的错误。 - ruuter
由于系统上有更多的bin目录,包括系统本身,而不是其他目录,如node_modules。对于初学者来说,“只需”进入node_modules可能不是他们想到的 - 您提出了很好的建议。我不希望www-data能够在系统bin目录中执行所有脚本。 - Emil Carpenter
你似乎把事情搞混了。首先,find命令在当前目录下运行,而不是“整个系统上”。与您提议的chmod相同。此外,我的建议命令与www-data用户无关。它只更改文件权限,就像您的普通chmod一样,而不是用户。您和我解决方案之间唯一的区别是,我的解决方案仅更改bin目录中的文件,而您则更改所有文件。(是的,我没有在我的第一条评论中包括cd到node_modules或查找node_modules,对此我感到抱歉) - ruuter
命令在用户运行的任何地方都可以运行,最好是在 node_modules 或其父目录中。你在第二条评论中提到了 www-data 的危险,但是是的,你的命令与 www-data 没有任何关系。是的,你对差异的看法是正确的,只要用户不犯错误,不会意外地在 node_modules 或其父目录之外的某个地方运行你的第一个命令,比如在根目录 / 或共享主机上的任何目录中。很好,你在第三条评论中让你的命令只在 node_modules 中运行。安全性涉及多个层面,也包括处理命令。 - Emil Carpenter
显示剩余3条评论

13

正如@savedbeau所建议的,运行以下代码可以解决这个问题:


npm rebuild

接着

npm run watch

6

试一下这个。

$ rm -rf node_modules

$ npm cache clear --force

$ npm install npm@latest -g

$ chown -R $USER ~/.npm

$ npm install 

1
这是唯一一个对我有效的。 - Aaron Harker

5

我已经找到问题所在,项目所在的存储空间是自动挂载的,但没有执行权限。

可以在 /etc/fstab 文件中添加 exec 到挂载选项中,就像这样:

auto,user,exec,utf8,uid=1000,gid=1000,rw 0 0

1
嘿@shamaseen,你能否解释一下如何做到这一点?我认为我遇到了同样的问题。我在Ubuntu 16.04 Vagrant上遇到了这个问题。 - SMPLYJR
@S.Domeng 打开 /etc/fstab 文件并像上面所示添加 exec - shamaseen

0
我也遇到了同样的问题。 以下步骤对我有帮助:
rm -rf node_modules/

npm install 

npm run prod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接