网站上有几个问题似乎与我的问题有关,但我都找不到解决方案。
我的操作系统是 Ubuntu 12.04。我已经mvn
安装了/tools/noarch/apache-maven-3.1.1
,并在文件末尾添加了以下几行/etc/profile
:
export M2_HOME=/tools/noarch/apache-maven-3.1.1
export PATH=$M2_HOME/bin:$PATH
之后我执行source /etc/profile
。
现在我的问题是:当我运行mvn --version
命令时成功并mvn
找到可执行文件,而如果我执行:sudo mvn --version
我得到的输出:sudo: mvn: command not found
。我知道PATH
当我执行命令时可能会有所不同sudo
,这就是我尝试这样做的原因:
$>sudo echo $PATH
/tools/noarch/apache-maven-3.1.1/bin:... some other stuff ...
我尝试的另一件事是执行sudo su -
然后输入mvn --version
。在这种情况下mvn
成功找到并且命令成功执行。这是怎么回事?
答案1
$PATH
由你的 shell 进行评估,因此你的检查无法按你预期的方式进行。
/etc/sudoers
配置为PATH
用默认值替换您的。
sudo
在执行命令之前不加载登录 shell 环境,因此使用默认的PATH
from 。会打开登录 shell,这涉及加载。请参阅第/etc/sudoers
su -
/etc/profile
man bash
调用。
只需删除PATH
中的重置即可/etc/sudoers
。这很可能是一条名为 的规则secure_path
。
CentOS
在 CentOS 中你可以添加PATH
到以下Defaults env_keep
部分:
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"
答案2
提供sudo
您当前的PATH
:
sudo env "PATH=$PATH" your_command
答案3
详细说明@opyate的答案,我正在使用以下shell脚本(例如mysudo
,可能命名为):
#!/bin/bash
sudo -E env "PATH=$PATH" "$@"
-E
告诉sudo
我们要保护环境。env "PATH=$PATH"
在调用之外扩展sudo
,使得外部PATH
在内部sudo
也可用(这是除了之外所必需的,-E
因为PATH
除了整个环境所接受的处理之外,通常还会接受特殊处理)。"$@"
将脚本接收到的参数传递给sudo
行。
将脚本保存在目录中的文件中PATH
,授予其+x
权限,等等。
答案4
我第一次安装时也遇到了同样的问题Maven在我添加了以下两行之后,问题就解决了,
export M2_HOME=/tools/noarch/apache-maven-3.1.1
export PATH=$M2_HOME/bin:$PATH
四个文件:
/root/.bashrc
/root/.profile
对于当前用户(mehran
是我的 Ubuntu 用户名):
/home/mehran/.bashrc
/home/mehran/.profile