cocoajin 发表于 2020-12-30 10:21:14

iOS使用posix_spawn执行dpkg安装deb命令不成功问题

各位好,
   在看了飘大的书以后,了解到可以使用 posix_spawn执行系统命令;
于是,我想到了自动下载deb,并自动安装的的思路;在app里面下载deb包,然后发消息给守护进程,执行dpkg命令安装。

首先在ssh连接到手机上以后,dpkg -i xxx.deb 可以安装正常,正常没有问题;

问题就出在用 posi_spawn下发执行安装时不成功,大家有什么想法,是posix_spawn执行时的权限问题吗;

#include <spawn.h>

static int spawn(const char* executable, ...) {
    int   ret;
    pid_t   pid;
    va_list args;
    va_start(args, executable);
    setuid(0);
    ret = posix_spawn(&pid, executable, NULL, NULL, (char* const *)args, NULL);
    if (ret == 0) waitpid(pid, NULL, 0);
    return ret;
}调用:
spawn("/usr/bin/dpkg", "/usr/bin/dpkg", "-i", "xxx.deb", NULL);

执行错误:

dpkg: error: PATH is not set

飘云 发表于 2020-12-30 12:28:26

最后一个参数别忽略啊~~

#include <spawn.h>

static int spawn(const char* executable, ...) {
    int   ret;
    pid_t   pid;
    va_list args;
    va_start(args, executable);
    setuid(0);
    const char *path[] = {"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", NULL};
    ret = posix_spawn(&pid, executable, NULL, NULL, (char**)args, (char**)path);
    if (ret == 0) waitpid(pid, NULL, 0);
    return ret;
}

int main(int argc, char const *argv[])
{
      spawn("/usr/bin/dpkg", "/usr/bin/dpkg", "-i", "chinapyg.deb", NULL);
      return 0;
}

cocoajin 发表于 2020-12-30 14:04:00

飘云 发表于 2020-12-30 12:28
最后一个参数别忽略啊~~

#include


非常感谢飘哥,完美解决问题!{:loveliness:}
页: [1]
查看完整版本: iOS使用posix_spawn执行dpkg安装deb命令不成功问题