我正在使用Express.js在Node中编写一个小型RESTFul API,除其他外,它将为我提供wifi接入点详细信息,包括所有SSID名称,信号强度,频率,频道等。
我使用https://www.npmjs.com/package/wireless-tools节点包来完成此任务。
如果我以root或sudo运行节点程序,API工作正常,但这显然不太理想,并且可能不允许在我必须部署它的任何平台上。在这个应用程序中还有其他API调用,最应该 NOT 以root / sudo身份执行,所以我需要找到一种方法来提升API的这个特定部分的权限。
完成此操作的代码段如下所示
router.get('/ssid',auth.verifyAccess, function(req,res,next)
{
var iwlist = require('wireless-tools/iwlist');
iwlist.scan( {iface:'wlan0', show_hidden : true }, function(err, networks) {
if(err)
{
logger.error(self.type + ":" + arguments.callee.name, __line, `${err}`);
}
else
{
logger.debug(self.type + ":" + arguments.callee.name, __line, `iwlist scan initiated. Results:${networks}`);
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify(networks));
}
});
这给出了输出simalar:
[
{
"address": "e4:8d:8c:bc:f3:05",
"channel": 10,
"frequency": 2.457,
"mode": "master",
"quality": 70,
"signal": -35,
"ssid": "techedemic-Wifi-Dev",
"security": "wpa2"
},
{
"address": "10:08:b1:09:5b:1b",
"channel": 1,
"frequency": 2.412,
"mode": "master",
"quality": 64,
"signal": -46,
"ssid": "techedemic-WiFi-Prod",
"security": "wpa2"
},
{.....
假设应用程序最终将作为“myuser”用户运行,我如何授予应用程序运行所需命令的权限,例如: iwlist wlan0 scan
,无需以root
运行整个API或以sudo
这应该起作用的系统:
RaspberryPI,Debian和Ubuntu 16.04或18.04以及将来可能还有其他Linux风格 - 如果这是解决方案的一部分,它们都将支持sudo
。
我已经使用sudo
用户运行上述所有系统进行了手动测试,一切顺利。