Изменить группу по умолчанию в скрипте - PullRequest
15 голосов
/ 17 сентября 2010

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

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

$ 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 ]

19 голосов
/ 18 сентября 2010

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

#!/bin/bash

newgrp groupb << END
    touch "myscript_output.txt"
END
4 голосов
/ 24 сентября 2010

Группа может быть установлена ​​из скрипта.Требуется только утверждение «если» ниже.Группа проверяется, и если она неверна, то сценарий перезапускается с помощью команды sg, упомянутой Нейтом.
Используется проверка зацикливания (на случай непредвиденного.)

Для использования простосменить группу с "колеса" на желаемое.Замените раздел "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}

Ниже приведены распечатки некоторых тестов, чтобы объяснить, почему просто смена групп может быть недостаточной, чтобы гарантировать, что файлы имеют правогрупповая собственность.Разрешения на доступ к каталогам также вступают в игру.

Этот первый журнал представляет собой результат разрушения в обычном каталоге.Сценарий запускается как пользователь frayser и группа 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", потому что в качестве политики для Управления конфигурациями назначено групповое владение всеми 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 голосов
/ 18 сентября 2010

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

#!/bin/bash

sg groupb "touch myscript-output.txt"
1 голос
/ 17 сентября 2010

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

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» - таких примеров программ на С будет много, и вместо них вместо наиболее часто встречающихся setuid(0) 1010 * + setgid().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...