2016-06-28 3 views
0

私はmakefileを持っていて、自分のプロジェクトにシェルを設定しています。私は次のコードを使用してrootモードでconfigureシェルを実行するようにユーザーに要求するコードを書きました。rootモードから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

コードを使用しないように注意してください。 makefileに 'root'を強制することについて何もしないでください。 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は、インストールがユーザーに特権を持つDESTDIRにインストールされている場合はrootを必要としません。

しかし、これをやり遂げると死んだ場合、あなたの流れは完全に間違っています。 runasroot.shはあなたがしたいことを正確に行いますが、それ自体のためだけです。あなたのメイクの領収書を見てみると:

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

runasroot.shラインは、rootとして実行されますが、findラインは、異なるプロセスであり、かつ完全に影響を受けません。

これは通常のシェルスクリプトでは当てはまりますが、makeレシートでは2倍に当てはまります。シェルスクリプトでは、各コマンドは独自のプロセスを取得します。領収書では、各コマンドは独自のものを取得しますシェルです。 runasroot.shは、検索が実行される権限には影響しません。

だから、あなたがしようとしていることは不可能であり、望ましくないことです。十分な権限がない場合は、インストールして失敗してください。

関連する問題