2016-06-28 2 views
0

У меня есть makefile и configure shell в моем проекте. Я написал код, чтобы попросить пользователя запустить configure shell в корневом режиме, используя следующий код.Попросить пользователя запустить makefile из корневого режима

[ "$(whoami)" != "root" ] && exec sudo -- "$0" "[email protected]" 

Но когда я бегу «make install» Мне нужно задать пользователю запускать из режима корневого каталога. Так что я просто скопировал код из оболочки configure и скопировал его в другой файл сценария оболочки под названием «runasroot.sh». Затем я запускаю этот сценарий оболочки из make install.

install: 
    @echo About to install XXX Project 
    ./runasroot.sh 
    find . -name "*.cgi" -exec cp {} $(SCRIPTDEST)/ \; 

Когда я запускаю вышеуказанный код, я получил следующую ошибку.

About to install XXX Project 
./runasroot.sh \; 
make: *** [install] Error 1 

runasroot.sh

#!/bin/bash 
[ "$(whoami)" != "root" ] && exec sudo -- "$0" "[email protected]" 
+5

Напоминать мне не использовать свой код. Не делайте ничего о принуждении 'root' в make-файле. Документ в файле README или INSTALL, который пользователь выполнил, выполнит 'make install' как' root'. Невероятно, что вам нужны привилегии root для компиляции. Лучше всего, если вы даже не требуете «root» для установки - разрешите пользователю устанавливать его как самостоятельно, если у них есть разрешение на запись в соответствующие каталоги. –

+0

Имеет ли 'runasroot.sh' только код, который вы показываете выше? Это не похоже на воспроизводимость. См. Инструкции по созданию [mcve]. – tripleee

+0

Ожидаете ли вы, что все будут работать без пароля root или просто счастливо введите пароль при каждом запросе? –

ответ

3

Есть несколько ошибок, сделанных здесь.

Первой проблемой является то, что вы пытаетесь сделать. Очень плохая форма требует, чтобы root был частью процесса сборки. Для части сборки попробуйте не требовать root для компиляции чего-либо. Если вам нужно создать специальные файлы как часть упаковки, используйте fakeroot или fakeroot-ng, чтобы получить тот же эффект без какой-либо фактической эскалации привилегий.

Для установки просто позвольте пользователю запустить весь файл make как root, если она так захочет. Многие операции, которые обычно требуют root, иногда нет. Например, make install не требует root, если установка установлена ​​в DESTDIR, где пользователь имеет привилегии.

Если вы все равно настроены на это, ваш поток полностью ошибочен. В то время как runasroot.sh выполняет именно то, что вы хотите, он делает это только для себя. Когда вы смотрите на ваш макияж получения:

install: 
    @echo About to install XXX Project 
    ./runasroot.sh # <<-- this line runs as root 
    find . -name "*.cgi" -exec cp {} $(SCRIPTDEST)/ \; 

runasroot.sh линия работает как корень, но find линия другой процесс, и совершенно не влияет.

Это верно для обычного сценария оболочки, но это вдвойне верно для получения квитанции. В сценарии оболочки каждая команда получает свой собственный процесс. В получении квитанции каждая команда получает свой собственный shell. Ваш runasroot.sh не влияет и не влияет на привилегии, по которым выполняется поиск.

Итак, что вы пытаетесь сделать, невозможно и нежелательно. Просто попробуйте установить и сбой, если у вас недостаточно разрешений.

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