14.04/3.19 和 16.04/4.4 处理 system() 函数在 xterm 中打开新进程的方式不同

14.04/3.19 和 16.04/4.4 处理 system() 函数在 xterm 中打开新进程的方式不同

我正在尝试将一个经过良好测试的 c++ 应用程序从 14.04.1 和 3.19.0 内核移植到 16.04LTS 服务器和 4.4.0 内核。我运行了一个第三方可执行文件,该可执行文件必须在终端中以 root 身份运行。我认为我已经将问题归结为调用

system( "xterm -T 'Firmware Update' -j -sb -fg black -bg lightgray +132 +hold -fn 9x15bold -geometry 80x30+400+200 -e 'sudo /opt/factory/updateFirmware.sh' -r" );

这在旧系统上有效,终端打开,脚本运行,打印其进度和结果。在新系统中,调用返回失败,甚至不打印脚本通常生成的打开日志消息。我可以在终端窗口中手动运行这个命令,它可以工作,打开第二个终端并运行脚本。

可能是某种安全机制阻止了终端。在我尝试其他一百种方法之前(我尝试过 sudo/sudoers、popen 和 exec;它们看起来都一样),有谁知道 -

是否存在安全策略或配置设置,禁止 system() 调用打开终端,即使调用程序以 root 身份运行?

编辑:我确实知道 system() 是邪恶的。在这种情况下,风险对我来说是可以接受的。我只能依靠第三方实用程序,只有在系统进行软件更新时才需要运行它。所以请不要再尖刻地投反对票了。

下面是我运行的一些进一步的测试代码,并生成了结果日志消息。第一个是 logger 命令,它在日志中打印其消息并返回成功。第二个是 whoami,它只返回成功但证明该命令可以由系统运行。(TR_TRACE 是我们使用的日志模块,它们宣布每次调用的结果。)第一个失败是打开 xterm 并运行 whoami 的简单命令。最后一个失败是实际的原始有问题的命令。

result = system( "logger -t 'system() call' 'Are we doing effing anything?'" );
TR_TRACE(Usermesg, 0, "Returned from logger call, result=" << result << " WEXITSTATUS( result )=" << WEXITSTATUS( result ));
result = system( "whoami");
TR_TRACE(Usermesg, 0, "Returned from whoami call, result=" << result << " WEXITSTATUS( result )=" << WEXITSTATUS( result ));
result = system( " xterm -j -hold -geometry 80x30+400+200 -e 'whoami'");
TR_TRACE(Usermesg, 0, "Returned from whoami call in terminal, result=" << result << " WEXITSTATUS( result )=" << WEXITSTATUS( result ));
result = system( "sudo xterm -T 'Firmware Update'  -sb -fg black -bg lightgray +132 -hold -fn 9x15bold -geometry 80x30+400+200 -e 'sudo /opt/360/updateMatroxFirmware.sh'" );
TR_TRACE(Usermesg, 0, "Returned from script to update FPGA firmware version, update result=" << result << " WEXITSTATUS( result )=" << WEXITSTATUS( result ));

日志显示

Mar  4 02:06:41 tm6a system() call: Are we doing effing anything?
Mar  4 02:06:41 tm6a TSS: 808 d61ed740 0000 VR@Usermesg: Returned from logger call, result=0 WEXITSTATUS( result )=0
Mar  4 02:06:41 tm6a TSS: 821 d61ed740 0000 VR@Usermesg: Returned from whoami call, result=0 WEXITSTATUS( result )=0
Mar  4 02:06:41 tm6a TSS: 827 d61ed740 0000 VR@Usermesg: Returned from whoami call in terminal, result=256 WEXITSTATUS( result )=1
Mar  4 02:06:41 tm6a TSS: 839 d61ed740 0000 VR@Usermesg: Returned from script to update Matrox card FPGA firmware version, update result=256 WEXITSTATUS( result )=1

相关内容