Изменить группу по умолчанию в Script

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

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

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

Ответы

Ответ 1

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

#!/bin/bash

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

Ответ 2

Группа может быть установлена ​​из script. Это требует только "если", ниже. Группа проверяется, и если она неверна, тогда script перезапускается с указанной командой sg Nate.
Используется проверка на цикл (на случай непредвиденного случая).

Чтобы использовать, просто измените группу с "колеса" на желаемое. Замените раздел "DEMO" на обычный код.

Продолжайте читать ниже (после script.)

#! /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}

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

Этот первый журнал - это результат разрушения в обычной директории. script запускается как пользовательский frayser и group 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 "conman", потому что в качестве политики Configuration Management предоставляется групповое владение всеми каталогами 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 $ 

Из-за разрешений на каталоги может потребоваться для script явно устанавливают разрешения и права собственности.

Ответ 3

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

#!/bin/bash

sg groupb "touch myscript-output.txt"

Ответ 4

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

chgrp groupb myprog
chmod g+s myprog

Но это работает с обычными программами - не со сценариями оболочки (из соображений безопасности). Для оболочки script нет другого пути (по крайней мере, я не знаю (*)), кроме самого внутреннего script, чтобы вызвать 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().