有没有办法运行命令“就像”在新的登录会话中一样?
我已经尝试过了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
分解一下来解释一下:
env -i HOME="$HOME"
:清除环境。-i
使用以下命令设置一个空环境没有任何变量。这是有问题的,因为这意味着如果你尝试天真地运行bash -l
它,它将不会加载你的.bash_profile
等,因为HOME
没有设置。为了缓解这种情况,我们明确传递,创建一个设置(且仅设置)HOME="$HOME"
的环境。HOME
HOME
bash -l -c ...
:在登录 shell 中运行所需命令。您需要一个登录 shell,因为我们从干净的环境开始,需要重新加载所有内容。
尤其:
- 这不需要 sudo 权限(
sudo
版本需要)。 - 这不需要输入用户密码(
su
版本需要)。 - 这不需要运行 SSH 服务器并拥有可用于重新登录机器的无密码密钥(该
ssh
版本需要)。
答案2
su -l $USER
sudo -u $USER -i
对于更积极的尝试env -i bash
,但这会解除一切包括$HOME 和 $TERM。