Emita o processo de execução de um módulo do kernel Linux

3

Estou tentando executar um processo localizado em /usr/bin de um módulo do kernel, e estou usando call_usermodehelper() . Dentro do meu módulo, tenho:

int rc;

char *argv[] = {"/usr/bin/myProgram", NULL};
char *envp[] = {"HOME=/", NULL};

rc = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);

printk("RC is: %i \n", rc);

Exemplo de programa do que tenho em /usr/bin :

#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main(){

    char *arg[] = {"firefox", "sample.html", NULL};
    execvp(arg[0], arg);
    return 0;
}

Depois de ver o syslog, posso ver que o RC é 0, o que indica que call_usermodehelper foi um sucesso, mas o programa nunca foi executado (ele deveria ter aberto um navegador Firefox). Se eu atravessar para /usr/bin e executar o processo manualmente, ele funcionará bem e seu comportamento esperado. Não tenho certeza do porque isso está acontecendo e não conseguimos encontrar muitas ideias on-line?

Encontrei este post antigo: link em que o usuário tinha um problema semelhante e chamadas reivindicadas como printf() e system() não funcionam, e ele consertou usando exec() , que eu tenho feito originalmente de qualquer forma '(ele também usou o arquivo objeto de seu programa, que eu tentei como bem):

int rc;

char *argv[] = {"/usr/bin/myProgram.o", NULL};
char *envp[] = {"HOME=/", NULL};

rc = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);

printk("RC is: %i \n", rc);

SOLUÇÃO

Depois de brincar com ele e ver alguns comentários sobre as variáveis de ambiente necessárias para declarar explicitamente desde que estamos no kernel, mudei meu módulo do kernel para parecer com isso e o navegador agora está sendo aberto com call_usermodehelper()

int rc;

static char *envp[] = {
    "SHELL=/bin/bash",
    "HOME=/home/admin",
    "USER=admin",
    "PATH=/home/admin/bin:/home/admin/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/admin",
    "DISPLAY=:0",
    "PWD=/home/admin", 
    NULL};

char *argv[] = {"/home/admin/mySample", NULL};

rc = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);
printk("RC is: %i \n", rc);

O programa de amostra agora se parece com:

#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main()
{
    char *arg[] = {"firefox", "/home/admin/sample.html", NULL};
    execvp(arg[0], arg);
    return 0;
}
    
por M.G 04.04.2017 / 21:58

1 resposta

2

Depois de brincar com ele e ver alguns comentários sobre as variáveis de ambiente necessárias para declarar explicitamente desde que estamos no kernel, mudei meu módulo do kernel para parecer com isso e o navegador agora está sendo aberto com call_usermodehelper()

int rc;

static char *envp[] = {
    "SHELL=/bin/bash",
    "HOME=/home/admin",
    "USER=admin",
    "PATH=/home/admin/bin:/home/admin/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/admin",
    "DISPLAY=:0",
    "PWD=/home/admin", 
    NULL};

char *argv[] = {"/home/admin/mySample", NULL};

rc = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);
printk("RC is: %i \n", rc);

O programa de amostra agora se parece com:

#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main()
{
    char *arg[] = {"firefox", "/home/admin/sample.html", NULL};
    execvp(arg[0], arg);
    return 0;
}
    
por 05.04.2017 / 00:22