使用“默认”环境运行命令

使用“默认”环境运行命令

这个问题https://superuser.com/questions/319043/runing-a-command-without-inheriting-parents-environment建议我们可以在不继承父环境的情况下运行命令

$ sudo -u "`whoami`" $COMMAND

有没有办法在不使用的情况下做到这一点sudo?由于 whilesudo非常流行,它还没有达到可移植状态(或在 POSIX 中)。

我已经尝试过env -i $COMMAND,但效果不好,因为它删除了所有环境变量。我想要的是运行命令默认环境。

答案1

login(1)传统上,在登录时设置一组有限的环境变量。即使用户以自己的身份登录, Likesu login通常也会要求输入密码,因此这里可能并不理想。 Unix 系统可能有额外的或不同的复杂性,例如,如果有 PAMpam_env(8)可以添加或删除 .sets 所设置的环境变量login。因此,所做内容的副本login(1)可能会创建与通过 PAM 集实际登录不同的环境变量集。

然后是终端和外壳;终端可能会也可能不会将后续进程作为“登录”shell 启动。当标记为登录时,Shell 可能会读取不同的文件,并且最终可能会为登录实例和非登录实例提供不同的环境变量。有关于这个主题的现有文献

因此,根据 unix、登录过程、本地系统配置、用户使用的 shell 以及该 shell 的本地配置,可能会“默认”设置不同的环境变量。

您也许能够通过登录 shell 实例获取合适的环境变量列表:

% export CANARY=tweet
% env -i bash -l -c 'env | grep CANARY'
/Users/jhqdoe/.profile: line 6: set: markdirs: invalid option name
% 

这确实清除了父进程中的环境变量(env | grep CANARY将是您$COMMAND所在的位置)。.profile这里其实是为了mksh,不是bash。但是,上述内容可能不会设置登录工作流设置的必要变量,因为它不经过该代码。可以通过新登录来检查它们以查看它们是什么,然后运行:

$ env > def
$ env -i bash -l -c 'env > new'

然后比较defnew文件以查看它们有何不同(可能涉及sortdiff命令),然后可能更新命令env以设置在执行登录 shell 之前遗漏的内容。

另一个想法是环境快照并将其用作默认值。

相关内容