sudo python runs old python version

非 Y 不嫁゛ 提交于 2019-11-30 17:17:27

问题


I have installed python 2.7.3 on CentOS 6 with thse instructions

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

I have added aliases to bash_profile of both root and myuser for new python. Now when I write python to shell, it runs python2.7.3 correctly from both users.

However, if I write sudo python it stills runs old version python2.6.6

What could be the problem?


回答1:


sudo doesn't use your shell to run commands, it just execs the command directly. This means (a) there's nothing that sources root's bash_profile, so it doesn't matter what you put there, and (b) shell aliases wouldn't matter even if they were set.

So, if you want to use aliases to specify a different python than the one that's on your PATH, you can't use sudo python to run that same one.

The easiest, and probably safest, fix is to be explicit: run sudo /path/to/other/python. If you need to do this often enough, you can always create an alias for that.

If you really want to, you can make sudo use a shell. Either explicitly generate the bash command line that runs python, or (more simply) just use the -s or -i flags. (In this case, if you're trying to get root's ~/.bash_profile run, -s won't do it, but -i will.) But sudoing shells is not as safe as sudoing programs. Your sudoers may even be explicitly configured to prevent you from doing it. (You can fix that with visudo if you want, but opening a security hole without understanding exactly what you're opening is generally considered a bad thing to do.)




回答2:


I would suggest using sudo -i when calling the script. Straight from man sudo:

-i [command]

The -i (simulate initial login) option runs the shell specified in the passwd(5) entry of the target user as a login shell. This means that login-specific resource files such as .profile or .login will be read by the shell. If a command is specified, it is passed to the shell for execution. Otherwise, an interactive shell is executed. sudo attempts to change to that user's home directory before running the shell. It also initializes the environment, leaving DISPLAY and TERM unchanged, setting HOME , MAIL , SHELL , USER , LOGNAME , and PATH , as well as the contents of /etc/environment on Linux and AIX systems. All other environment variables are removed.




回答3:


The problem is that your $PATH is changing upon execution.

You can either use sudo -E:

-E The -E (preserve environment) option will override the env_reset option in sudoers(5)). It is only available when either the matching command has the SETENV tag or the setenv option is set in sudoers(5).

... or you can specify the full path to your executable. sudo `which python`.

(It looks like you used alias per the docs. This method would handle that too.)



来源:https://stackoverflow.com/questions/15441440/sudo-python-runs-old-python-version

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!