【问题标题】:Adding "sudo" before a command makes the command unknown在命令前添加“sudo”会使命令未知
【发布时间】:2015-05-29 20:47:24
【问题描述】:

这是一个困扰我一段时间的 linux 问题。在我的工作 linux 机器(运行 RedHat)上,我试图安装一些 Python 包。然而,一些有趣的事情正在发生,见下文:

  1. 这是我的目标和第一个命令

    pip install scrapylib
    
  2. 这会产生“权限被拒绝”错误

    OSError: [Errno 13] Permission denied: '/usr/local/lib/python2.7/site-packages/scrapylib'
    
  3. 我的下意识反应是将“sudo”放在完全相同的命令前面...

    sudo pip install scrapylib
    
  4. 这会产生这个异常,

    sudo: pip: command not found
    
  5. 为了解决这个问题,我输入

    sudo su - root
    
  6. 现在这个命令运行 100% 成功

    pip2.7 install scrapylib
    
  7. 终于变回我自己了

    sudo su - uspowpow
    

谁能给我解释一下这个现象?我是一名刚毕业的大学毕业生,除了基本的 Linux 知识外,如果有人能解释为什么在有效命令前放置“sudo”会使其无效,我将非常感激(修复和知识)。

【问题讨论】:

  • 改用sudo /path/to/pip
  • 取决于细节,但请记住,sudo 通常配置为强制使用一组已知安全的环境变量,包括 PATH。这是一个重要的安全功能——想想如果你只允许某人在一个简短的白名单上运行命令,如果他们可以安装环境变量来修改这些命令的行为,会发生什么。
  • 顺便说一句,这不是一个真正的编程问题;它更适合superuser.comunix.stackexchange.com
  • 顺便说一句,@uspowpow,re (7),最好通过运行exit 改回你。实际上,您仍然保持您的根 shell 处于打开状态且可访问——如果您运行 pstree,您将看到原来的 shell,然后是 root 的 shell,然后是一个新的 shell你在这里给出的步骤。

标签: python linux root redhat sudo


【解决方案1】:

这可能有几个原因。挑几个:

  • 您的命令可能不在sudo 强制执行的路径中。对于/usr/local/bin(您的pip 似乎所在的位置)中的命令,这很有可能。
  • 您的命令可能需要别名或 shell 函数才能有效(也许您将 pip 别名为 pip2.7?),或者可能是内置的 shell(尽管 pip 不是这种情况) )。默认情况下,sudo 使用 execv* 系统调用系列的成员直接调​​用子级,没有 shell,因此 (1) 在它下不调用 shell 函数和别名; (2) 即使您使用 shell,该 shell 也不会运行您当前用户的 dotfiles(作为非交互式 shell,如果给定单个命令运行,它不会运行 大多数个点文件)。

要知道实际的原因是什么,首先要找出pip是什么类型的命令。为此,请运行:

$ type pip

如果你得到的答案是:

pip is /usr/local/bin/pip

...那么您应该查看在您的/etc/sudoers 中设置的secure_path 值以确保它包含/usr/local/bin,或者只是运行sudo /usr/local/bin/pip 来回避这个问题。相比之下,如果你得到:

pip is aliased to `pip2.7'

...那你知道问题是它是一个别名,你需要运行sudo pip2.7(如果PATH 不是一个问题)。

【讨论】:

  • 当我输入“type pip”时,这些情况都没有发生。这是我的输出: pip 已散列 (/Library/Frameworks/Python.framework/Versions/2.7/bin/pip)
  • sudo /Library/Frameworks/Python.framework/Versions/2.7/bin/pip,然后。
  • 尝试这个 ^ 时会抛出一个错误,提示“/Library/Frameworks/Python.framework/Versions/2.7/bin/pip: command not found”
  • 完整的命令是“sudo /Library/Frameworks/Python.framework/Versions/2.7/bin/pip install numpy”
  • 这不可能。 /Library/Frameworks/Python.framework 是 MacOS 路径。你说你正在运行红帽。也许您在错误的窗口中运行了type pip 命令?
猜你喜欢
  • 2017-08-09
  • 2012-07-11
  • 2013-09-26
  • 2020-07-20
  • 1970-01-01
  • 2019-04-05
  • 2014-05-11
  • 2019-08-30
  • 2017-11-03
相关资源
最近更新 更多