由于不方便的原因超出了这个问题的范围,我必须在Python脚本中运行tcpdump.我目前只调用subprocess.Popen([‘tcpdump’,…),一切正常.但是,当我使用像pyInstaller这样的工具将脚本打包成可执行文件并运行它(以root身份)时,我收到以下错误:
tcpdump: error while loading shared libraries: libcrypto.so.0.9.8: "failed to map segment from shared object: Permission denied"
我发现,这是AppArmor的抱怨.现在,我可以使用以下内容轻松替换我对tcpdump的调用:
subprocess.call(['aa-complain', '/usr/sbin/tcpdump'])
pcap = subprocess.Popen(['tcpdump', ...)
subprocess.call(['aa-enforce', '/usr/sbin/tcpdump'])
现在它打印两条信息行(关于改变为抱怨/强制模式),并运行tcpdump而不会进一步投诉.
运行此脚本的人将在他们想要执行数据包捕获时以root身份运行它,因此我不知道这是一个安全问题.与此同时,上述内容对我来说似乎很骇人听闻.那么对你们中的AppArmor专家来说:这是处理它的规范方式吗?
PS.我也非常感谢能够快速了解AppArmor的链接,因为这是我第一次遇到这个问题.
解决方法:
那么这应该是一个开始,如果你还没有浏览它:https://help.ubuntu.com/community/AppArmor