Установить эффективный идентификатор группы скрипта Perl - PullRequest
5 голосов
/ 29 мая 2009

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

Я пишу файлы в NetApp SAN. Каталог, в который я пишу, принадлежит пользователю devel и имеет группу devel с правами на запись в группу (0775). Имя пользователя, которое я пишу, в группах username и devel.

Проблема в том, что SAN проверяет только первую группу, поэтому я получаю отказ в разрешении. Если я использую команды newgrp или sg, чтобы изменить мою группу на devel, то я могу записать в каталог.

Сценарий, пытающийся сделать запись, написан на Perl, но запускается удаленно с другого компьютера через ssh и некоторые сценарии bash.

Я не могу изменить целевой каталог, чтобы он входил в группу username, потому что есть другие разработчики, и они находятся в разных группах (но мы все разделяем группу devel).

Я не могу сделать сам скрипт Perl setgid, потому что мы запускаем разные среды (devel, test, qa, production и т. Д.) С соответствующими группами, и я не хочу управлять битами прав доступа к файлам на этом уровне.

Я не могу использовать функцию POSIX setgid из скрипта Perl, потому что она не запускается от имени пользователя root (и у меня нет возможности получить root), поэтому мне отказано в разрешении. Присвоение $) и $( дает тот же результат.

Я не могу использовать команду newgrp от bash, потому что newgrp не принимает никаких аргументов, он просто запускает новую интерактивную оболочку (любые последующие команды выполняются после выхода из новой оболочки) .

Я также не могу использовать newgrp, чтобы запустить новую оболочку и создать оттуда скрипт Perl, поскольку скрипт Perl выполняется на удаленной машине через соединение ssh. Скрипт получит «свежую» оболочку на удаленной машине в моей группе по умолчанию, а не в группе, установленной через newgrp на локальной машине.

Я не могу использовать команду sg, потому что она принимает только один аргумент. Я цитирую полную командную строку, включая известные аргументы. Однако способ запуска удаленных процессов через ssh включает передачу локальных аргументов в переменной "$@" bash. Другими словами, я могу сделать process start или process stop, а скрипт process обрабатывает команду ssh и передает любые локальные аргументы, которые я набрал, используя "$@". Я пытался написать обертку, но обнаружил, что мы используем множество интересных форм локальных аргументов, и не решаюсь погрузиться в необходимые цитаты и избежать кошмара.

Итак, мой вопрос: кто-нибудь знает о каких-то других способах установки эффективного идентификатора группы для запущенного процесса, из Perl или bash? Существует ли форма с несколькими аргументами sg?

1 Ответ

3 голосов
/ 29 мая 2009

В верхней части вашего Perl-скрипта вы не можете поместить это:

if ( 0+$( != DEVEL_GROUP_ID ) { # primary group isn't devel
  my(@reinvoke) = ($0, map {quotemeta} @ARGV);
  exec('/usr/bin/sg', 'devel', "@reinvoke");
  die("/usr/bin/sg not found!  Can't change group!");
}

То есть, пусть Perl выполняет необходимый вызов sg.

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