bash 脚本可以重置和清理*整个*环境吗?如何?

bash 脚本可以重置和清理*整个*环境吗?如何?

你知道这些sudo东西:

Defaults env_reset

这使得环境注入变得不可能。我想知道这个功能是否可以直接从 bash 脚本“从内部”获得?

至少部分可以,这是肯定的。例子:

#!/usr/bin/env php
<?php
//...

// sanitizes $PATH
putenv("PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"); 

// unsets $LD_LIBRARY_PATH, as it should be in Ubuntu
putenv('LD_LIBRARY_PATH');
//...

我们可以env_reset像那样运行脚本吗sudo?如何做?

编辑:

我不是在寻找“从外部”执行此操作的方法,env -i command而是从脚本本身的内部执行此操作。我的目的是确保安全性,无论谁(什么用户)以及如何(在哪种情况下,即环境变量)运行它。

答案1

bash本身使用一些环境变量。当bash启动并准备解释其第一个命令时,已经太晚了,恶意环境可能已经造成了bash损害。

bash您需要在调用之前对环境进行清理。您可以在大多数系统上使用 C 函数擦除环境clearenv(),或者您可以只调用execve()脚本并在envp参数中传递一个空列表。

即使脚本包含:

#! /bin/bash -
:

:作为一个特殊的内置命令),如果环境包含SHELLOPTS=xtrace PS4='$(reboot)'reboot则将调用该命令:

如果bash是动态链接的,LD_PRELOAD/LD_LIBRARY_PATH可以bash在调用时立即运行任意代码。

bash还尊重语言环境的字符集进行解析,因此使用LOCPATHLC_*变量,您甚至可以让该#! /bin/bash -行调用任意代码(#!/bina例如,通过将字符设为空白)。

也可以看看:

env SHELLOPTS=noexec any-bash-script

这会阻止bash做任何事情。

这些只是几个例子。

另请注意,环境变量并不是命令在启动时继承的唯一内容,并且可能会影响其行为(如参数、umask、限制、当前工作目录、打开文件描述符、信号配置、控制终端...)。

答案2

export -p您可以使用或 简单地找到您的导出,并将每行上的export替换为 以取消导出它:declare -xdeclare +x

eval "$(export|sed s/-/+/)"

如果您将其放在脚本的开头,那么除非您自己显式导出环境变量,否则不会将环境变量传递给它执行的程序。您可能想要导出语言环境和TZ变量,TERM以及更多...

相关内容