Ответ 1
Попробуйте выполнить команду newgrp
, которая изменяет основную группу пользователя в другую группу, членом которой является этот пользователь:
#!/bin/bash
newgrp groupb << END
touch "myscript_output.txt"
END
Можно ли изменить группу пользователя по умолчанию внутри 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"
Попробуйте выполнить команду newgrp
, которая изменяет основную группу пользователя в другую группу, членом которой является этот пользователь:
#!/bin/bash
newgrp groupb << END
touch "myscript_output.txt"
END
Группа может быть установлена из 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 явно устанавливают разрешения и права собственности.
Команда sg
может сделать это довольно хорошо.
#!/bin/bash
sg groupb "touch myscript-output.txt"
Обычно это может быть выполнено путем применения к программе изменений:
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()
.