2010-09-17 79 views
15

是否可以在該腳本執行期間更改腳本中的用戶默認組?更改腳本中的默認組

我需要在具有正確用戶和組的腳本中生成文件,但我的用戶的主組不是誰應擁有結果輸出。

$ groups 
groupa groupb 

$ ./myscript.sh 

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

但我想 「組B」。

myscript.sh:

#!/bin/bash 

touch "myscript_output.txt" 
+0

沒有系統,我現在手中的根目前來測試(我目前的帳戶只有一個組)。嘗試'chgrp groupb myscript.sh' +'chmod g + s myscript.sh'。這應該會更改腳本運行的組標識 - 並且希望在創建新文件時使用該組。 – Dummy00001 2010-09-17 13:58:12

回答

19

嘗試newgrp命令,改變用戶的主要組成另一種基團,其中該用戶是一個成員:

#!/bin/bash 

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

我想爲此投票,但由於在我接受答案前30分鐘進行了初始上下投票,因此無法投票。 – Nate 2010-09-28 04:44:22

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程序。但是這是kludgy。搜索「setuid shell腳本」的網絡 - 將會有很多這樣的示例C程序並且在setuid(0)處用getgrnam() + setgid()代替。

2

sg命令可以做到這一點很好。

#!/bin/bash 

sg groupb "touch myscript-output.txt" 
+0

難道是''sg'沒有安裝默認情況下在macOS?在HighSierra上我失敗了。 – tutuca 2017-12-28 02:56:46

4

該組可以從腳本中設置。它只需要下面的「if」 聲明。該組被檢查並且如果它不正確,那麼 腳本將使用s命令Nate提到的重新啓動。
使用循環檢查(以防萬一不可預見的情況發生)。

要使用,只需將組從「wheel」更改爲所需的組。用常規代碼替換「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" "[email protected]" 
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} 

以下是一些測試的打印順序運行解釋爲什麼只是改變組我不足以確保文件有正確的組所有權。目錄權限也起作用。

該第一個日誌是從常規目錄中破壞的輸出。該腳本以用戶frayser和羣組frayser運行。使用所需的組創建文件 。比較下一個清單:

[email protected] ~/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「賭俠」,因爲作爲一種政策,配置管理被賦予所有SRC目錄的組所有權。 注意:這些文件繼承了該目錄的組。

[email protected] ~/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' 
[email protected] ~/src/Answers $ 

因爲目錄的權限,它可能爲一個腳本來 明確設置權限和所有權是必要的。

+1

在使用Fedora16的bash上,我不得不用'exec sg $ NEEDGRP「$ 0 $ *'替換'exec sg $ NEEDGRP」$ 0「」$ @「',但這樣做的缺點是包含IFS的參數(通常是空格)分裂。 – rstonehouse 2013-06-24 09:24:55