添加" sudo"在命令使命令未知之前

时间:2015-05-29 20:47:24

标签: python linux root redhat sudo

这是一个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. 现在此命令成功运行

    pip2.7 install scrapylib
    
  7. 最后,我改回来了

    sudo su - uspowpow
    
  8. 任何人都可以向我解释这种现象吗?我是一名刚毕业的大学毕业生,除了基本的Linux知识外,如果有人能够解释为什么放置" sudo"在有效命令面前使其无效,我将非常感激(无论是修复还是知识)。

1 个答案:

答案 0 :(得分:6)

出现这种情况有几个原因。选择一些:

  • 您的命令可能不在sudo强制执行的PATH中。对于/usr/local/bin中的命令(您的pip似乎是这样),这很可能。
  • 您的命令可能要求别名或shell函数有效(可能您pip别名pip2.7?),或者可能是内置的shell(虽然情况并非如此) pip)。默认情况下,sudo使用execv *系列syscalls直接调用子进程,没有shell,因此(1)shell函数和别名不会被调用; (2)即使你 使用shell,该shell也不会运行你当前用户的dotfiles(作为非交互式shell,如果给出一个命令来运行,它将不会运行大多数 dotfiles)。

要了解实际原因是什么,开始的地方是找出pip是什么类型的命令。为此,请运行:

$ type pip

如果答案是:

pip is /usr/local/bin/pip

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

pip is aliased to `pip2.7'

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