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

usp*_*pow 0 python linux sudo redhat root

这是一个linux问题,一直困扰着我.在我的工作linux框(运行RedHat)我试图安装一些Python包.然而,正在发生一些有趣的业务,见下文:

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

    pip install scrapylib
    
    Run Code Online (Sandbox Code Playgroud)
  2. 这会创建"权限被拒绝"错误

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

    sudo pip install scrapylib
    
    Run Code Online (Sandbox Code Playgroud)
  4. 这会产生这个异常,

    sudo: pip: command not found
    
    Run Code Online (Sandbox Code Playgroud)
  5. 为了解决这个问题,我打字

    sudo su - root
    
    Run Code Online (Sandbox Code Playgroud)
  6. 现在,此命令成功运行100%

    pip2.7 install scrapylib
    
    Run Code Online (Sandbox Code Playgroud)
  7. 最后,我回到了我身边

    sudo su - uspowpow
    
    Run Code Online (Sandbox Code Playgroud)

谁能向我解释这个现象?我是最近的大学毕业生,只有基本的Linux知识,如果有人能解释为什么在有效命令前面放置"sudo"使其无效,我将非常感激(无论是修复还是知识).

Cha*_*ffy 6

这可能由于几个原因而发生.选几个:

  • 您的命令可能不在由强制执行的PATH中sudo.对于/usr/local/bin(在你pip看起来像是)的命令,这很可能是彻头彻尾的.
  • 你的命令可能要求别名或shell函数有效(也许你有pip别名pip2.7?),或者可能是内置的shell(虽然情况并非如此pip).默认情况下,sudo使用execv*系列syscalls的成员直接调​​用子进程,没有shell,因此(1)shell函数和别名不会被调用; (2)即使你用贝壳,壳牌不会(如果给出一个命令来运行,它不会运行是一个非交互式的外壳,运行当前用户的点文件点文件).

要知道实际原因是什么,开始的地方是找出什么样的命令pip.为此,请运行:

$ type pip
Run Code Online (Sandbox Code Playgroud)

如果您得到的答案是:

pip is /usr/local/bin/pip
Run Code Online (Sandbox Code Playgroud)

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

pip is aliased to `pip2.7'
Run Code Online (Sandbox Code Playgroud)

...那么你知道的问题是,它是一个别名,你需要运行sudo pip2.7(如果路径是不是有问题).