路径中的 sudo 问题

路径中的 sudo 问题

使用:

Linux nomemory 2.6.32-24-generic #43-Ubuntu SMP Thu Sep 16 14:17:33 UTC 2010 i686 GNU/Linux

我有一个$HOME名为的文件夹~/.scriptfarm/scripts,其中保存着我的一些自定义脚本。

nomemory@nomemory:~$ ls -l /home/nomemory/.scriptfarm/script
total 20
-rwxr-xr-x 1 nomemory nomemory 10 2010-09-21 01:31 aaa
-rwxr-xr-x 1 nomemory nomemory 31 2010-09-21 00:47 pt.chc
-rwxr-xr-x 1 nomemory nomemory 35 2010-09-21 00:47 pt.int
-rwxr-xr-x 1 nomemory nomemory 34 2010-09-21 00:47 pt.rem
-rwxr-xr-x 1 nomemory nomemory 54 2010-09-21 00:47 pt.up

问题是,在 Ubuntu 中,所有以 为前缀的脚本都无法运行sudo。在 Arch 上,行为有所不同,但脚本可以正常运行。

让我给你举个例子(aaa是一个 foobar 类型的脚本):

nomemory@nomemory:~$ aaa
aaa
nomemory@nomemory:~$ sudo aaa
sudo: aaa: command not found
nomemory@nomemory:~$

如果回显 $PATH:

nomemory@nomemory:~$ sudo echo $PATH
/home/nomemory/.scriptfarm/script:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

您知道为什么我在脚本前加上 后就不起作用吗sudo?有什么解决办法吗?

稍后编辑: 我发现的解决方法是为 sudo: 添加一个别名sudo env PATH=$PATH $@

答案1

您的测试具有误导性,因为 PATH 在调用 sudo 之前就已展开。相反,请执行以下操作:

sudo sh -c 'echo $PATH'

你会发现还有一条不同的路。

要将其包含/home/nomemory/.scriptfarm/scripts在系统范围的 PATH 中,您可以修改/etc/profile

PATH="$PATH:/home/nomemory/.scriptfarm/scripts"

答案2

在 Ubuntu(至少 10.04)中,sudoers文件中有一个重置环境的选项。

Defaults    env_reset

您可以删除它,或者您应该能够根据每个用户使用 SETENV 来保留旧环境。

手册页中提到env_reset

如果设置,sudo 将重置环境以仅包含 LOGNAME、SHELL、USER、USERNAME 和 SUDO_* 变量。然后添加调用者环境中与 env_keep 和 env_check 列表匹配的任何变量。当 root 使用 -V 选项运行 sudo 时,将显示 env_keep 和 env_check 列表的默认内容。如果设置了 secure_path 选项,则其值将用于 PATH 环境变量。此标志默认为启用状态。

答案3

问题似乎在于 Ubuntu 使用该SECURE_PATH选项编译 sudo,因此无法传递您的 PATH 环境。您可以-V在以 root 身份运行时指定该选项来查看此问题。因此,该命令sudo sudo -V会转储默认列表。看来唯一的解决方法是重新编译 sudo。

答案4

将这些文件所在的位置替换nomemory为您的用户帐户的名称:

sudo ~nomemory/.scriptfarm/scripts/aaa

绝对路径 = ♥

相关内容