0

这类似于execle执行bash时如何设置环境变量?

我正在尝试在 C 中使用 execle() 来执行 /bin/login 并将环境变量传递给目标 shell。并且不能让它工作。

我已经尝试通过手册页中描述的环境作为 VAR=VAL 字符串的 NULL 终止数组。我也在通话前尝试了 putenv() 。

例如:

const char *env[] = { "MYVAR=myval", (char *)0 };
putenv("MYVAR=myval");
execle("/bin/login", "login", "-p", "-f", user, (char *)0, env);

成功登录后,我希望将 MYVAR 视为环境变量,但只有变量,如 USER、HOME、SHELL、PATH 等。

我尝试过使用 BusyBox 登录和使用 tinylogin ......结果相同。

非常感谢任何帮助。

4

2 回答 2

1

为我工作。你确定你execle()的成功了吗?例如,在 BSD 系统(包括 macOS)上,正确的路径是/usr/bin/login。您应该在通话fprintf(stderr, "execle() failed with errno %d\n", errno);后添加一个。execle()

您确定login系统上的 BusyBox 命令支持这些选项吗?

另外,请使用NULL而不是(char *)0.

于 2019-03-27T01:54:24.447 回答
0

Jonathan 和 Kurtis,非常感谢您的帮助和评论。

我发现使用“-p”和用户shell是/bin/sh时env没有问题。但是当我尝试使用“-p”并且用户 shell 是 klish(CLI 实用程序)时,在获取一些 .sh 文件时出现了一些错误。

因此,我查看了 BusyBox 源代码,如果不使用“-p”,它会在 su.c 中执行 clearenv()。

我已经通过传递它并手动将它添加到环境中来解决这个问题。由于这不是最好的方法,我将不得不对我的 klish 采购做更多的研究。

干杯。

再次感谢。

于 2019-03-27T21:23:41.740 回答