更改脚本中的默认组

时间:2010-09-17 13:48:22

标签: linux bash shell

是否可以在脚本执行期间更改脚本内的用户默认组?

我需要在脚本中生成具有适当用户和组的文件,但我的用户的主要组不是谁应该拥有结果输出。

$ groups
groupa groupb

$ ./myscript.sh

$ ls -l
-rw-r--r-- 1 me groupa     0 Sep 17 09:42 myscript_output.txt

但我想要“groupb”。

myscript.sh:

#!/bin/bash

touch "myscript_output.txt"

4 个答案:

答案 0 :(得分:19)

尝试newgrp命令,该命令将用户的主要组更改为该用户所属的另一个组:

#!/bin/bash

newgrp groupb << END
    touch "myscript_output.txt"
END

答案 1 :(得分:4)

可以从脚本设置组。它只需要“如果” 声明如下。检查该组,如果不正确,则 使用sg命令Nate重新启动脚本。
采用循环检查(以防万一发生不可预见的情况。)

要使用,只需将组从“滚轮”更改为所需的组。用常规代码替换“DEMO”部分。

继续阅读(在剧本之后)。

#! /bin/sh
#    
# If the group(set with NEEDGRP) is already correct, or this code has already
# run, then this section is skipped and the rest of the 
# script is run; otherwise sg is called to restart the script with the
# desired group.  Assumes the command "id -ng" returns the group.

if ! [ "${SBREADY:=false}" = true -o $(id -ng) = ${NEEDGRP:=wheel} ] ; then
    export SBREADY=true
    exec sg $NEEDGRP "$0" "$@"
fi

# ---------------------- DEMO: CUT HERE ---------------------------
# This is a demonstration of creating files.
echo HELLO my group is $(id -ng), GID=$(id -g)
# NOTE: files are created with the current group only if the directory
# is not sgid.
# Show current directory and permissions on it
echo
pwd -P
ls -ld .
echo
# Create and list some new files, the remove them.
touch my-$$.{a,b,c}
echo Created  my-$$.{a,b,c}...
ls -l  my-$$.{a,b,c}
echo
rm -v  my-$$.{a,b,c}

以下是一些测试的打印输出,以解释为什么只更改组我不足以确保文件具有正确的组所有权。目录权限也会发挥作用。

第一个日志是常规目录中的ruining输出。该脚本以用户 frayser 和group frayser 运行。文件已创建 与所需的组。与下一个清单相比:

frayser@gentoo ~/src/Answers $ (cd /tmp; $OLDPWD/set-group.sh)
HELLO my group is wheel, GID=10

/tmp
drwxrwxrwt 16 root root 976 Sep 24 04:45 .

Created my-19201.a... my-19201.b... my-19201.c...
-rw-r----- 1 frayser wheel 0 Sep 24 04:53 my-19201.a
-rw-r----- 1 frayser wheel 0 Sep 24 04:53 my-19201.b
-rw-r----- 1 frayser wheel 0 Sep 24 04:53 my-19201.c

removed `my-19201.a'
removed `my-19201.b'
removed `my-19201.c'

现在,下一次运行发生在 sgid “conman”的导演中,因为作为一项策略,Configuration Management将获得所有 src 目录的组所有权。 注意:文件继承目录组。

frayser@gentoo ~/src/Answers $ ./set-group.sh 
HELLO my group is wheel, GID=10

/usr/lucho/src/frayser/practice
drwxr-s--- 6 frayser conman 768 Sep 24 04:51 .

Created my-19214.a... my-19214.b... my-19214.c...
-rw-r----- 1 frayser conman 0 Sep 24 04:54 my-19214.a
-rw-r----- 1 frayser conman 0 Sep 24 04:54 my-19214.b
-rw-r----- 1 frayser conman 0 Sep 24 04:54 my-19214.c

removed `my-19214.a'
removed `my-19214.b'
removed `my-19214.c'
frayser@gentoo ~/src/Answers $ 

由于目录权限,脚本可能需要 明确设置权限和所有权。

答案 2 :(得分:2)

sg命令可以做得很好。

#!/bin/bash

sg groupb "touch myscript-output.txt"

答案 3 :(得分:1)

通常可以通过向程序应用修改来实现:

chgrp groupb myprog
chmod g+s myprog

但这适用于普通程序 - 而不是shell脚本(出于安全原因)。对于shell脚本,没有其他方法(至少我不知道(*))除了从内部脚本本身调用chgrp

#!/bin/bash

FNAME="myscript_output.txt"
GRP=groupb

touch $FNAME
chgrp $GRP $FNAME || { echo 2>&1 "Can't change group of $FNAME to $GRP"; exit 1; }

(*)有些人为此目的写了一个小包装C程序。但那是愚蠢的。搜索网络的“setuid shell脚本” - 会有很多这样的示例C程序,并用[{3}} + getgrnam()替换最常见的setuid(0)