sudo -H 是什么意思?

66

尝试使用pip安装virtualenv后

$ pip install virtualenv

我遇到了权限被拒绝的错误

IOError: [Errno 13] Permission denied: '/Library/Python/2.7/site-packages/virtualenv.py'

所以我使用sudo安装了virtualenv

$ sudo pip install virtualenv

但随即出现了警告:

目录 '/Users/petertao/Library/Caches/pip/http' 或其父目录不属于当前用户,缓存已被禁用。请检查该目录的权限和所有者。如果使用 sudo 执行 pip,则可能需要 sudo 的 -H 标志。

目录 '/Users/petertao/Library/Caches/pip' 或其父目录不属于当前用户,缓存轮已被禁用,请检查该目录的权限和所有者。如果使用 sudo 执行 pip,则可能需要 sudo 的 -H 标志。

sudo 的 -H 标志是什么意思?


4
可以通过搜索sudo并查看sudo手册页面中的-H选项来找到这个信息,其中明确说明了"将HOME环境变量设置为目标用户密码数据库条目指定的主目录。" - metatoaster
9
感谢您回复,如果这对每个人来说似乎是一个琐碎的问题,我道歉。我刚开始使用Python、pip和终端。我仍在努力理解的是,将HOME环境变量设置为主目录如何修复这些警告。 - Peter Tao
13
虽然这个确切的问题非常琐碎,但“当以超级用户身份运行时,为什么pip会抱怨非超级用户权限和所有权”这个未明示的问题却很有趣。正如user3141593精心撰写的答案所解释的那样,pip 抱怨是因为在非超级用户的主目录中创建超级用户拥有的子目录是个坏主意。幸运的是,这个问题保持开放状态足够长时间以收到一个有用的回答。 - Cecil Curry
15
装腔作势的态度是怎么回事? - John R Perry
5
我也一样。我发现手册中的条目完全没有帮助,最后在谷歌搜索后来到了这里。幸运的是,用户3141593提供了一个更具洞察力的答案。 - JS.
2个回答

102

通常情况下

man sudo(确切的文本可能会有所不同,但类似):

-H

-H(HOME)选项请求安全策略将 HOME 环境变量设置为目标用户(默认为 root),如密码数据库所指定的主目录。根据策略的不同,这可能是默认行为。

那么这个选项有什么用呢? 通常使用 "sudo" 不会改变 $HOME 环境变量。

例如:

 echo $HOME $USER
/home/testuser testuser

 sudo bash -c 'echo $HOME $USER'
/home/testuser root

 sudo -H bash -c 'echo $HOME $USER'
/home/root root

通过使用普通的sudo,您可以看到我从“testuser”更改为“root”,但并未更改$HOME的设置;而通过sudo -H也会将变量从“我的”主目录更改为root的主目录。

针对您的情况

Pip警告您以root用户身份执行了它,并希望修改位于“/Users/petertao”的$HOME中的内容,这不是root所有(很可能是“petertao”用户)。 该警告表明pip使用$HOME缓存文件,但由于文件夹所有权差异已禁用其自身缓存。

当然,在以root身份执行时,pip可以修改“/Users/petertao/Library/Caches/pip”,因为root几乎是万能的。 但是,稍后可能会出现问题,因为没有root权限的程序无法覆盖或修改这些文件。 相反,pip拒绝向属于另一个用户的目录写入。


11
不使用“sudo -H”的原因是什么?还是说警告过于保守?根据您详细的解释,似乎我们应该始终使用-H,但pip的警告是“你__可能__想要使用sudo -H”,而不是“在使用sudo时启用缓存,请使用-H”。 - ndemou
3
你能解释一下双引号和单引号的区别吗?我尝试了 sudo -H bash -c "echo $HOME $USER"sudo -H bash -c 'echo $HOME $USER',这些命令给出不同的结果:分别是 /home/ubuntu ubuntu/root root。之前我以为引号之间没有区别。 - through.a.haze
2
@through.a.haze https://dev59.com/Smw15IYBdhLWcg3wT5_2 - Arne

-15

-h 标志通常意味着人类可读格式。它是 Linux 操作系统的一个方便的内置转换。例如,如果您在 Linux 中的命令终端中输入 df,这将向您显示已使用和可用的内存。 它将显示类似于您有 448336 字节的内容。您可能会感到困惑。现在输入 df -h(使用 -h 标志),您应该得到类似于 448M 的结果,而不是 4488336 字节。


3
在这种情况下,OP询问特定命令(sudo)上的-H标志,而不是许多Unix实用程序上的“典型”-h标志。 - Jonathon McMurray
此外,在Ubuntu 18.04上,sudo命令的-h标志如果没有参数,则为--help的简写,如果有要运行sudo的主机,则为--host的简写。 - Arseny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接