使用:
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
绝对路径 = ♥