7

我已经按照这些说明在 CentOS 6 上安装了 python 2.7.3

http://villaroad.com/2010/10/rolling-python-2-6-2-on-centos-5-3/

我已经为新 python 的 root 和 myuser 的 bash_profile 添加了别名。现在,当我将 python 写入 shell 时,它会从两个用户正确运行 python2.7.3。

但是,如果我写 sudo python 它仍然运行旧版本 python2.6.6

可能是什么问题呢?

4

4 回答 4

16

sudo不使用你的shell来运行命令,它只是exec直接的命令。这意味着 (a) 没有任何来源 root's bash_profile,因此放在那里的内容无关紧要,并且 (b) 即使设置了 shell 别名也无关紧要。

因此,如果您想使用aliases 指定与 PATH 中的 Python 不同的 Python,则不能使用它sudo python来运行相同的 Python。

最简单,也可能是最安全的修复方法是明确的:运行sudo /path/to/other/python。如果您需要经常这样做,您总是可以为此创建一个别名。

如果你真的想,你可以使用sudoshell。要么显式生成bash运行的命令行python,要么(更简单地)只使用-sor-i标志。(在这种情况下,如果您试图让 root~/.bash_profile运行,-s不会这样做,但会这样做-i。)但是sudoing shell 不如sudoing 程序安全。您sudoers甚至可能被明确配置为阻止您这样做。(如果你愿意,你可以解决这个问题visudo,但是在不了解你正在打开什么的情况下打开一个安全漏洞通常被认为是一件坏事。)

于 2013-03-15T20:26:50.767 回答
0

我建议sudo -i在调用脚本时使用。直接来自man sudo

-i [命令]

-i(模拟初始登录)选项将目标用户的 passwd(5) 条目中指定的 shell 作为登录 shell 运行。这意味着 shell 将读取特定于登录名的资源文件,例如 .profile 或 .login。如果指定了命令,则将其传递给 shell 执行。否则,将执行交互式 shell。sudo 在运行 shell 之前尝试更改到该用户的主目录。它还初始化环境,保持 DISPLAY 和 TERM 不变,设置 HOME 、 MAIL 、 SHELL 、 USER 、 LOGNAME 和 PATH ,以及 Linux 和 AIX 系统上 /etc/environment 的内容。所有其他环境变量都被删除。

于 2013-03-15T20:33:41.607 回答
0

bin 目录可能引用了旧版本的 Python

> ls -la /usr/bin/python
lrwxrwxrwx 1 root root 9 Dec 21  2013 /usr/bin/python -> python2.7

将默认的 python 版本重定向到您想要的版本。

于 2020-11-18T20:11:33.403 回答
-1

问题是您$PATH在执行时正在改变。

您可以使用sudo -E

-E -E(保留环境)选项将覆盖 sudoers(5) 中的 env_reset 选项。仅当匹配的命令具有 SETENV 标记或在 sudoers(5) 中设置了 setenv 选项时,它才可用。

...或者您可以指定可执行文件的完整路径。sudo `which python`.

(看起来您alias按照文档使用。此方法也可以处理。)

于 2013-03-15T20:39:16.183 回答