別のユーザー/グループとしてプロセスを起動(init.dスクリプト内)


10

init.dスクリプトを編集しています。init.dスクリプトはユーティリティスクリプトを実行し、次にユーティリティスクリプトがプロセスを実行します。どちらのbashスクリプトから、特定のユーザーおよびグループとしてメインプロセスを起動させるにはどうすればよいですか?

回答:


12

最も簡単な方法は、su(1)コマンドを使用することです。これには、ユーザーのシェルを介してコマンドを実行できるオプションがあります。次に例を示します。

su foo -c ls

これにより、ユーザーfooに切り替わり、lsコマンドが実行されます。使用するユーザーに有効なシェルがない場合(つまり、/ bin / falseや/ sbin / nologinなどの/ etc / shellsにない場合)、コマンドラインでシェルを指定する必要もあります。出力の例:

# su nobody -s /bin/bash -c id
uid=99(nobody) gid=99(nobody) groups=99(nobody) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

suは私がそれに多くの引数を与えることを好まないようです。私が取得Usage: su [options] [LOGIN]し、su: unrecognized option '--debug'

正確には機能しません。私は、rootとしてこの行を実行すると、私はエラーを取得するsu www-data -c ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &私は場合はsu www-data、すべてのVARSを設定し、実行し${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &、それは罰金に動作します。どうすればこれを解決できますか?

2
@ acidzombie24 suは、シェルコマンドである単一の引数を取ります。を記述し、とが親シェルによってエクスポートされるsu www-data -c '$MONOSERVER "/application=$WEBAPPS" "/socket=unix:/path/monoserve.pid"'ことを確認する必要がMONOSERVERありWEBAPPSます。(注:su … -c "$MONOSERVER …"シェルの特殊文字が変数に含まれていると失敗するため、実行しないでください。)また、などのstart-stop-daemon専用のデーモンランチャーがある場合は、それを使用してください。
Gilles「SO-邪悪なことをやめなさい」

Gilles:よし、私はinit.dスクリプトをそれで置き換えていませんか?すべての変数を新しいスクリプトに入れ、それを起動することができます。簡単で、何も学ぶ必要がないからです。しかし、スタートストップデーモンの何がそれほど特別なのでしょうか。私はその答えにコメントを残します

suまたはsu -loginを使用する方が良いですか?私はsuの男を読みましたが、この特定のケースについて理解できません
Massimo

4

場合はstart-stop-daemon、あなたのシステム上で利用可能であるあなたは、おそらくそれを使用するとそのオプション(特にを見ている必要があります-uし、-gこの場合)。

(そうしないと、の組み合わせを使用することがありますsusg。)

更新:以下は、/etc/init.d/mpd(を使用するstart-stop-daemon)スクリプトからの例です。

  • 開始コマンド:

    echo "Starting Music Player Daemon"
    start-stop-daemon --start --quiet --background --exec /usr/bin/mpd \
        --pidfile /var/run/mpd.pid --make-pidfile \
        -- --no-daemon /etc/mpd.conf 2>/dev/null
    

    次のすべて--は、/usr/bin/mpdプログラム自体の引数です。(デーモン化手順はstart-stop-daemonスクリプトによって処理されるためmpd、でそれを気にしないように求められます--nodaemon。)

  • 停止コマンド:

    echo "Stopping Music Player Daemon"
    start-stop-daemon --stop --exec /usr/bin/mpd --pidfile /var/run/mpd.pid
    

mpd特権を単独で削除しない場合は、コマンド-u mpd-g mpdオプションを(たとえば)追加する必要がありますstart-stop-daemon


init.dスクリプトをstart-stop-daemonに置き換えていませんか?suとスクリプトファイルを使用する方が簡単ではないでしょうか。init.dを置き換える場合、起動時に実行するようにインストールするにはどうすればよいですか?start-stop-daemonには何を渡しますか?-edit-私は例ATMをグーグルしています。多分答えは必要ないかもしれませんが、複雑な答えになると思います

2
運が悪い。こちらが私の行です。ルートとして実行されます。私はマニュアルページをチェックしましたが、これについてどうすればよいのかまだわかりません。start-stop-daemon --start --quiet --background -u www-data -g www-data --exec ${MONOSERVER} --pidfile /path/monoserve.pid --make-pidfile -- /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.