Firefox addon 使用FirefoxSDK运行linux命令

Firefox addon 使用FirefoxSDK运行linux命令,firefox-addon,firefox-addon-sdk,Firefox Addon,Firefox Addon Sdk,我想用FirefoxSDK运行Linux命令 我已经搜索过了,但所有的示例都描述了如何在windows中运行可执行文件。我需要运行一个Linux命令。只需这样使用: 常数{Cc,Ci}=requirechrome; //为可执行文件创建一个NSI文件 var file=Cc[@mozilla.org/file/local;1].createInstanceCi.nsFile; file.initWithPath/usr/bin/du; //创建一个进程 var process=Cc[@mozil

我想用FirefoxSDK运行Linux命令

我已经搜索过了,但所有的示例都描述了如何在windows中运行可执行文件。我需要运行一个Linux命令。

只需这样使用:

常数{Cc,Ci}=requirechrome; //为可执行文件创建一个NSI文件 var file=Cc[@mozilla.org/file/local;1].createInstanceCi.nsFile; file.initWithPath/usr/bin/du; //创建一个进程 var process=Cc[@mozilla.org/process/util;1].createInstanceCi.nsIProcess; process.init文件; //运行进程。 //若第一个参数为true,调用线程将被阻塞,直到 //被调用的进程终止。 //第二个和第三个参数用于传递命令行参数 //这是一个过程。 var args=[-h]; process.runfalse,args,args.length; 只需这样使用:

常数{Cc,Ci}=requirechrome; //为可执行文件创建一个NSI文件 var file=Cc[@mozilla.org/file/local;1].createInstanceCi.nsFile; file.initWithPath/usr/bin/du; //创建一个进程 var process=Cc[@mozilla.org/process/util;1].createInstanceCi.nsIProcess; process.init文件; //运行进程。 //若第一个参数为true,调用线程将被阻塞,直到 //被调用的进程终止。 //第二个和第三个参数用于传递命令行参数 //这是一个过程。 var args=[-h]; process.runfalse,args,args.length;
本主题适用于以下方面:

NSI过程 @matagus是对的,您可以使用NSIProces启动文件

在其中使用js ctypes的子流程 您可以使用subrpcoess.jsm:

js ctypes popen 您还可以使用jsctypes和popen:

阅读要点的自述

在下面的例子中,我正在做readlink。保持osfile.jsm导入,因为它用于检查mac还是linux

Cu.import('resource://gre/modules/ctypes.jsm');
Cu.import('resource://gre/modules/osfile.jsm');

function doit() {
    try {
        if (OS.Constants.Sys.Name == 'Darwin') {
            var _libc = ctypes.open('libc.dylib');
        } else if (OS.Constants.Sys.Name == 'Linux') {
            var _libc = ctypes.open('libc.so.6');
        }
    } catch (e) {
        try {
            var libName = ctypes.libraryName('libc');
        } catch (e) {
            console.error('Integration: Could not get libc name; not activating');
            return;
        }

        try {
            _libc = ctypes.open(libName);
        } catch (e) {
            console.error('Integration: Could not open ' + libName + '; not activating');
            return;
        }
    }

    var popen = _libc.declare('popen', ctypes.default_abi, ctypes.voidptr_t, // Return int
        ctypes.char.ptr, // Param1 const char *command
        ctypes.char.ptr // Param1 const char *command
    );

    var fread = _libc.declare('fread', ctypes.default_abi, ctypes.size_t, // Return int
        ctypes.voidptr_t,
        ctypes.size_t,
        ctypes.size_t,
        ctypes.voidptr_t
    );

    var pclose = _libc.declare('pclose', ctypes.default_abi, ctypes.int, // Return int
        ctypes.voidptr_t
    );

    ////////////////////////
    ////END DECLARATIONS
    ////////////////////////

    //var rez = popen('readlink -q "/home/noi/.mozilla/firefox/q0rlb7ap.Unnamed Profile 1/.parentlock"', 'r')
    //console.log('rez:', rez.toString())
    var lockFilePath = OS.Path.join(OS.Constants.Path.profileDir, 'lock');
  //var lockFilePath = '/home/noi/.mozilla/firefox/q0rlb7ap.Unnamed Profile 1/lock';
  //var lockFilePath = '/home/noi/.mozilla/firefox/q0rlb7ap.Unnamed Profile 1/.parentlock';
  console.log(lockFilePath);

    /*
  var promise = OS.File.read(OS.Path.join(OS.Constants.Path.profileDir, '.parentlock'), {encoding:'utf-8'});
  promise.then(
   function(aVal) {
     console.log('read val:', aVal);
   },
    function(aReason) {
    console.log('failed for aReason:', aReason, aReason.becauseNoSuchFile);
    }
  )

    //on linux it reads .parentlock, and if you try to read lock it returns aReason.becauseNoSuchFile == true
    */

  console.time('popen');
    var file = popen('readlink -q "' + lockFilePath + '"', 'r')
  console.log(file.toString())
    var bufferSize = 1000;
    var buffer = ctypes.char.array(bufferSize)('');
    var size = bufferSize;
    var outList = [];
    while (size == bufferSize) {
        size = fread(buffer, 1, bufferSize, file);
        outList.push(buffer.readString().substring(0, size));
    }
    pclose(file);
    console.timeEnd('popen')
    console.log(outList.join(''));


}

doit();

本主题适用于以下方面:

NSI过程 @matagus是对的,您可以使用NSIProces启动文件

在其中使用js ctypes的子流程 您可以使用subrpcoess.jsm:

js ctypes popen 您还可以使用jsctypes和popen:

阅读要点的自述

在下面的例子中,我正在做readlink。保持osfile.jsm导入,因为它用于检查mac还是linux

Cu.import('resource://gre/modules/ctypes.jsm');
Cu.import('resource://gre/modules/osfile.jsm');

function doit() {
    try {
        if (OS.Constants.Sys.Name == 'Darwin') {
            var _libc = ctypes.open('libc.dylib');
        } else if (OS.Constants.Sys.Name == 'Linux') {
            var _libc = ctypes.open('libc.so.6');
        }
    } catch (e) {
        try {
            var libName = ctypes.libraryName('libc');
        } catch (e) {
            console.error('Integration: Could not get libc name; not activating');
            return;
        }

        try {
            _libc = ctypes.open(libName);
        } catch (e) {
            console.error('Integration: Could not open ' + libName + '; not activating');
            return;
        }
    }

    var popen = _libc.declare('popen', ctypes.default_abi, ctypes.voidptr_t, // Return int
        ctypes.char.ptr, // Param1 const char *command
        ctypes.char.ptr // Param1 const char *command
    );

    var fread = _libc.declare('fread', ctypes.default_abi, ctypes.size_t, // Return int
        ctypes.voidptr_t,
        ctypes.size_t,
        ctypes.size_t,
        ctypes.voidptr_t
    );

    var pclose = _libc.declare('pclose', ctypes.default_abi, ctypes.int, // Return int
        ctypes.voidptr_t
    );

    ////////////////////////
    ////END DECLARATIONS
    ////////////////////////

    //var rez = popen('readlink -q "/home/noi/.mozilla/firefox/q0rlb7ap.Unnamed Profile 1/.parentlock"', 'r')
    //console.log('rez:', rez.toString())
    var lockFilePath = OS.Path.join(OS.Constants.Path.profileDir, 'lock');
  //var lockFilePath = '/home/noi/.mozilla/firefox/q0rlb7ap.Unnamed Profile 1/lock';
  //var lockFilePath = '/home/noi/.mozilla/firefox/q0rlb7ap.Unnamed Profile 1/.parentlock';
  console.log(lockFilePath);

    /*
  var promise = OS.File.read(OS.Path.join(OS.Constants.Path.profileDir, '.parentlock'), {encoding:'utf-8'});
  promise.then(
   function(aVal) {
     console.log('read val:', aVal);
   },
    function(aReason) {
    console.log('failed for aReason:', aReason, aReason.becauseNoSuchFile);
    }
  )

    //on linux it reads .parentlock, and if you try to read lock it returns aReason.becauseNoSuchFile == true
    */

  console.time('popen');
    var file = popen('readlink -q "' + lockFilePath + '"', 'r')
  console.log(file.toString())
    var bufferSize = 1000;
    var buffer = ctypes.char.array(bufferSize)('');
    var size = bufferSize;
    var outList = [];
    while (size == bufferSize) {
        size = fread(buffer, 1, bufferSize, file);
        outList.push(buffer.readString().substring(0, size));
    }
    pclose(file);
    console.timeEnd('popen')
    console.log(outList.join(''));


}

doit();

Add-On SDK现在有自己的方法来创建在所有平台上工作的子进程:

以下是一个例子:

var child_process=requiresdk/system/child_process; var ls=child_process.spawn'/bin/ls',['-lh','/usr']; ls.stdout.on'data',函数数据{ console.log'stdout:'+数据; }; ls.stderr.on'data',函数数据{ console.log'stderr:'+数据; }; ls.在“关闭”时,函数代码{ console.log“子进程退出,代码为”+代码; };
Add-On SDK现在有自己的方法来创建在所有平台上工作的子进程:

以下是一个例子:

var child_process=requiresdk/system/child_process; var ls=child_process.spawn'/bin/ls',['-lh','/usr']; ls.stdout.on'data',函数数据{ console.log'stdout:'+数据; }; ls.stderr.on'data',函数数据{ console.log'stderr:'+数据; }; ls.在“关闭”时,函数代码{ console.log“子进程退出,代码为”+代码; };
只是一个建议:你应该说插件SDK而不是firefox SDK感谢你的建议;只是一个建议:你应该说插件SDK而不是firefox SDK感谢你的建议;谢谢这很有效。现在我想打开一个终端窗口,然后运行一个命令。我该怎么做呢?请发另一个问题来解释清楚谢谢。这很有效。现在我想打开一个终端窗口,然后运行一个命令。我该怎么做?请发布另一个问题来解释清楚