2013-04-23 195 views
1

我在写一个shell脚本来启动几道工序,我的用户路径是不可用的。因为这些进程需要sudo访问,所以我使用sudo运行shell脚本。但是,当我这样做时,我无法访问我的路径变量。我已经为/etc/profile.d/extra-path.sh添加了一个shell脚本,它为我的用户添加了这些脚本。使用sudo运行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 
+0

看看'男人sudoers',你可以反复折腾'secure_path','env_reset','env_keep','env_check',甚至可能是'exempt_group'。 – Wrikken 2013-04-23 23:43:08

回答

6

试试这个..

sudo -i /path/to/script.sh 

或..

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

或..

sudo -E /path/to/script.sh 

其中一人应该工作,取决于你的系统。

+0

当我尝试这样做,它给我的错误:'-sh:./script.sh:没有这样的文件或directory'。你知道这是为什么吗? – CorayThan 2013-04-23 23:19:59

+0

@ CorayThan-你的脚本命名为'script.sh',它是否是chmoded? – vidit 2013-04-23 23:21:07

+0

好吧,我真的尝试过start-mongod-jboss.sh。真正的问题将是chmoded。 chmoding脚本有什么作用?该系统是一个CentOS Linux服务器。 – CorayThan 2013-04-23 23:32:58

1

有几个不同的解决方案,这个我已经找到了。

sudo -i [command] 

sudo -s [command] 

都工作,但您访问的命令-i,如果你在根目录里,所以你必须指定完整路径shell脚本(或把它放在你的垃圾箱里)。使用-s你可以像访问当前目录一样访问该命令。

你也可以使用这些脚本本身运行myscript.sh,或者使用它们里面的这个脚本在你需要sudo访问的命令前面。我更愿意将它们放在这些命令的前面,因为我不必输入太多的内容来运行脚本!

2

是sudos下降的路径其实是个功能。不要试图通过复制用户的路径来解决这个问题,如一些示例所示。 (想象一下,如果一个坏的用户将bash复制到/ tmp/ls中,那么将设​​置PATH =/tmp /。根shell可能会执行ls并意外地以root权限运行bash命令!糟糕,现在坏的用户有一个root shell。)

您可以通过添加这对您的脚本(略低于#!/bin/sh

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

的顶部添加额外的路径(。意为“读取该文件,如果它是这里抄”)