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


14

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

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

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

最接近的是贫民窟解决方案: ssh me@localhost "some command"


使用/bin/bash --login获得该行为。我用它来获得适当的$PATH
丹尼尔·贝克

相当于/bin/bash --l,我已经尝试过了。它复制原始环境。试试看:export SOME_VAL=something。然后/bin/bash --login。然后env | grep SOME_VAL。该值将在那里。
dgo.a 2011年

Answers:


12

这是一个不需要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",创建一个HOME(仅HOME)设置了的环境。

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

值得注意的是:

  • 这不需要sudo特权(sudo版本需要)。
  • 不需要输入用户密码(su版本需要输入密码)。
  • 这不需要运行SSH服务器,也不需要具有可用于重新登录到计算机的无密码密钥(该ssh版本需要)。

谢谢,埃利奥特。它看起来是如此简单和明显……现在已经向我指出了。
dgo.a

12
su -l $USER

sudo -u $USER -i

要尝试更激进的尝试env -i bash,但这会使包括$ HOME和$ TERM在内的所有内容失效。


2
谢谢!第二个命令给出了我想要的。我搜索了2个多小时,但没有找到与您的回复相符的内容。根据您的答复,我回到man sudo并发现:“如果目标用户与调用用户相同,则不需要密码。” (su似乎总是要求输入密码。)我真是个傻瓜,在man页面的第一段中忽略了这么简单的东西:( 首先,我避免使用sudo,因为我以为它总是要求输入密码。谢谢再次!
dgo.a 2011年

1
只是对其他人的提示...如果以您的身份登录,$USER则需要先以root sudo -u ...用户身份登录,然后再以用户身份登录。如果您只是sudo -u以用户身份进行操作,则将继承。
亚当·根特

显然,如果您没有sudo访问权限,则此操作将无效。是否有不需要sudo的替代方法?
user5359531

@ user5359531:是– su -l $USER
user1686

1
要求输入密码;我通过ssh密钥身份验证登录,所以我什至不知道密码是什么。密码提示将杀死脚本功能。到目前为止,它的ssh $USER@localhost <command>工作情况更好
user5359531
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.