Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

There are a few question on the site that seem related to my problem but I could not find a solution in any of them.

My operating system is Ubuntu 12.04. I have mvn installed in /tools/noarch/apache-maven-3.1.1 and I have added the following lines at the end of my /etc/profile:

export M2_HOME=/tools/noarch/apache-maven-3.1.1
export PATH=$M2_HOME/bin:$PATH

After that I execute source /etc/profile.

Now my problem is: when I run mvn --version the command succeeds and mvn executable is found, while if I execute: sudo mvn --version I get the output: sudo: mvn: command not found. I know that PATH may be different when I execute a command with sudo and that is why I tried this:

$>sudo echo $PATH
/tools/noarch/apache-maven-3.1.1/bin:... some other stuff ...

Another thing I tried is to execute sudo su - and then type mvn --version. In this case mvn is successfully found and the command succeeds. What is going on here?

share|improve this question

5 Answers 5

up vote 12 down vote accepted

$PATH is evaluated by your shell, so your check doesn't work as you expect it to.

/etc/sudoers is configured to replace your PATH with a default one.

sudo does not load a login shell environment before executing the command, so the default PATH from /etc/sudoers is used. su - does open a login shell, which involves loading /etc/profile. See man bash, section INVOCATION.

Just remove the PATH reset in /etc/sudoers. It's likely a rule called secure_path.

share|improve this answer
    
Thank you for the answer. It does solve the problem, but I prefer the solution suggestion in the other two answers as it performs a change only for maven, not for all commands in my PATH. –  izomorphius Jan 31 '14 at 9:28

You must modify root's PATH variable exactly like you did for yourself, i.e. by adding those two lines in sudo's profile, which is located in /root/.bashrc, then source it.

share|improve this answer
    
I have edited /root/.bashrc but am not able to source it: sudo source /root/.bashrc gets: sudo: source: command not found and without the sudo I get permission denied(as expected). i believe starting a new terminal should in theory do the same as source, but after starting a new terminal, sudo mvn --version still does not find anything. –  izomorphius Jan 31 '14 at 9:20
    
@izomorphius You cannot sudo source. You must first switch to sudo with the command sudo su, then you can source the file in question. There is no other way to do it. –  MariusMatutiae Jan 31 '14 at 9:23

I had the same problem when I first installed maven, the problem got solved after I added those 2 lines:

export M2_HOME=/tools/noarch/apache-maven-3.1.1
export PATH=$M2_HOME/bin:$PATH

to 4 files

/root/.bashrc
/root/.profile

and for the current user (mehran is my ubuntu username):

/home/mehran/.bashrc
/home/mehran/.profile
share|improve this answer

Give sudo your current PATH with:

sudo env "PATH=$PATH" cmd
share|improve this answer
    
A great answer, which does not require modifying any settings, letting the caller do everything which is necessary. I would use the -E option in addition, to preserve the rest of the environment. In fact, this is so handy it can be put in a script/alias/function for easy use. I'll add this as a separate answer - but kudos to @opyate! –  Tom Mar 31 at 23:05

Elaborating on @opyate's answer, I am using the following shell script (which may be named mysudo, for example):

#!/bin/bash
sudo -E env "PATH=$PATH" "$@"
  • -E tells sudo to preserve the environment.
  • env "PATH=$PATH" is expanded outside the sudo call, making the external PATH available inside the sudo too (this is required in addition to the -E as the PATH usually receives special treatment in addition to the treatment the entire environment receives).
  • "$@" passes the arguments our script receives to the sudo line.

Save the script in a file in a directory in the PATH, give it +x permissions, et voilà.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.