运行命令而不继承父级环境

运行命令而不继承父级环境

有没有办法运行命令“就像”在新的登录会话中一样?

我已经尝试过了env -i。但是,我不想处理必须设置或取消设置的各种 ENV 变量。

我也尝试过bash -c "some command"bash -l -c "some commmand",但它们都复制当前环境。

我最接近的是一个不太干净的解决方案:

ssh me@localhost "some command"`

答案1

这是一个不需要 sudo 权限或用户密码的答案,但仍然提供类似于您在全新登录时获得的环境。

env -i HOME="$HOME" bash -l -c 'your_command'

例子:

$ export ABC=123
$ env -i HOME="$HOME" bash -l -c 'env' | grep ABC
$ env HOME="$HOME" bash -l -c 'env' | grep ABC
ABC=123

分解一下来解释一下:

  1. env -i HOME="$HOME":清除环境。-i使用以下命令设置一个空环境没有任何变量。这是有问题的,因为这意味着如果你尝试天真地运行bash -l它,它将不会加载你的.bash_profile等,因为HOME没有设置。为了缓解这种情况,我们明确传递,创建一个设置(且仅设置)HOME="$HOME"的环境。HOMEHOME

  2. bash -l -c ...:在登录 shell 中运行所需命令。您需要一个登录 shell,因为我们从干净的环境开始,需要重新加载所有内容。

尤其:

  • 这不需要 sudo 权限(sudo版本需要)。
  • 这不需要输入用户密码(su版本需要)。
  • 这不需要运行 SSH 服务器并拥有可用于重新登录机器的无密码密钥(该ssh版本需要)。

答案2

su -l $USER

sudo -u $USER -i

对于更积极的尝试env -i bash,但这会解除一切包括$HOME 和 $TERM。

相关内容