2010-09-17 4 views
15

Можно ли изменить группу пользователя по умолчанию внутри скрипта на время выполнения этого сценария?Изменить группу по умолчанию в скрипте

Мне нужно сгенерировать файлы в сценарии, которые имеют соответствующий пользователь и группу, но моя основная группа пользователя не является тем, кто должен иметь результирующий результат.

$ 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

У меня нет систем, где я сейчас под рукой, чтобы проверить (у моей текущей учетной записи только одна группа). Попробуйте 'chgrp groupb myscript.sh' +' chmod g + s myscript.sh'. Это должно изменить идентификатор группы, под которым работает скрипт, и, надеюсь, группа будет использоваться при создании новых файлов. – Dummy00001

ответ

19

Попробуйте newgrp команду, которая изменяет первичную группу пользователя в другую группу, к которой пользователь является членом:

#!/bin/bash 

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

Я хотел проголосовать за это, но не смог из-за начального голосования, которое я сделал за 30 минут до того, как принял ответ. – Nate

1

Обычно это может быть достигнуто путем применения к программе модификации:

chgrp groupb myprog 
chmod g+s myprog 

Но что работает с обычными программами - не со сценариями оболочки (по соображениям безопасности). Для сценария оболочки нет другого пути (по крайней мере, я не знаю (*)), кроме от самого внутри скрипта для вызова 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» - было бы много таких примеров программ на C и заменить наиболее часто встречающиеся там setuid(0) с getgrnam() + setgid().

2

Команда sg может сделать это очень хорошо.

#!/bin/bash 

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

Не может быть, что 'sg' не установлен по умолчанию в macOS? Это не для меня на HighSierra. – tutuca

4

Группа может быть установлена ​​из сценария. Для этого требуется только оператор if if . Группа проверяется, и если она неверна, то сценарий перезапускается с помощью команды 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" "[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

В bash с Fedora16 мне пришлось заменить 'exec sg $ NEEDGRP '$ 0" "$ @" 'на' exec sg $ NEEDGRP' $ 0 $ * "', но это имеет тот недостаток, что аргументы, содержащие IFS (обычно пробел), получат Трещина. – rstonehouse

Смежные вопросы