2010-07-14 1 views
3

Предположим, у меня есть сценарий оболочки, который запускает кучу других суб-скриптов. Я решаю, что мой скрипт должен быть запущен как root, потому что первые несколько под-скриптов, которые он запускает, должны выполняться как root. Тем не менее, есть два суб-скрипта, выполняемых супер-скриптом, который не может быть запущен как root. Предполагая, что мой скрипт был запущен как root, как мне отменить его для двух последних суб-скриптов? Возможно ли это?Как стать не-root в середине скрипта оболочки, выполняемого как root? Возможное?

ответ

1

использовать команду su для запуска команды, которую вы хотите запустить как какой-либо другой пользователь.

su nobody ls /tmp 
+0

Это не обязательно неправильно, но вероятность того, что суб-скрипт должен написать файл системы, в этот момент (AIUI) нельзя использовать 'nobody'. – zwol

+0

Он был не таким уж конкретным. Он спросил, как запустить скрипт как пользователь без полномочий root. Я ответил. Я привел пример. Sheesh. – nsayer

+1

Я не хочу быть таблеткой, но я перехожу на примеры, которые случайно используют 'nobody', потому что неправильное использование« nobody »открывает дыры в безопасности. – zwol

4

Необходимо, чтобы пользователь, не являющийся пользователем root, мог работать под суб-скриптами. Назовем этого пользователя fred. Тогда ваш скрипт с привилегиями суперпользователя может просто сделать ответ

su fred /path/to/subscript-A 
su fred /path/to/subscript-B 

Contra nsayer, вы, вероятно, не можете использовать nobody для этого, потому что вся суть nobody в том, что он имеет право писать на ничего. Иногда это именно то, что вы хотите, но я уверен, что ваши суб-скрипты должны записываться в файловую систему ...

+0

Точка Zack находится в том, что пользователь должен быть «человеком» с оболочкой, чтобы делать что-нибудь полезное, например, «nobody» или «www-data» не будет работать. Это хороший момент, но не нужно 'su fred (некоторая команда)' каждый раз ... просто 'su fred', затем выдавать любые команды как fred в отдельных командах, а затем' exit'. –

+2

@no: Это работает только если у вас есть интерактивная оболочка; из скрипта вы должны дать команду 'su fred'. Вы можете, конечно, объединить кучу команд в суб-скрипт и передать это 'su', но это звучит так, как это сделал OP. Кроме того, fyi, 'su -s/bin/sh fred - -c exec/path/to/subscript' будет работать, даже если' fred' не имеет оболочки в '/ etc/passwd', и вы можете предпочесть' fred' таким образом, если эта учетная запись используется только из скрипта (что, вероятно, является хорошей идеей) – zwol

+0

Zack, спасибо, что очистил это :) –

Смежные вопросы