python - 在命令前添加 "sudo"使命令未知

标签 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. 我本能的 react 是将“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 中。对于 /usr/local/bin(您的 pip 似乎所在的位置)中的命令,这是完全可能的。
  • 您的命令可能需要别名或 shell 函数才能有效(也许您将 pip 别名为 pip2.7?),或者本身可能是内置的 shell(尽管 pip 不是这种情况)。默认情况下,sudo 使用 execv* 系统调用家族的成员直接调​​用子级,没有 shell,因此 (1) shell 函数和别名不会在其下全部调用; (2) 即使您正在使用一个 shell,该 shell 也不会运行您当前用户的点文件(作为一个非交互式 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 不是也是一个问题) .

关于python - 在命令前添加 "sudo"使命令未知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30538784/

相关文章:

python - 仅使用日期从cassandra中删除记录

python - 如何在 Pyspark 数据框中将 ArrayType 的 2 列连接到 axis = 1 上?

python - 获取具有退出状态的单独变量中的 stderr 和 stdout

linux - 尽管设置了 MODULE_LICENSE,但仍收到消息 "module license ' 未指定的“污点内核”

c - 如何使用 u-boot 为 ARM 处理器加载应用程序

安卓 : programmatically copying apk to/system/app

c++ - 如何启动具有 root 权限的 QProcess?

python pandas dataframe 查找包含特定值的行并返回 bool 值

linux - 包裹 。 : C source files not allowed when not using cgo or SWIG: main. c

android - 我可以要求 Zygote 以 root 身份运行我的应用程序吗?