-2

就我而言,我需要每天从一个单独的文件系统启动一个进程,它的根目录位于一个子目录中。因为它是文件系统上唯一需要卸载它的东西。
另一个问题是我不能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.

那么如何在不改变父进程的情况下启动具有不同根目录的不同子进程呢?

4

2 回答 2

0

在类 Unix 系统上,创建新进程的唯一方法是系统调用forkor clone,而execv.家族是启动可执行文件的唯一方法。确实有其他类似的函数system,但它们确实调用了这两个系统调用。

当然,在另一个系统上可能会有所不同。例如,在 Windows 上,启动新进程的 API 是CreateProcess.

但在 Unix 或 Linux 上,您必须使用clonefork. 您可以更改根文件系统chroot并删除 privilègessetuid或其派生(前提是调用进程是 privilèges)。

于 2015-04-06T17:03:43.453 回答
0

crom 可以启动启动实际程序的 shell 脚本。

在 Linux 中,'/' 目录是所有文件系统的根目录。所以你绝对不想卸载它。请阅读有关安装/卸载的手册页。

您可以在 fstab 中为用户可挂载的文件系统放置一个适当的条目。然后安装/卸载它会相对简单。

您可以创建脚本登录/注销的“受限”用户。

该用户可用于运行目标程序并执行挂载/卸载操作。

由 crom 运行的 shell 可以执行所有的 CD 等

让应用程序能够在无法查看其库的情况下执行,也许将其链接为“静态”。也许让用户的 .profile 包含 $PATH 变量的开发以包含库的路径。

用户的登录可以使用只有用户运行目标程序所需的命令的busybox版本。

于 2015-04-06T16:56:07.310 回答