Linux usermodehelper用法-从内核执行shell脚本
这个功能对我来说是全新的- 有人能澄清一些关于usermodehelper使用的问题吗?具体来说,我对以某种方式执行shell脚本感兴趣 以下代码适用于执行的两行“char*argv”中的任意一行-Linux usermodehelper用法-从内核执行shell脚本,linux,shell,kernel,executable,Linux,Shell,Kernel,Executable,这个功能对我来说是全新的- 有人能澄清一些关于usermodehelper使用的问题吗?具体来说,我对以某种方式执行shell脚本感兴趣 以下代码适用于执行的两行“char*argv”中的任意一行- static int uhm_test( void) { //Both of these work char *argv[] = {"/usr/bin/logger", "HELP!!!!!!!!", NULL }; // char *argv[] = {"/usr/bin/touch",
static int uhm_test( void)
{
//Both of these work
char *argv[] = {"/usr/bin/logger", "HELP!!!!!!!!", NULL };
// char *argv[] = {"/usr/bin/touch", "/home/foo/test", NULL };
static char *envp[] = {
"HOME=/",
"TERM=linux",
"PATH=/sbin:/bin:/usr/sbin:/usr/bin", NULL };
printk(KERN_INFO "In uhm_test\n");
return call_usermodehelper( argv[0], argv, envp, UMH_WAIT_PROC );
}
以下两个版本都不起作用(两条argv行中的任何一条)。printk显示正在执行对uhm_test2的调用,并且shell脚本从命令行正确运行。shell脚本“/home/foo/run\u test”包含“/usr/bin/touch/home/foo/test”,从命令行调用时运行良好
文件“/home/foo/test”未在以下任一版本中创建
static int uhm_test2( void)
{
//Neither of these work. Neither generates an error as far as I can tell
//char *argv[] = {"/bin/bash", "-c", "/home/foo/run_test", NULL };
char *argv[] = {"/home/foo/run_test", NULL };
static char *envp[] = {
"HOME=/",
"TERM=linux",
"PATH=/sbin:/bin:/usr/sbin:/usr/bin", NULL };
printk(KERN_INFO "In uhm_test2 - argv[0] = %s, argv[1] = %s\n", argv[0], argv[1]);
return call_usermodehelper( argv[0], argv, envp, UMH_WAIT_PROC );
}
我已经搜索了很多次,但还没有找到任何解释为什么脚本的处理方式会不同于可执行二进制文件的方法?您是否尝试使用
execve
从用户空间调用此命令,并设置了完全相同的参数和环境?@Tsyvarev我一直(现在仍然)尝试execve,系统执行和执行。还没有成功,但我认为这是因为我自己缺乏知识。无法使用execve进行编译。sys_execve运行但挂起进程(而不是系统)。当我有了它们时,我会给出更多的细节(在原始帖子中)。哦,不。编写用户空间程序,并在其中使用execve
。从终端简单调用测试是不够的,因为它使用的环境与您在call\u usermodehelper
中使用的环境不同。是的,令人惊讶的是,这正是我大约一小时前所做的。终于明白了你的意思,试了一下,效果很好。@Tsyvarev不,我的措辞很糟糕。execvp允许我运行自己的(用户空间)C程序(通过内核中的usermodehelper调用),它可以完成我所需要的。C程序通过execvp调用其他可执行文件,但在通过execvp调用脚本时仍然失败。但是,我现在可以从C程序中看到更多信息,因此我可以继续研究调用脚本。现在,脚本被执行A)当脚本从命令行调用时,B)当C可执行文件从命令行调用时,而不是C)当C可执行文件从内核空间调用时。