他のユーザーとしてスクリプトを呼び出すスクリプト


1

CentOsを使用して、システムサービスとしてユーザー「トレーニング」としてスクリプトを実行します。daemontoolsを使用してプロセスを監視します。これには、rootとして実行されるランチャースクリプトが必要です。

  1. #!/bin/bash
    exec >> /var/log/training_service.log 2>&1
    setuidgid training training_command
    

    training_commandには、ユーザーをトレーニングするための環境を設定する必要があるため、この最後の行は十分ではありません。

  2. su - training -c 'training_command' 
    

    standard in must be tty潜在的にパスワードを受け入れるためにttyが存在することを確認してsuとして' 'を指定します。/ etc / sudoersをla Bash& 'su'スクリプトに変更して "standard in must be a tty"というエラーを出すことでこれをなくすことができることは知っ ていますが、結果に自信がありません

  3. runuser - training -c 'training_command' 
    

    与えるrunuser: cannot set groups: Connection refused。このメッセージに意味も解決もありませんでした。

  4. ssh -p100 training @ localhost 'source $ HOME / .bashrc; training_command '

取得しますHost key verification failed.(ホストキーはknown_hostsなどにあります)。

注:ルートシェルからラッパースクリプトを実行すると、2,3,4のすべてが正常に機能します。問題は、システムサービスモニター(daemontools)が起動した場合にのみ発生します(tty端末はありません)。

ハマった。これを達成するのは難しいですか?

ベストプラクティスに対するすべての洞察とガイダンスに感謝します。


setuid / setgidフラグはどうですか?
サンポサラーラ

@Sampo、詳しく説明していただけますか?私はsetuidgidが十分なcosではないと言ったので、envが必要です。または、runuserでそのフラグを意味しますか?
ビクトルトロン

回答:


2

mugen kenichiのソリューションがオプションではない場合、起動スクリプトで環境を取得します。mugenのアプローチを使用するスタートアップスクリプトと、スクリプトで直接環境をソースするスタートアップスクリプトがあります。多くの場合、単に好みの問題です。スタートアップスクリプトで直接環境を調達することは、スクリプトを編集する可能性のある他のユーザー(または6か月後)に対してより透過的です。

私の環境は多くの条件で構成されているので、暗黙的にするほうが簡単です。スタートアップスクリプトの1つからの最初の数行は次のとおりです。

#!/bin/bash
. /my/tools/environment/apps/apps_rc
. /my/tools/environment/functions/common.bash 

これが完了したら、通常どおりsuを使用して、問題のユーザーとしてプロセスを開始します。

を使用して同様のプロセスを開始する方法のサンプルを次に示しますsu

su -l $USER -c "nohup $APP_PATH" >> $LOG_FILE 2>&1 < /dev/null &

オプションとして、daemonizeパッケージも見ることができます。私もかなり使います。

最後に...

あなたの質問から、特権ユーザーとしてスクリプトを実行したいように見えますが、実際にはスクリプトsetuidビット設定して、通常の使用でrootとして実行できるようにする必要があります。これはセキュリティに影響する可能性があるため、これを実行するときに何をしているかを把握してください。


私が言ったとしてではなくsuコマンドがスクリプトから呼び出されると、エラーを与える
ヴィクトルTRON

使用方法を共有する必要があります。私suはこの文脈で常に使用しています。
モガ

ご清聴ありがとうございました。OPのスクリプトは/ service / training / run実行可能ファイルであり、svc -u / service / trainingを使用してサービスをオンにします。その後、superviseは、実行スクリプトを起動しますが、suには欠落しているtty stdinが必要なため、/ var / log / training_service.logで「standard in must tty」を取得します(もちろん、トレーニングコマンドは実行されません。コンテキストは説明しています。
ヴィクトルTRON

あなたの質問には、別々に解決する必要がある4つの無関係な問題があります。sshエラー、グループエラーは質問とは関係ありません。manページを読むか、別の質問を投稿してください。
モガ

1
1〜5のすべては、スクリプトがルート端末から呼び出されたときにコマンドが実行されるという事実によって除外されます。ただし、ttyなしでdaemontoolsから呼び出された場合は失敗します。しかし感謝
ビクトルトロン

1

あなたは無効にする必要がありますrequirettyに設定を/etc/sudoersためroot。次の行を追加しますvisudo

Defaults:root !requiretty

また、すべてを実行できる/etc/sudoersように次の行も必要ですroot(これはデフォルトで有効になっているはずですが、確認してください)。

root ALL=(ALL) ALL

その後、次のことができます。

sudo -u training /path/to/training_command

この答えは、このような質問のすべてにわたって永続化されていますが、完全にまったく効果がありません。
8ビットジャンキー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.