使用 sudo 时未找到命令

使用 sudo 时未找到命令

网站上有几个问题似乎与我的问题有关,但我都找不到解决方案。

我的操作系统是 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 环境,因此使用默认的PATHfrom 。会打开登录 shell,这涉及加载。请参阅第/etc/sudoerssu -/etc/profileman 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

相关内容