dc-*_*-p8 6 command-line sudo nodejs
我有一个与 nodejs 相关的问题。我在这里有 nodejs 二进制文件:~/node-v8.5.0-linux-x64/我有一个我使用创建的软链接:ln -s node-v8.5.0-linux-x64/ node。
在我的.bashrc,我有这样的:export PATH=$PATH:$HOME/node/bin。
node并且npm在我正常登录时运行良好。由于它们都安装在我家中,因此我无需以 root 用户身份登录即可全局安装软件包。
但我想尝试;所以,我跑了:
sudo npm install -g angular-cli
sudo node app.js
Run Code Online (Sandbox Code Playgroud)
它没有用。
sudo: node : command not found
Run Code Online (Sandbox Code Playgroud)
我以为$PATH我使用时可能会发生变化,sudo但后来我使用sudo echo $PATH以下方法检查了它:
/home/dc/bin:/home/dc/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/dc/node/bin
Run Code Online (Sandbox Code Playgroud)
当我输入node命令时,shell 应该知道去哪里,但它似乎没有。我也试过-H,-i和-u选项,sudo但没有任何帮助。
有人可以解释一下这里发生了什么吗?
Byt*_*der 11
不,sudo它不是保护你的$PATH环境变量出于安全原因。相反,它被替换为secure_path定义的 in /etc/sudoers,您不应更改它。
$ sudo grep secure_path /etc/sudoers
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
Run Code Online (Sandbox Code Playgroud)
您认为已验证$PATH变量与您的命令保持相同
sudo echo $PATH
Run Code Online (Sandbox Code Playgroud)
但实际上 Bash 在开始执行任何(这里是sudo)命令之前扩展了变量,这意味着上面的行显示了您自己的$PATH值。要获得一个 as sudo,请使用 eg
sudo bash -c 'echo $PATH'
Run Code Online (Sandbox Code Playgroud)
您可以做的是例如使用进程替换来解析要在您自己用户的 shell 中运行(node或npm)的命令which:
sudo "$(which npm)" install -g angular-cli
sudo "$(which node)" app.js
Run Code Online (Sandbox Code Playgroud)
这首先运行which npm或which node作为您的用户运行,它返回属于指定命令的可执行文件的绝对路径。然后该输出字面上插入到您的sudo命令中,因此sudo实际上相信它是使用如下所示的绝对路径执行的,无需在 中查找任何内容$PATH:
sudo /home/dc/node/bin/npm install -g angular-cli
sudo /home/dc/node/bin/node app.js
Run Code Online (Sandbox Code Playgroud)