2011-03-06 44 views
0

我正试图编写一个bash脚本来设置我的web开发环境。作为设置脚本的过程的一部分,它需要编辑由root拥有的文件。它还需要在运行脚本的用户的public_html目录中创建字段。编写一个执行需要根权限的操作的bash脚本

因此,我是否应该要求脚本以超级用户身份运行?如果它应该,那么我如何获得它来访问当前用户的用户名?我通常会使用$ USER变量,但如果脚本以超级用户身份运行,我无法做到这一点。如果我不是超级用户,如何让脚本为某些操作请求超级用户权限,而不要求用户为每个需要超级用户权限的操作输入密码。

感谢

回答

3

您可以使用-do标志来保存环境变量,或者,您可以设置sudoers来保留每个命令的环境。

您还可以设置sudoers文件不要求对每个命令的基础密码,例如,允许用户XY使用smbmount不要求输入密码:

xy ALL=NOPASSWD: /usr/bin/smbmount 

在你情况下,这将是不够的,只是在一个变量的当前用户存储调用须藤之前,并使用已保存的用户名:

CURRENT_USER=$USER 

sudo yourscript.sh $CURRENT_USER 

然后从$ 1读取的用户名。 您也可以使用设置为正在调用sudo的用户的env变量SUDO_USER

+0

不知道-E,这很方便。 – Vamana 2011-03-06 15:54:52

1

有一个用于此目的的名为sudo命令。它允许您指定某些用户可以作为root用户(或其他用户)运行某些命令。

+0

耶哈,我已经要求脚本使用sudo运行,但是当脚本运行的所有sudo的环境变量发生变化。有没有办法在保留环境变量的同时运行sudo。 – 2011-03-06 02:50:16

0

如果您的用户无论如何都拥有root访问权限,您只需编写一个脚本,该脚本必须以超级用户身份运行,并将用户名作为参数,而不是提取用户名。

可替换地,在一个交互式壳拾取登录用户名的一种方式是:

stat -Lc %U /proc/self/fd/0 

此检索与标准输入相关联的TTY的ovner。

0

只是让它成为一个setuid文件。或者使用可能更安全的sudo,因为你可以限制谁可以运行它。

chmod 4755 script.sh 
+0

您不能setuid shell脚本。 http://www.faqs.org/faqs/unix-faq/faq/part4/section-7.html – 2011-03-06 15:47:29

+0

没错,你可以总是只有一个perl/python/c包装器,但这是我用过的一旦。 – atx 2011-03-07 00:20:58

0

在Ubuntu中,有SUDO_USER环境变量。

所以,你可以运行你的脚本sudo somescript.sh并让它拉动调用用户的用户名$SUDO_USER

不确定在其他dists,虽然。

2

在脚本的顶端插入检查:

# Make sure only root can run this script 
if [[ $EUID -ne 0 ]]; then 
    echo "This script must be run as root" 1>&2 
    exit 1 
fi 

在当你没有,你会被提示root权限运行是这样,那么你可以简单地重新运行的正确方法:

sudo yourscript.sh 

更多的相关信息在http://www.cyberciti.biz/tips/shell-root-user-check-script.html

+0

谢谢,但这并没有解决我如何维护对当前用户用户名的访问权限的问题。 – 2013-03-17 11:36:10

相关问题