尝试从 Qt 程序执行 setcap
Trying to perform setcap from Qt program
我正在尝试以这种方式从 Qt 程序执行 setcap:
QProcess process;
QString command = "cat";
QStringList args;
args << _fileName;
process.start(command, args);
process.waitForFinished();
QString StdOut = process.readAllStandardOutput();
QString StdError = process.readAllStandardError();
QString err = process.errorString();
QProcess process_2;
command = "setcap";
args.clear();
args << "cap_kill=ep" << _fileName;
process_2.start(command, args);
process_2.waitForFinished();
StdOut = process_2.readAllStandardOutput();
StdError = process_2.readAllStandardError();
err = process_2.errorString();
作为 _fileName,我使用 QFileSystemModel 的值,在我的例子中它看起来像“/home/ekaterina/example”。
第一部分(只是为了测试路径正确性而编写的)工作正常并将文件内容放入 StdOut。我希望第二部分 return 类似于“不允许操作”之类的东西,因为 QtCreator 运行 它的项目不是根。但是我在错误字符串中得到“execvp:没有这样的文件或目录”。怎么样?
当我尝试 运行 具有“cap_setfcap”功能的项目可执行文件时,我得到了完全相同的结果。
最好的做法,如@G.M。建议,是提供二进制文件的完整路径。您可以通过以下方式找到 setcap
在您系统上的位置:
$ sudo which setcap
在 Debian 和 Fedora 上,returns /usr/sbin/setcap
。在您的系统上,它也可能是 /sbin/setcap
。然后将该字符串显式嵌入到您的程序中:
command = "/sbin/setcap";
我正在尝试以这种方式从 Qt 程序执行 setcap:
QProcess process;
QString command = "cat";
QStringList args;
args << _fileName;
process.start(command, args);
process.waitForFinished();
QString StdOut = process.readAllStandardOutput();
QString StdError = process.readAllStandardError();
QString err = process.errorString();
QProcess process_2;
command = "setcap";
args.clear();
args << "cap_kill=ep" << _fileName;
process_2.start(command, args);
process_2.waitForFinished();
StdOut = process_2.readAllStandardOutput();
StdError = process_2.readAllStandardError();
err = process_2.errorString();
作为 _fileName,我使用 QFileSystemModel 的值,在我的例子中它看起来像“/home/ekaterina/example”。
第一部分(只是为了测试路径正确性而编写的)工作正常并将文件内容放入 StdOut。我希望第二部分 return 类似于“不允许操作”之类的东西,因为 QtCreator 运行 它的项目不是根。但是我在错误字符串中得到“execvp:没有这样的文件或目录”。怎么样?
当我尝试 运行 具有“cap_setfcap”功能的项目可执行文件时,我得到了完全相同的结果。
最好的做法,如@G.M。建议,是提供二进制文件的完整路径。您可以通过以下方式找到 setcap
在您系统上的位置:
$ sudo which setcap
在 Debian 和 Fedora 上,returns /usr/sbin/setcap
。在您的系统上,它也可能是 /sbin/setcap
。然后将该字符串显式嵌入到您的程序中:
command = "/sbin/setcap";