使用sudo时找不到命令


52

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

我的操作系统是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将成功找到并且命令成功。这里发生了什么?


Answers:


37

$PATH 是由外壳程序评估的,因此您的检查无法按预期进行。

/etc/sudoers配置为将您的计算机替换PATH为默认计算机。

sudo在执行命令之前不会加载登录Shell环境,因此使用默认的PATHfrom /etc/sudoerssu -确实打开了一个登录外壳,其中涉及加载/etc/profile。参见“ 发票”man bash部分。

只需删除中的PATH重置/etc/sudoers。这可能是称为的规则secure_path


CentOS的

在CentOS中,您可以添加PATHDefaults 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"

谢谢你的回答。它确实解决了问题,但是我更喜欢其他两个答案中的解决方案建议,因为它仅对maven执行更改,而不对PATH中的所有命令执行更改。
izomorphius 2014年

仅供参考:请注意我的答案更新。
kriegaex

如何sudo执行当前目录中的二进制文件sudo: ./<some_binary>: command not found。我正在使用Arch Linux。
Necktwi

47

sudo你目前PATH有:

sudo env "PATH=$PATH" your_command

一个很好的答案,不需要修改任何设置,让调用者执行所有必要的操作。我将-E另外使用该选项,以保留其余环境。实际上,这非常方便,可以将其放在脚本/别名/函数中以方便使用。我将其添加为单独的答案-但对@opyate表示敬意!
2015年

当我尝试运行此命令时,我得到env: cmd: No such file or directory-为什么会有这样的想法?
安迪

2
@Andy用您的实际命令替换cmd。
opyate 2015年

如何sudo执行当前目录中的二进制文件sudo: ./<some_binary>: command not found。我正在使用Arch Linux。
Necktwi

12

详细说明@opyate的答案,我正在使用以下shell脚本(mysudo例如,可以命名为):

#!/bin/bash
sudo -E env "PATH=$PATH" "$@"
  • -E告诉sudo保护环境。
  • env "PATH=$PATH"扩展到sudo呼叫外部,也使外部PATH可用sudo(除了,这是必需的,-E因为PATH通常除了对整个环境进行处理之外,还要接受特殊处理)。
  • "$@"将脚本接收的参数传递给该sudo行。

将脚本保存在的目录中的文件中PATH,并赋予其+x权限,等等。


对于那些不想编辑任何现有文件的用户来说,这是一个更好的解决方案。
qaisjp '16

4

由于当前答案有点模糊,因此/etc/sudoers更改路径的具体设置是secure_path

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

您可以使用对其进行修改sudo visudo,或者最好添加所需的目录:

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

2

第一次安装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

1

您必须完全像自己一样修改root的PATH变量,,在sudo的配置文件中添加这两行,该配置文件位于/root/.bashrc中,然后为其提供源代码。


1
我已经编辑了/root/.bashrc,但无法将其sudo source /root/.bashrc获取:gets:sudo: source: command not found并且没有得到sudo我的许可被拒绝(如预期的那样)。我认为启动新终端在理论上应该与源代码相同,但是启动新终端后,sudo mvn --version仍然找不到任何东西。
izomorphius 2014年

@izomorphius您无法使用sudo源。您必须首先使用命令sudo su切换到sudo ,然后才能获取有问题的文件。没有其他方法可以做到。
MariusMatutiae 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.