WSL2上需要运行脚本的NPM包权限被拒绝

3
我的wsl2(Ubuntu 20.04)已设置为使用root用户。
我能够安装任何不需要运行脚本的node包。如果需要运行脚本,例如node-sass包,则会出现错误:
sh: 1: node: Permission denied

同样的情况也会发生在npx命令中,例如:
# npx npkill
/tmp/npx-a435a586.sh: 1: npkill: Permission denied

这里有许多帖子都说明了解决方法是设置以下数值:

npm config set user 0
npm config set unsafe-perm true

但这并没有改变行为,仍然出现相同的错误。我已尝试删除节点模块,并使用--unsafe-perm标志,但仍然出现同样的错误。我还尝试在更改节点设置后重新启动。
我的版本:
- node: v16.13.2 - npm: 8.15.0 - wsl: Ubuntu-20.04
还有其他什么可以尝试的吗?

“设置为使用root用户” - 通过/etc/wsl.conf,我假设(但想要确认)? - NotTheDr01ds
该文件不存在。老实说,我不记得我是如何将root设置为默认用户的,我想那可能是在PowerShell中执行的一个命令。 - Guerrilla
别担心 - 如果你是在PowerShell中操作的,也许可以尝试 ubuntu.exe config --default-user root 命令?如果是这样的话,那最终效果应该与 /etc/wsl.conf 相同。 - NotTheDr01ds
1个回答

2

我知道仅仅告诉你我的安装成功并没有太大帮助,但是希望通过分享我的安装过程和与你的安装进行对比,我们可以找出可能导致你出现问题的差异。

在WSL2上进行Ubuntu 20.04(发行版命名为“Ubuntu”)的全新安装:

sudo apt update && sudo apt upgrade -y

# Since you mention that you have set your user to be root:
sudo sh -c 'echo "[user]\ndefault=root" > /etc/wsl.conf'

wsl.exe -l -v
# Confirm your distribution name for the following command:
wsl.exe --terminate Ubuntu

重新启动WSL,用户现在是root:

# Use n version manager -- Just my personal preference:
curl -L https://raw.githubusercontent.com/tj/n/master/bin/n -o n
bash n 16.13.2
npm install -g npm@8.15.0

npm install -g npkill
npx npkill

它按照预期工作。


如果您想在“干净”的发行版上测试它(而不会干扰您现有的发行版,然后您可以进行比较),可以执行以下操作。首先,在管理PowerShell中:

Get-ChildItem -Recurse 'C:\Program Files\WindowsApps\*' |
Where-Object {$_.Name -eq 'install.tar.gz' } |
% { $_.FullName }

将分发路径复制到剪贴板以备后用。它应该类似于:

C:\Program Files\WindowsApps\CanonicalGroupLimited.UbuntuonWindows_2004.2022.1.0_x64__79rhkp1fndgsc\install.tar.gz

回到“普通用户”PowerShell会话:

# Adjust paths/names as desired
mkdir $env:userprofile/WSL/instances/TestUbuntu
wsl --import TestUbuntu $env:userprofile/WSL/instances/TestUbuntu "<path_copied_above_in_quotes>" --version 2
wsl ~ -d TestUbuntu

2
将此标记为答案,因为这些步骤帮助我找到了实际原因。项目文件夹映射到docker,因此所有文件都由“www-data”拥有。通常使用root会胜过www-data,但出于某种原因,这是问题所在。我将项目所有者设置为root,然后它就可以工作了。有点烦人,因为需要额外的步骤,但现在它可以工作了。 - Guerrilla

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