Я пишу небольшой RESTFul API в Node с Express.js, который, помимо прочего, предоставит мне информацию о точках доступа Wi-Fi, включая все имена SSID, уровень сигнала, частоты, каналы и т. Д.
Я использую пакет узла https://www.npmjs.com/package/wireless-tools для этого.
API работает нормально, если я запускаю программу узла от имени пользователя root или sudo, но это, очевидно, не идеально и, скорее всего, не будет разрешено на любой платформе, которую я должен развернуть. В этом приложении также есть другие вызовы API, которые, безусловно, должны НЕ выполняться как 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
, без необходимости запускать весь API как root
или запускать его с sudo
Системы, на которых это должно работать:
RaspberryPI, Debian и Ubuntu 16.04 или 18.04 и, возможно, другие версии Linux в будущем - все будут поддерживать sudo
, если это является частью решения.
Я проверил его вручную на всех вышеперечисленных системах, работающих под именем sudo
, и все в порядке.