我可以在nvm安装的节点中使用任何高于1023的PORT
和server.listen(PORT)
。如何使用非特权用户的系统端口(例如,低于1024)?
在我们的Ubuntu 16.04服务器上,我曾经这样做过:
sudo setcap CAP_NET_BIND_SERVICE=+eip `readlink -f \`which node\``
但是,我们已升级到Ubuntu 18.04,它似乎不再起作用了。我看到以下错误:
Error listen EACCES 0.0.0.0:925
所有低于1024的端口都会发生这种情况,所以这不仅仅是端口已经在使用的一次性情况。
为什么这不起作用(不再)?我必须遗漏一些东西,或者自Ubuntu 18.04以来事情发生了变化。
检查启动可执行文件的分区是否未安装nosuid
。
getcap
将无法帮助进行故障排除,因为它将显示文件系统上设置的属性,而不是运行时可用的实际功能。
您可以在/proc/PID/status
中检查运行时功能。
他们应该看起来像
CapPrm: 0000000000000400
CapEff: 0000000000000400
CapBnd: 0000003fffffffff
在我的nosuid
分区上,他们是这样的。
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 0000003fffffffff
希望能帮助到你。在与朋友协商后,我才能找到这个:)
@ AdiRoiban的答案可能是正确的,为什么setcap
不起作用。检查安装了node
的文件系统。如果是nvm
,node
可能会安装在您的主目录中。您的主目录可能已加密。你加密的家庭可能会被安装为nosuid
。
这是我最终使用的解决方法。
首先,安装authbind
。然后在/etc/authbind/byport/
中创建您希望能够作为空文件访问的端口。授予他们对您的用户或组的读取权限。出于测试目的,您可以使用root:root
用户和777
权限。
接下来,像这样启动节点应用程序:
authbind node index.js
如果应用程序生成需要访问的node
进程(例如nodemon
),则需要使用--deep
命令行开关授予进程权限以授予子进程权限。
例如:
authbind --deep nodemon --inspect index.js