对 insmod 的 Python 子进程调用会产生未定义的符号错误,它在 std shell 中工作

对 insmod 的 Python 子进程调用会产生未定义的符号错误,它在 std shell 中工作

我需要注册一个特定的内核模块(https://github.com/504ensicsLabs/LiME)在 Ubuntu 18.04 中

sudo insmod /path/to/lime.ko path=~/dump.raw format=raw

来自 python 脚本。我尝试使用 os.system() ; subprocess.run()/call()/Popen() - shell=True/False.我明确导入了 .bashrc 环境,当它从命令行运行时,它全部失败,并出现模块错误中的未知符号。 python 脚本以 root 权限运行。我想念的点是什么?子进程和直接 shell 之间有什么区别?它与我尝试安装的模块的特殊性质有关吗?错误是

insmod: error inserting 'path/to/lime.ko': Unknown symbol in module

答案1

我不知道这是否是您问题的原因,但请注意,当未启用各自的选项时, ~in仅由和shellcmd path=~/dump.raw扩展(仅当 剩下的内容看起来像有效的变量名时)(对于,该选项在作为 调用时启用)并且由shell 在其选项启用时启用。bashmkshbash=posixbashposixshzshmagicequalsubst

不在其他外壳中。对于sh,POSIX要求echo path=~输出path=~

因此,除非您的sh构建没有默认启用mksh该模式,否则如果使用 shell(将是)从内部运行,则不会扩展到您的主目录。posixpythonsh~

在这里,使用:

sudo insmod /path/to/lime.ko path="$HOME/dump.raw" format=raw

反而。或者,如果不调用 shell,则python检索环境变量的值HOME来构造该参数。path=....

有关扩展主题的更多阅读~,请参阅~ 是否始终等于 $HOME

相关内容