使用:
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是一个foobartypes的脚本):
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前缀。 任何解决scheme
稍后编辑:我发现的解决方法是为sudo添加一个别名: sudo env PATH=$PATH $@ 。
你的testing是误导性的,因为在调用sudo之前PATH被扩展了。 相反,做:
sudo sh -c 'echo $PATH'
你会看到有一个不同的path。
要在系统范围的PATH中包含/home/nomemory/.scriptfarm/scripts ,可以修改/etc/profile :
PATH="$PATH:/home/nomemory/.scriptfarm/scripts"
在Ubuntu(至less10.04) sudoers文件中有一个选项来重置环境。
Defaults env_reset
您可以删除它,或者您应该能够在每个用户的基础上使用SETENV来保留旧的环境。
手册页说env_reset :
如果设置,sudo将重置环境以仅包含LOGNAME,SHELL,USER,USERNAME和SUDO_ *variables。 然后添加调用方环境中与env_keep和env_check列表匹配的任何variables。 使用-V选项以root身份运行sudo时,会显示env_keep和env_check列表的默认内容。 如果设置了secure_path选项,则其值将用于PATH环境variables。 此标志默认打开。
看起来问题在于Ubuntu使用SECURE_PATH选项编译sudo,因此无法传递PATH环境。 您可以通过以root身份运行时指定-V选项来查看。 因此,命令sudo sudo -V转储一个默认列表。 看来唯一的解决方法是重新编译sudo。
您可以使用which aaa来找出aaa所在的位置,然后从那里运行它。 如果没有,你可能能够
sudo 'export PATH='$PATH'; aaa'
使用nomemoryreplace这些文件所在的用户帐户的名称:
sudo ~nomemory/.scriptfarm/scripts/aaa
绝对path=♥