就我而言,我需要每天从一个单独的文件系统启动一个进程,它的根目录位于子目录中。因为它是文件系统上唯一需要卸载它的东西
另一个问题是我不能fork()
/ clone()
这个过程,因为它在特权环内运行。
我想到了以下解决方案:
char *argv [] = {"/path2/sbin/the_program_to_be_launched","-option","value of option",NULL};
char *envp [] = {"HOME=/","SHELL=no_shell_available","LC_ALL=C",NULL};
mount(name, "/path/", fs, flags, data);
chroot("/path/");
execve("/path2/sbin/the_program_to_be_launched",argv,envp); // would not work because the program won’t be able find his libraries
umount("/"); // would never be called if execve() would have been called correctly
如果没有执行这个过程,这样的事情也行不通。
mount(name, "/path/", fs, flags, data);
chroot("/path/path2/"):
umount("/"); // would not work since "/" is not the root of the device.
那么如何使用不同的根目录启动不同的子进程而不更改父进程呢?
答案 0 :(得分:0)
crom可以启动启动实际程序的shell脚本。
在Linux中,' /' directory是所有文件系统的根目录。所以你绝对不想卸下它。请阅读mount / unmount上的手册页。
您可以在fstab中为可安装用户的文件系统放置一个适当的条目。然后安装/卸载它会相对简单。
你可以创建一个限制性的'脚本登录/注销的用户。
该用户可用于运行目标程序并执行mount / unmount操作。
由crom运行的shell可以执行所有CD等
使应用程序能够执行而无法看到它的'图书馆,也许链接它'静态'。也许有用户' .profile包括开发$ PATH变量以包含库的路径。
用户登录可以使用busybox版本,该版本只包含用户运行目标程序所需的命令。
答案 1 :(得分:0)
在类Unix系统上,创建新进程的唯一方法是系统调用fork
或clone
,而execv.
系列是启动可执行文件的唯一方法。确实有其他功能,如system
,但他们确实称这两个系统调用。
当然,在另一个系统上,它可能会有所不同。例如,在Windows上,启动à新流程的API为CreateProcess
。
但是在Unix或Linux上,您必须clone
或fork
。您可以使用chroot
更改根文件系统,并将privilèges删除setuid
或其替换(提供的调用过程为privilèges)。