是否可以在脚本执行期间更改脚本内的用户默认组?
我需要在脚本中生成具有适当用户和组的文件,但我的用户的主要组不是谁应该拥有结果输出。
$ 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"
答案 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)
。