1

我正在编写一个 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
4

3 回答 3

6

尝试这个..

sudo -i /path/to/script.sh

或者..

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

或者..

sudo -E /path/to/script.sh

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

于 2013-04-23T22:57:57.640 回答
2

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

您可以通过将其添加到脚本顶部来添加额外路径(就在 下方#!/bin/sh

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

(. 的意思是“读取这个文件,就好像它是在这里复制的一样”)

于 2013-04-24T03:18:12.327 回答
1

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

sudo -i [command]

sudo -s [command]

两者都可以,但是使用 -i 可以像在根目录中一样访问命令,因此您必须指定 shell 脚本的完整路径(或将其放入您的 bin 中)。使用 -s,您可以像在当前目录中一样访问该命令。

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

于 2013-04-24T02:46:29.057 回答