使用sudo运行shell脚本时,用户路径不可用

时间:2013-04-23 22:48:25

标签: linux bash sh

我正在编写一个shell脚本来为我启动一些进程。因为这些进程需要sudo访问,所以我用sudo运行我的shell脚本。但是,当我这样做时,我无法访问我的路径变量。我在/etc/profile.d/extra-path.sh中添加了一个shell脚本,为我的用户添加了这些脚本。

有人可以告诉我我应该添加这些路径变量的方式,以便在使用sudo运行的shell脚本中访问它们,还是有办法在shell脚本本身中使用我的用户路径运行命令?

这是我想要工作的脚本:

#!/bin/bash
#start stuff up

nohup mongod 
#mongod fails as an unknown command, even though it's part of my path

nohup /cust/env/local/cust/jboss-5.1.0.GA/bin/run.sh -b 0.0.0.0 -Djava.awt.headless=true
#jboss needs access to the JAVA_HOME path variable which 
#doesn't exist on the path used in this shell script

3 个答案:

答案 0 :(得分:6)

试试这个..

sudo -i /path/to/script.sh

或..

sudo env PATH=$PATH /path/to/script.sh

或..

sudo -E /path/to/script.sh

其中一个应该可以工作,具体取决于您的系统。

答案 1 :(得分:2)

sudos掉落路径的事实是一个特征。不要尝试通过复制用户的路径来解决它,如某些示例所示。 (想象一下,如果一个坏用户将bash复制到/ tmp / ls,然后设置PATH = / tmp /。根shell可能会ls并意外地以root权限运行bash命令!糟糕,坏用户现在有一个root shell。)

您可以添加额外路径,方法是将其添加到脚本顶部(仅在#!/bin/sh下)

. /etc/profile.d/extra-path.sh

(。表示“读取此文件就像在此处复制一样”)

答案 2 :(得分:1)

我发现了一些不同的解决方案。

sudo -i [command]

sudo -s [command]

两者都可以工作,但是使用-i可以访问命令,就好像你在根目录中一样,所以你必须指定shell脚本的完整路径(或者把它放在你的bin中)。使用-s可以访问该命令,就像您在当前目录中一样。

您也可以使用它们来运行myscript.sh脚本本身,或者在您需要sudo访问权限的命令前面的脚本中使用它们。我更喜欢把它们放在那些命令前面,因为我不需要输出那么多来运行我的脚本!