【问题标题】:What does sudo -H do?sudo -H 有什么作用?
【发布时间】:2017-09-23 04:43:55
【问题描述】:

尝试使用 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 标志有什么作用?

【问题讨论】:

  • 可以通过搜索 sudo 找到此内容,并看到带有 -Hsudo manual 页面声明“将 HOME 环境变量设置为由目标用户的密码数据库条目指定的主目录。”
  • 感谢您的回复,如果这对每个人来说都是一个微不足道的问题,我深表歉意。我刚刚开始使用 python、pip 和终端。我仍然想了解的是如何将 HOME 环境变量设置为主目录修复这些警告。
  • 虽然这个确切的问题微不足道,但unstated 问题“为什么pip 在以超级用户身份运行时抱怨非超级用户权限和所有权?”非常有趣。正如user3141593well-authored answer 解释的那样,pip 抱怨是因为在非超级用户主目录中创建超级用户拥有的子目录是个坏主意。幸运的是,这个问题保持开放的时间足够长,可以收到有用的回复。
  • 这些自命不凡的态度是怎么回事?
  • @JohnRPerry:这里也一样。我发现手册页条目完全没有帮助,并在谷歌搜索后在这里结束。值得庆幸的是,user3141593 提供的答案提供了更多见解。

标签: python terminal pip virtualenv sudo


【解决方案1】:

一般

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 也会将变量从“my”主目录更改为 root 的主目录。

在你的情况下

pip 警告您它是以 root 用户身份执行的,并且想要修改 $HOME 中的内容,该 $HOME 设置为 '/Users/petertao',不属于 root(很可能是“petertao”用户) . 警告表明 pip 使用 $HOME 缓存文件,但由于文件夹所有权差异而禁用了自己的缓存。

当然,在以 root 身份执行时 pip 可以修改“/Users/petertao/Library/Caches/pip”,因为 root (几乎)是全能的。 这在以后可能会变得很麻烦,因为没有 root 运行的程序不能再覆盖或修改这些文件。 相反,pip 拒绝写入另一个用户拥有的目录。

【讨论】:

  • 那么有什么理由不使用“sudo -H”还是对保守派的警告?根据您的详尽解释,我们似乎应该始终使用 -H 但来自 pip 的警告是“您可能想要使用 sudo -H”而不是“要在使用 sudo 时启用缓存,请使用 -H "
  • 这里能解释一下双引号和单引号的区别吗?我尝试了sudo -H bash -c "echo $HOME $USER"sudo -H bash -c 'echo $HOME $USER',这些命令给出了不同的结果:分别为/home/ubuntu ubuntu/root root。我曾经认为引号之间没有区别。
【解决方案2】:

-h 标志通常表示人类可读的格式它是 Linux 操作系统中一种方便的内置转换。例如,如果你在我的情况下进入 Linux 中的命令终端是一个 raspberry pi 并输入 df。这将显示您已使用和可用的内存。它会显示像你有 448336 字节的东西。你可能喜欢嗯,这很令人困惑。现在输入 df -h(使用 -h 标志),您应该会得到类似 448M 而不是 4488336 字节的结果。

【讨论】:

  • 在这种情况下,OP 询问的是特定命令 (sudo) 上的 -H 标志,而不是许多 unix 实用程序上的“典型”-h 标志
  • 另外,至少在 Ubuntu 18.04 上,sudo-h 标志是 --help 的简写,如果它没有参数,或者是 --host,如果它带有一个主机运行sudo on
猜你喜欢
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
  • 2021-06-16
  • 1970-01-01
相关资源
最近更新 更多