sudopython运行旧的python版本

sudopython运行旧的python版本,python,centos,sudo,centos6,Python,Centos,Sudo,Centos6,我已经在CentOS 6上安装了python 2.7.3,并附带了这些说明 我已经为新python的root和myuser的bash_配置文件添加了别名。 现在,当我将python写入shell时,它可以从两个用户处正确运行python2.7.3 然而,如果我编写sudopython,它仍然运行旧版本的python2.6.6 有什么问题吗?sudo不使用shell运行命令,它只是直接执行命令。这意味着(a)根本没有源于root的bash_profile,所以放在那里的内容无关紧要,(b)she

我已经在CentOS 6上安装了python 2.7.3,并附带了这些说明

我已经为新python的root和myuser的bash_配置文件添加了别名。 现在,当我将python写入shell时,它可以从两个用户处正确运行python2.7.3

然而,如果我编写sudopython,它仍然运行旧版本的python2.6.6


有什么问题吗?

sudo
不使用shell运行命令,它只是直接执行命令。这意味着(a)根本没有源于root的
bash_profile
,所以放在那里的内容无关紧要,(b)shell别名即使被设置也无关紧要

因此,如果您想使用
alias
es指定不同于路径上的python,则不能使用
sudo python
运行相同的python

最简单也是最安全的修复方法是显式的:运行
sudo/path/to/other/python
。如果需要经常执行此操作,则始终可以为此创建别名


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

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

-i[命令]

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


问题是执行时,
$PATH
正在更改

您可以使用
sudo-E

-E选项-E(保留环境)将覆盖sudoers(5)中的环境重置选项。仅当匹配命令具有SETENV标记或 setenv选项在sudoers(5)中设置

。。。也可以指定可执行文件的完整路径
sudo`whichpython`


(看起来您在文档中使用了
alias
。此方法也可以处理此问题。)

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

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

将默认python版本重定向到所需的版本。

这是一个路径问题,请参见“否”,不是。他“为新python添加了别名”。这意味着新的python一开始就不在路径上。因此,
sudo
丢弃路径并不重要,这显然需要您(在sudoers中)具有访问权限才能运行shell。如果您已经拥有/需要该访问权限,这不是问题。但我不建议添加它只是为了使sudo一个特定的Python安装变得更容易……问题不在于他的路径在执行时发生了变化。查看对问题的评论,或F.J删除的答案,或只是阅读问题。而且
-E
对别名没有帮助;您需要
sudo
一个shell来获取shell别名(可以是显式的,也可以是通过
-s
-i
)。@abarnert使用“sudo
哪个python
”来处理它,不过.比
sudo/path/to/other/python foo.py
简单一点的是
sudo`which python`foo.py
@anthonybell:如果另一条python在你的
$path
上,那就行了,但如果它是一个别名,就不行了,而这正是OP所要问的。我想您可以使用
/usr/bin/which
而不是
bash
内置;我相信CentOS 6附带的GNU工具版本有一个
--read alias
标志或类似的标志,因此您可以执行类似
sudo$(alias |它--read alias python)
的操作。(这是我一时想不起来的;我现在还没有一台机器可以测试。)