2016-06-28 8 views
0

Ich habe ein Makefile und konfigurieren Shell in meinem Projekt. Ich schrieb Code, um Benutzer zu bitten, configure shell im root-Modus mit dem folgenden Code auszuführen.Bitten Sie den Benutzer, Makefile vom Root-Modus auszuführen

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

Aber wenn ich laufe ‚make install‘ Ich brauche Benutzer zu fragen, von Root-Modus laufen zu lassen. Also habe ich einfach den Code aus der Konfigurations-Shell kopiert und in eine andere Shell-Skript-Datei namens 'runasroot.sh' kopiert. Dann starte ich dieses Shell-Skript von make install.

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

Wenn ich den obigen Code ausführen, habe ich den folgenden Fehler.

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

runasroot.sh

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

Erinnere mich daran, deinen Code nicht zu verwenden. Tun Sie nichts, wenn Sie "root" im Makefile erzwingen. Dokument in der README- oder INSTALL-Datei, die der Benutzer 'make install' als' root' ausführen soll. Es ist unwahrscheinlich, dass Sie Root-Rechte für die Kompilierung benötigen. Es ist am besten, wenn Sie nicht einmal "root" für die Installation anfordern - erlauben Sie dem Benutzer, es als sich selbst zu installieren, wenn sie die Erlaubnis haben, in die entsprechenden Verzeichnisse zu schreiben. –

+0

Enthält 'runasroot.sh' nur den oben angezeigten Code? Das sieht nicht so aus, als wäre es reproduzierbar. Siehe die Anweisungen zum Erstellen eines [mcve]. – tripleee

+0

Erwarten Sie, dass alle Benutzer ohne root-Passwort arbeiten oder einfach nur das Passwort eingeben, wenn Sie dazu aufgefordert werden? –

Antwort

3

Es gibt hier getan einige Fehler.

Das erste Problem ist, was Sie versuchen zu tun. Es ist sehr schlecht, root als Teil des Build-Prozesses zu verwenden. Versuchen Sie für den Build-Teil, keinen Root zum Kompilieren von irgendetwas zu benötigen. Wenn Sie spezielle Dateien als Teil der Verpackung erstellen müssen, verwenden Sie fakeroot oder fakeroot-ng, um den gleichen Effekt zu erhalten, ohne dass eine tatsächliche Rechteerweiterung vorliegt.

Zur Installation, lassen Sie den Benutzer einfach Ihre gesamte make-Datei als root ausführen, wenn sie dies wünscht. Viele Operationen, die in der Regel benötigen, benötigen root manchmal nicht. Zum Beispiel erfordert make install root nicht, wenn die Installation zu einem DESTDIR ist, wo der Benutzer Berechtigungen hat.

Wenn Sie aber trotzdem damit fertig sind, ist Ihr Ablauf völlig falsch. Während runasroot.sh genau das tut, was Sie wollen, tut es das nur für sich. Wenn Sie an Ihrem Make-Empfang aussehen:

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

Die runasroot.sh Linie läuft als root, aber die find Linie ist ein anderer Prozess, und ist völlig unberührt.

Das wäre für reguläre Shell-Skript, aber es gilt doppelt für einen Make-Empfang. In einem Shell-Skript erhält jeder Befehl seinen eigenen Prozess. Bei einem Kassenbon erhält jeder Befehl seine eigene Shell. Ihre runasroot.sh wirkt sich nicht auf die Berechtigungen aus, unter denen die Suche ausgeführt wird, und kann dies auch nicht tun.

Also, was Sie versuchen, ist sowohl unmöglich als auch unerwünscht. Versuchen Sie einfach zu installieren und scheitern Sie, wenn Sie nicht genügend Berechtigungen haben.

Verwandte Themen