Nvm: sudoers 的别名节点

创建于 2011-07-01  ·  36评论  ·  资料来源: nvm-sh/nvm

当 sudo 节点时,会发出“找不到命令”,因为在大多数系统上,出于安全原因,在 sudo 上重置了 PATH。
这使得“sudo 节点”不再起作用。

只需在 nvm.sh 脚本末尾添加以下行,即可修复它:

别名节点='$NVM_BIN/节点'
// 也可能为 npm 添加别名?

这假设用户的 .bashrc 包含以下 3 行:

. ~/.nvm/nvm.sh

在 sudo 中启用别名

别名 sudo='sudo '

root / multiuser issues

最有用的评论

~/.profile它对我有用:

alias sudo='sudo env PATH=$PATH:$NVM_BIN'

它是 vagrant 中 nvm 安装的一部分:

流浪档案

config.vm.provision :shell, path: "vagrant/nodejs.sh", privileged: false

流浪者/ nodejs.sh

sudo su vagrant -c "wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.26.1/install.sh | bash"

echo "
source /home/vagrant/.nvm/nvm.sh
alias sudo='sudo env PATH=\$PATH:\$NVM_BIN'
" >> /home/vagrant/.profile

export NVM_DIR="/home/vagrant/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"

nvm install stable
nvm alias default stable

现在我可以做sudo node|npm|pm2|whatever

所有36条评论

很巧妙的主意。 我不想将它添加到我的 nvm 存储库中,因为它有点侵入性,但对于想要自定义环境的人来说并不难。

我通常只是在运行“sudo su”或修改 root 的 .bashrc 后以 root 身份获取 nvm.sh 文件。 当我运行 sudo 时,我想要的不仅仅是节点,这样我就可以在 $NVM_BIN 文件夹中获取所有内容。

你是对的,它可能有点侵入性,可能不应该在发布中处于活动状态,但也许只是将它发布在这里或未来文档中的某个地方,以便人们可以轻松找到它。
或者也许在脚本中包含它可能会更好,但是被注释掉了,需要它的人会取消注释它 - 只是一个想法。

我花了一些时间才弄清楚这一点,所以这可能可以为其他人节省一些时间。

修改 root 的 bashrc 不适合我的情况,因为我们有多个用户的设置,每个用户都有自己的节点/nvm,并且希望在必要时允许快速运行 sudo(sudo 节点 app_name)。
在 root 的 .bashrc 中包含 nvm.sh 或 path/s 将只允许一个设置通过 sudo 运行。

这太棒了,我进行了更改,它就像一个魅力。

如果我想做类似sudo ENV1=val1 ENV2=val2 node server.js事情怎么办?

我可以用其他工具做到这一点(我记得它永远不会有问题),但是在我的 nvm 化环境中,我得到sudo: node: command not found

任何帮助将非常感激!

“nvm install”是否需要 sudo 才能无错运行?

@zakdances不,nvm 将节点安装到 nvm 存储库的 git 克隆内的本地文件夹中。 除非您的用户没有对您自己的克隆的写访问权限,否则它应该可以在没有 sudo 的情况下正常工作。 事实上,使用 sudo 可能会破坏事情,因为它以 root 用户身份创建文件。

嗯,在尝试全局安装 grunt 时偶然发现了这个。

就像@mpotra建议的那样,我还必须像这样npm别名:
alias node='$NVM_BIN/node'
alias npm='$NVM_BIN/npm'

所以这意味着默认情况下使用 nvm 时不能安装用于全局可用性的单个节点包,对吗? 我想,这应该会让相当多的用户遇到这种情况。

如何发明一种特殊的 nvm 模式,以便只有在用户明确进入该模式时才会激活别名?
当他们再次离开该模式时,别名可能会被禁用。

这似乎很常见,应该将其添加到自述文件中。

是的,在 *nix 系统上需要 sudo 是很常见的。

作为建议,您可以尝试类似于 ruby​​ 版本管理器的解决方案http://rvm.io/integration/sudo

我刚刚在 git 邮件列表中被告知你应该很少使用 sudo。 但我总是看到它。 关于它的意见太多了。

使用sudo安装节点是完全合理和常见的。 以 root 身份运行节点本身是不受欢迎的。 不幸的是nvm使这变得非常困难。

如果有人正在寻找一种在全球范围内安装 nvm 的简单方法: https :

一旦为nvm目录赋予正确的权限,就无需使用 sudo 安装节点。
例如:
创建一个名为nvm的用户组,将每个需要使用 nvm 的用户添加到该组并将您的 nvm 目录的权限更改为组可写: chmod 2775 /usr/local/nvm (第一个数字(2)是setgid位,解释here ,确保在这个目录中执行的组保持不变)

+1 为@treehau5提出的nvmsudo解决方案

+1 为@koenpunt点组访问。

使用 sudo 安装 node 是完全合理的

我不确定我是否同意“合理”……更像是“地方病”。

和常见的。

对此,我同意。

但我总是看到它。 关于它的意见太多了。

我不同意它的用法; 但是,每个人都有自己的。

我的用例是能够轻松升级我的系统范围内的服务,在 nodejs 上运行,在补丁/安全版本的情况下,以及那些与使用nvm Travis-CI 兼容的服务。 为此,除了使用sudo之外,还有什么方法可以将nvm安装到全局PATH中? 或者有更好的工具吗?

我想真正的问题是 node.js 从大多数操作系统供应商那里获得的普遍蹩脚的包管理器支持。

我想真正的问题是 node.js 从大多数操作系统供应商那里获得的普遍蹩脚的包管理器支持。

好吧,公平地说,所有其他语言都必须处理那些同样糟糕的操作系统包管理器。 其实有的还挺好的,就是维护的问题。 有时你想要 0.11.11,但祝你好运找到一个可以(或将)跟上这个速度的操作系统打包维护者。

为此,除了使用 sudo 之外,还有什么方法可以将 nvm 安装到全局 PATH 中? 或者有更好的工具吗?

也许其他人可以插话……我没有很好的答案,因为我不倾向于这种特定的工作流程。

今天,我使用 docker(即 LXC 容器)……在 docker 出现之前,我会使用 VM。

使用 docker,nvm 并不是真正需要的。 您只需使用您关心的确切版本启动一个容器。

我倾向于在我的开发机器上使用 nvm,通过自制软件安装并将节点安装到我的本地用户目录中; 从不需要 sudo 的地方。

~/.profile它对我有用:

alias sudo='sudo env PATH=$PATH:$NVM_BIN'

它是 vagrant 中 nvm 安装的一部分:

流浪档案

config.vm.provision :shell, path: "vagrant/nodejs.sh", privileged: false

流浪者/ nodejs.sh

sudo su vagrant -c "wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.26.1/install.sh | bash"

echo "
source /home/vagrant/.nvm/nvm.sh
alias sudo='sudo env PATH=\$PATH:\$NVM_BIN'
" >> /home/vagrant/.profile

export NVM_DIR="/home/vagrant/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"

nvm install stable
nvm alias default stable

现在我可以做sudo node|npm|pm2|whatever

谢谢@gagle ,这是我找到的最佳解决方案。

我喜欢Digital Ocean给出的针对这个 stackoverflow的解决方案。 它解决了 sudo 问题,并且可以在需要时轻松更新根版本。

你不应该需要sudo任何东西。 如果您需要让节点侦听特权端口,请使用 authbind。

@gagle由于某种原因 NVM_BIN 在 ~/.profile 正在执行时没有设置。
编辑:通过移动固定

alias sudo='sudo env PATH=$PATH:$NVM_BIN'

nvm.sh 执行后到 ~/.bashrc

我相信 nvm 的全部意义在于使切换/使用节点变得容易,并避免为某些用户手动编辑某些文件和在满月期间逆时针行走的这些恶作剧。

正确或错误地很多节点工具/模块需要在全球范围内安装。

我们可以在安装 nvm 时有一个全局安装选项吗?
如果您担心操作系统的风格,您可以为每个操作系统/风格创建一个包含特定模块的文件夹。 有些可能不受支持。 没关系,人们可以贡献模块。

@mightypenguin nvm不应跨用户帐户使用。 每个用户都应该有自己的$NVM_DIR

因此,即使我编写了代码以使这一切成为可能,您也不会考虑取消我的更改吗?

@mightypenguin我很乐意看一看它,但我很怀疑它是否完全可行,因为 nvm 管理的节点目录中存在所有权限问题。

@tetreault你永远不应该将sudo用于特权端口; https://thomashunter.name/blog/using-authbind-with-node-js/是一种更安全的方法。

我相信npm run以无人身份运行,并且它无法sudo (为了安全)。

在基于 debian(或 ubuntu)的系统上,除了像@mpotra所说的那样设置别名外,您可能需要运行
sudo ln -s "$(which node)" /usr/local/bin/node使 npm 在 sudo 模式下工作

authbind 很棒,但是像原始套接字这样的东西呢? 我使用 net-ping 拉入只能作为 root 工作的原始套接字。 一些 libcap 的东西可以绕过“haxor 狡猾的数据包注入”用户模式块吗?

“只能以 root 身份工作”似乎是不使用某个软件的原因,tbh。

男人 7 生

因此,似乎为节点可执行文件设置 CAP_NET_RAW 只会打开一个足够大的孔,以便原始套接字在没有 root 的情况下运行,也许,但我持怀疑态度(未经测试,因为我以 root 身份运行它,因为我不是偏执狂)。

sudo setcap cap_net_raw+eip $(eval readlink -f `which node`)

“微软”也是不使用某个软件的一个原因,但很多可怜的人使用它,因为他们别无选择。 我很想修复其他人的软件,但有时您只需要 root 即可解决头疼问题并使其立即运行并确保在所有情况下都能正常工作。

如果以 root 身份运行更简单并且我接受这样做的后果,那么它应该是微不足道的。 甚至可能是一种支持删除 privs 的方法(就像 Apache httpd 那样?)所以整个过程不必以 root 身份运行(只是套接字线程)。 无论如何,这个小程序实际上不能被利用/从未听说过 Node.js 的特权升级问题/为什么在显然没有必要的情况下如此偏执? 最佳实践不是唯一的实践,它从来都不是适用于每个用例的最佳实践……例如,在 yippee 获得 root 权限但无法执行任何操作的 VM 上,gghacker bruh。

无论如何,npm 的工作方式超出了本 repo 的范围。

如果您希望nvm为 root 用户工作,那么该 root 用户需要自己安装nvm

在基于 debian(或 ubuntu)的系统上,除了像@mpotra所说的那样设置别名外,您可能需要运行
sudo ln -s "$(which node)" /usr/local/bin/node使 npm 在 sudo 模式下工作

sudo ln -s "$(which node)" /usr/local/bin/node
输出
ln: failed to create symbolic link '/usr/local/bin/node': File exists

我想运行一些旧版的 sdk。 这个sdk应该使用旧节点 v6。
以下命令对我不起作用:

sudo somesdk

Command 'node' not found

按照建议,我切换到 sudo:

sudo -s

然后我为当前用户读取 nvm.sh(例如someuser ):

source /home/someuser/.nvm/nvm.sh

在此之后,我有nvm用于 sudo(对于当前会话,这对我来说已经足够了)

root<strong i="21">@domain</strong>:~# nvm

Node Version Manager (v0.35.2)

这是您可能想要用来临时运行命令的临时解决方法:

$ sudo PATH=$PATH bash -c "node ..."

例如:

$ sudo PATH=$PATH bash -c "which node npm pnpm"
/home/alex/.nvm/versions/node/v13.10.1/bin/node
/home/alex/.nvm/versions/node/v13.10.1/bin/npm
/home/alex/.nvm/versions/node/v13.10.1/bin/pnpm
此页面是否有帮助?
0 / 5 - 0 等级