在不继承父级环境的情况下运行命令

dgo*_*o.a 18 session bash shell

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

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

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

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

ssh me@localhost "some command"`
Run Code Online (Sandbox Code Playgroud)

Ell*_*ter 15

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

env -i HOME="$HOME" bash -l -c 'your_command'
Run Code Online (Sandbox Code Playgroud)

例子:

$ export ABC=123
$ env -i HOME="$HOME" bash -l -c 'env' | grep ABC
$ env HOME="$HOME" bash -l -c 'env' | grep ABC
ABC=123
Run Code Online (Sandbox Code Playgroud)

将其分解以进行解释:

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

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

尤其:

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


use*_*686 13

su -l $USER

sudo -u $USER -i
Run Code Online (Sandbox Code Playgroud)

对于更激进的 try env -i bash,但这会取消设置包括 $HOME 和 $TERM 在内的所有内容

  • 谢谢!第二个命令正是我想要的。我搜索了2个多小时,没有找到与您的回复接近的任何内容。根据您的回复,我回到`man sudo`发现:“如果目标用户与调用用户相同,则不需要密码。” (“su”似乎总是要求输入密码。)我真是个傻瓜,竟然忽略了“手册”页面第一段中如此简单的内容:(我首先避免使用 sudo,因为我认为它总是求密码。再次感谢! (2认同)