我在CentOS 6上安装了python 2.7.3并附带说明
http://villaroad.com/2010/10/rolling-python-2-6-2-on-centos-5-3/
我为root和myuser的bash_profile添加了别名,用于新的python。 现在,当我将python写入shell时,它会正确地从两个用户运行python2.7.3。
但是,如果我写sudo python,它仍会运行旧版本python2.6.6
可能是什么问题?
答案 0 :(得分:13)
sudo
不使用你的shell来运行命令,只是直接exec
命令。这意味着(a)没有任何来源根bash_profile
,所以你放在那里并不重要,(b)shell别名即使设置也无关紧要。
因此,如果您想使用alias
es指定与PATH上的python不同的python,则不能使用sudo python
来运行相同的python。
最简单,也可能最安全的解决方法是明确:运行sudo /path/to/other/python
。如果您需要经常这样做,您可以随时为其创建别名。
如果你真的想要,你可以让sudo
使用shell。显式生成运行bash
的{{1}}命令行,或者(更简单地)只使用python
或-s
标志。 (在这种情况下,如果你试图让root -i
运行,~/.bash_profile
将无法执行,-s
将会这样做。)但是-i
shell不是和sudo
程序一样安全。您的sudo
甚至可能已明确配置为阻止您执行此操作。 (如果你愿意的话,你可以用sudoers
解决这个问题,但是在不明白你正在打开什么的情况下打开一个安全漏洞通常被认为是一件坏事。)
答案 1 :(得分:0)
我建议在调用脚本时使用sudo -i
。直接从man sudo:
-i [command]
-i(模拟初始登录)选项将目标用户的passwd(5)条目中指定的shell作为登录shell运行。这意味着shell将读取特定于登录的资源文件,如.profile或.login。如果指定了命令,则将其传递给shell以供执行。否则,执行交互式shell。在运行shell之前,sudo尝试更改为该用户的主目录。它还初始化环境,保持DISPLAY和TERM不变,设置HOME,MAIL,SHELL,USER,LOGNAME和PATH,以及Linux和AIX系统上/ etc / environment的内容。将删除所有其他环境变量。
答案 2 :(得分:0)
bin目录可能引用了旧版本的Python
> ls -la /usr/bin/python
lrwxrwxrwx 1 root root 9 Dec 21 2013 /usr/bin/python -> python2.7
将默认的python版本重定向到您想要的版本。
答案 3 :(得分:-1)
问题是你的$PATH
在执行时正在改变。
您可以使用sudo -E
:
-E -E(保留环境)选项将覆盖sudoers(5)中的env_reset选项。仅当匹配命令具有SETENV标记或者具有SETENV标记时,它才可用 setenv选项在sudoers(5)中设置。
...或者您可以指定可执行文件的完整路径。 sudo `which python`
。
(看起来你按照文档使用了alias
。这个方法也会处理它。)