call_usermodehelper无法正常工作

时间:2017-10-02 11:00:03

标签: c linux-kernel kernel-module

我在内核模块上工作,用来从内核空间用python写一个文件 首先尝试:我从内核编写运行python文件的代码:

int ret = -1;    
char path[] = "/bin/bash";
char *argv[] = {path, "-c", "python", "/home/samba/getter.py",NULL};
char *envp[] = {"HOME=/", "TERM=linux", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL};

printk("call_usermodehelper module is starting..!\n");
ret = call_usermodehelper(path, argv, envp, UMH_WAIT_PROC);
printk("ret=%d\n", ret);

这是python代码:

# getter.py
import urllib2
import json

url = "http://172.16.189.1:8000/random/"
response = urllib2.urlopen(url)
input_file = open("/home/samba/something.txt", "w")
input_file.write(json.loads(response.read())["hash"])
input_file.close()

(上面的python脚本工作正常。当我从用户空间运行它时,它会创建something.txt文件并成功保存输出。)

在模块上加载后,文件something.txt无法创建,当我运行dmesg命令时,我看到了这一点:

[16184.383282] call_usermodehelper module is starting..!
[16184.384389] ret=0

第二次尝试:我将python命令更改为touch但仍然无法创建文件,但呼叫触摸后的ret值为非零!

int ret = -1;    
char path[] = "/bin/bash";
char *argv[] = {path, "-c", "touch", "/home/samba/something.txt",NULL};
char *envp[] = {"HOME=/", "TERM=linux", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL};

printk("call_usermodehelper module is starting..!\n");
ret = call_usermodehelper(path, argv, envp, UMH_WAIT_PROC);
printk("ret=%d\n", ret);

当我在加载模块后运行dmeseg命令时,我看到输出如下:

[16211.309975] call_usermodehelper module is starting..!
[16211.311053] ret=256

但未创建文件/home/samba/something.txt。我做错了什么?

更新:感谢其中一个答案,通过将UMH_WAIT_PROC更改为UMH_WAIT_EXECtouch命令(第二种情况)现在可以正确创建文件,但是python代码仍然无效。

1 个答案:

答案 0 :(得分:1)

这个设计首先看起来有缺陷。从内核中产生的东西应该只在非常特殊的情况下才能完成。一个明显不太糟糕的解决方案将使用常规用户空间进程等待例如netlink事件。不是用usermodehelper生成的,而是像典型的守护进程一样。