sudo python运行旧的Python版本
我在CentOS 6上安装了python 2.7.3,按照这些步骤进行的:
http://villaroad.com/2010/10/rolling-python-2-6-2-on-centos-5-3/
我在root用户和我的用户的bash_profile中都添加了别名,这样可以使用新的python。现在,当我在命令行输入python时,两个用户都能正确运行python2.7.3。
但是,如果我输入sudo python,它还是会运行旧版本的python2.6.6。
这可能是什么问题呢?
4 个回答
我建议在调用脚本时使用 sudo -i
。直接引用自 man sudo:
-i [命令]
这个 -i 选项(模拟初始登录)会以目标用户的登录外壳运行在 passwd(5) 中指定的外壳。这意味着像 .profile 或 .login 这样的登录特定资源文件会被外壳读取。如果指定了命令,它会被传递给外壳执行。否则,就会启动一个交互式的外壳。sudo 会在运行外壳之前尝试切换到该用户的主目录。它还会初始化环境,保持 DISPLAY 和 TERM 不变,设置 HOME、MAIL、SHELL、USER、LOGNAME 和 PATH,以及 Linux 和 AIX 系统上 /etc/environment 的内容。其他所有环境变量都会被移除。
问题在于你的 $PATH
在执行时发生了变化。
你可以选择使用 sudo -E
:
-E 这个 -E(保留环境)选项会覆盖 sudoers(5) 中的 env_reset 选项。只有当匹配的命令有 SETENV 标签或者在 sudoers(5) 中设置了 setenv 选项时,这个选项才可用。
... 或者你可以直接指定你要执行的程序的完整路径,比如 sudo `which python`
。
(看起来你是按照文档使用了 alias
。这种方法也能处理这个问题。)
sudo
这个命令并不是通过你的命令行来运行其他命令,而是直接执行你指定的命令。这就意味着,(a) 没有人会去读取root用户的bash_profile
文件,所以你在里面写的东西根本没用,(b) 即使你设置了命令别名,使用的时候也不会起作用。
所以,如果你想用alias
来指定一个不同的Python版本,而不是系统默认的那个,你就不能用sudo python
来运行你想要的那个版本。
最简单、也可能是最安全的解决办法就是直接指定路径:运行sudo /path/to/other/python
。如果你经常需要这样做,可以为这个命令创建一个别名。
如果你真的想要,sudo
是可以使用命令行的。你可以明确地生成一个bash
命令行来运行python
,或者更简单地使用-s
或-i
选项。(在这种情况下,如果你想让root用户的~/.bash_profile
文件运行,-s
是没用的,但-i
会有效。)不过,用sudo
来启动命令行并不如用它来启动程序安全。你的sudoers
文件甚至可能被设置成不允许你这样做。(如果你想,可以用visudo
来修改,但在不完全理解的情况下打开安全漏洞通常被认为是个坏主意。)