我可以在安装了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以来,我一定会丢失一些东西,否则事情已经发生了变化。
答案 0 :(得分:2)
检查启动了可执行文件的分区是否未安装nosuid
。
getcap
不能帮助进行故障排除,因为它将显示在文件系统上设置的属性,而不是运行时可用的实际功能。
您可以在/proc/PID/status
中查看运行时功能。
它们应该看起来像
CapPrm: 0000000000000400
CapEff: 0000000000000400
CapBnd: 0000003fffffffff
在我的nosuid
分区上,他们就像这样。
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 0000003fffffffff
希望有帮助。 与朋友咨询后,我才能够找到答案:)
答案 1 :(得分:0)
@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