60

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?

Ivaylo Strandjev
  • 753
  • 1
  • 7
  • 12
  • Related: [Why are PATH variables different when running via sudo and su?](http://unix.stackexchange.com/q/8646/21471) at Unix SE – kenorb Dec 24 '15 at 18:04

6 Answers6

52

Give sudo your current PATH with:

sudo env "PATH=$PATH" your_command
mikemaccana
  • 492
  • 5
  • 20
opyate
  • 1,914
  • 2
  • 14
  • 9
  • 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 '15 at 23:05
  • 1
    When I try to run this command I get `env: cmd: No such file or directory` - Any ideas why that would be? – Andy Apr 30 '15 at 08:47
  • 2
    @Andy replace cmd with your actual command. – opyate Apr 30 '15 at 09:23
  • how to sudo execute binaries in current directory `sudo: ./: command not found`. I am using Arch Linux. – Necktwi Aug 04 '18 at 12:37
47

$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.


CentOS

In CentOS you can add PATH to the Defaults env_keep section:

Defaults    env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR \
                        LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                        LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
                        LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \
                        LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \
                        _XKB_CHARSET XAUTHORITY PATH"
Daniel Beck
  • 109,300
  • 14
  • 287
  • 334
15

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à.

Tom
  • 246
  • 2
  • 7
4

Since the current answers are a little vague, the specific setting in /etc/sudoers changing your path is secure_path:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

You can modify it it with sudo visudo, or better yet, add the directories you need:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin
mikemaccana
  • 492
  • 5
  • 20
2

I had the same problem when I first installed Maven. The problem got solved after I added the two lines,

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

to four files:

/root/.bashrc
/root/.profile

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

/home/mehran/.bashrc
/home/mehran/.profile
Peter Mortensen
  • 12,090
  • 23
  • 70
  • 90
1

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.

MariusMatutiae
  • 46,990
  • 12
  • 80
  • 129
  • 1
    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. – Ivaylo Strandjev Jan 31 '14 at 09: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 09:23