使用sudo运行shell脚本时,
问题描述:
我在写一个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
答
试试这个..
sudo -i /path/to/script.sh
或..
sudo env PATH=$PATH /path/to/script.sh
或..
sudo -E /path/to/script.sh
其中一人应该工作,取决于你的系统。
答
有几个不同的解决方案,这个我已经找到了。
sudo -i [command]
和
sudo -s [command]
都工作,但您访问的命令-i,如果你在根目录里,所以你必须指定完整路径shell脚本(或把它放在你的垃圾箱里)。使用-s你可以像访问当前目录一样访问该命令。
你也可以使用这些脚本本身运行myscript.sh
,或者使用它们里面的这个脚本在你需要sudo访问的命令前面。我更愿意将它们放在这些命令的前面,因为我不必输入太多的内容来运行脚本!
答
是sudos下降的路径其实是个功能。不要试图通过复制用户的路径来解决这个问题,如一些示例所示。 (想象一下,如果一个坏的用户将bash复制到/ tmp/ls中,那么将设置PATH =/tmp /。根shell可能会执行ls
并意外地以root权限运行bash命令!糟糕,现在坏的用户有一个root shell。)
您可以通过添加这对您的脚本(略低于#!/bin/sh
)
. /etc/profile.d/extra-path.sh
的顶部添加额外的路径(。意为“读取该文件,如果它是这里抄”)
看看'男人sudoers',你可以反复折腾'secure_path','env_reset','env_keep','env_check',甚至可能是'exempt_group'。 – Wrikken 2013-04-23 23:43:08