Awesome Open Source
Awesome Open Source

Electron subprocess with administrative privileges

Run a subprocess with administrative privileges, prompting the user with a graphical OS dialog if necessary. Useful for background subprocesse which run native Electron apps that need sudo.

  • Windows, uses elevate utility with native User Account Control (UAC) prompt (no PowerShell required)
  • OS X, uses bundled applet (inspired by Joran Dirk Greef)
  • Linux, uses system pkexec or gksudo (system or bundled).

If you don't trust binaries bundled in npm package you can manually build tools and use them instead.


  • Supports spawn and exec subprocess behavior
  • Supports applications packaged as asar archive
  • Separate password prompt for each call (use sh or bat script for single prompt)
  • No external dependencies, does not depend on OS versions


npm install electron-sudo


Note: Your command should not start with the sudo prefix.

Version 4.0.*

import Sudoer from 'electron-sudo';

let options = {name: 'electron sudo application'},
    sudoer = new Sudoer(options);

/* Spawn subprocess behavior */
let cp = await sudoer.spawn(
  'echo', ['$PARAM'], {env: {PARAM: 'VALUE'}}
cp.on('close', () => {
    cp.output.stdout (Buffer)
    cp.output.stderr (Buffer)

/* Exec subprocess behavior */
let result = await sudoer.exec(
  'echo $PARAM', {env: {PARAM: 'VALUE'}}
/* result is Buffer with mixed (both stdout and stderr) output */

/* Usage with Vanila JS */

var Sudoer = require('electron-sudo').default;
var sudoer = new Sudoer(options);
sudoer.spawn('echo', ['$PARAM'], {env: {PARAM: 'VALUE'}}).then(function (cp) {
    cp.output.stdout (Buffer)
    cp.output.stderr (Buffer)

Version 3.0.* (deprecated)

var sudo = require('electron-sudo');
var options = {
  name: 'Your application name',
  icns: '/path/to/icns/file' // (optional, only for MacOS),
  process: {
    options: {
      // Can use custom environment variables for your privileged subprocess
      env: {'VAR': 'VALUE'}
      // ... and all other subprocess options described here
    on: function(ps) {
      ps.stdout.on('data', function(data) {});
      setTimeout(function() {
      }.bind(ps), 50000);
sudo.exec('echo hello', options, function(error) {});


npm i && npm test

Usage with Webpack

Webpack config should contain __dirname equals true for work properly

let nodeModules = fs.readdirSync('./node_modules')
    .filter((module) => {
        return module !== '.bin';
    .reduce((prev, module) => {
        return Object.assign(prev, {[module]: 'commonjs ' + module});
    }, {});

export default {
    target: 'electron',
    node: {
        /* */
        __dirname: true
    externals: nodeModules

Get A Weekly Email With Trending Projects For These Topics
No Spam. Unsubscribe easily at any time.
javascript (69,796
electron (939
prompt (75
sudo (22