2014-04-28 1 views
1

Я пишу скрипт bash, который создает каталоги и копирует файлы в Mac OSX. Некоторые из этих каталогов и файлов должны быть помещены в папки, принадлежащие системе, такие как /Library/Audio/Plug-Ins, поэтому я запускаю сценарий под sudo. Такой сценарий может выглядеть следующим образом:Пользователь по умолчанию для файлов и каталогов, созданных в bash под sudo

copy-plugins.sh:

#!/usr/bin/env bash 
mkdir -p /Library/Audio/Plug-Ins/My-Plugins 
cp plugin-A.dylib /Library/Audio/Plug-Ins/My-Plugins 
cp plugin-B.dylib /Library/Audio/Plug-Ins/My-Plugins 

и называется:

$ sudo ./copy-plugins.sh 

Однако при работе под Суда, все созданные каталоги и скопированные файлы принадлежат корню.

Я хотел бы иметь возможность запускать скрипт под sudo и иметь файлы, принадлежащие моему пользователю. я мог бы назвать CHOWN после каждого файла/каталога создается или скопирована

copy-plugins-cumbersome.sh:

#!/usr/bin/env bash 
mkdir -p /Library/Audio/Plug-Ins/My-Plugins 
chown 501:501 /Library/Audio/Plug-Ins/My-Plugins 

cp plugin-A.dylib /Library/Audio/Plug-Ins/My-Plugins 
chown 501:501 /Library/Audio/Plug-Ins/My-Plugins/plugin-A.dylib 

cp plugin-B.dylib /Library/Audio/Plug-Ins/My-Plugins 
chown 501:501 /Library/Audio/Plug-Ins/My-Plugins/plugin-B.dylib 

, но я надеюсь на более общее решение.

Насколько я могу судить, нет никакого setuid для bash.

ответ

2

Используйте параметр cp -p для сохранения атрибутов файлов.

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

+0

Использование ср -p создает файлы с _unknown пользователя и группы: '-rwxr-хт-х 1 _unknown _unknown 0 28 апреля 12:43 плагин-A.dylib' ' -rwxr-хт-х 1 _unknown _unknown 0 28 апр 12:43 plugin-B.dylib' странный .... –

+0

Кажется, что нет способа установить uid из сценария bash, поэтому я принимаю этот ответ, хотя он лишь частично отвечает на вопрос. Благодаря! –

+0

привет - в случае, если вы можете установить uid из sudo: 'sudo -u 501 your-script.sh' – suspectus

1

Как вам нужно sudo для копирования в каталоги, которые вы копируете в сценарий, это означает, что вам нужно быть root, чтобы копировать что-либо в этих каталогах.

Когда вы делаете sudo, вы являетесь root для этой конкретной команды или скрипта, поэтому все, что будет создано или выполнено, будет иметь права root. До тех пор, пока вы укажете.

возможные способы, чтобы выйти из него, ничего не меняя:

  1. Тот, который вы используете, и
  2. Другое один использовать -p или -a с cp
  3. rsync -go <source file> <destination file>

    -g для сохранения группы и -o для сохранения права собственности.

Примечание Если вы делаете chown из сценария, вам придется специально делать sudo chown поскольку файлы, которые вы бы трогательным принадлежат корню.

+0

Выполнение chown для каждой команды требует, чтобы я заранее знал uid пользователя. Это мешает мне создать генераторный скрипт, который может использоваться всеми пользователями. –

+0

no для того, чтобы пользователь chown не был известен, вы можете использовать 'id -u' для идентификатора пользователя и' id -g' для groupid. Кроме того, я добавил rsync как sol, проверьте, работает ли оно для вас или нет. Все они работают на меня. – PradyJord

+0

Использование rsync -go лучше, чем chown, так как оно не требует пользовательских настроек. Однако даже с rsync скопированные файлы получают _unknown пользователя и группу. –