web-dev-qa-db-ja.com

tty stdinなしでルートスクリプトから別のユーザーとしてスクリプトを実行する

CentOを使用して、システムサービスとしてユーザー「トレーニング」としてスクリプトを実行したいと考えています。私は、daemontoolsを使用してプロセスを監視します。このプロセスには、rootとして実行され、tty標準がないランチャースクリプトが必要です。

以下に、すべて失敗する5つの異なる試みを示します。

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

    この最後の行は、training_commandでは、ユーザーを設定するための環境を必要とするため、十分ではありません。

  2. su - training -c 'training_command' 
    

    これは( 別のユーザーとしてシェルスクリプトを実行 )のように見えますが、ttyが存在してパスワードを受け入れる可能性があることを確認するため、 'standard in must be tty'を提供します。/etc/sudoers(la https://superuser.com/questions/119376/bash-su-script-giving-an-error-standard-in-must- be-a-tty )しかし、私は気が進まず、結果に確信が持てません。

  3. Sudo -u training -i bash -c 'source $HOME/.bashrc; training_command'
    

    同じテーマのバリエーション: 'Sudo: sorry, you must have a tty to run Sudo'

  4. runuser - training -c 'training_command'  
    

    これはrunuser: cannot set groups: Connection refusedを与えます。このエラーの意味や解決策は見つかりませんでした。

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

    これは、がっかりを表す冗談です。これでもHost key verification failed.で失敗します(ホストキーISなど))。

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

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

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

(これもスーパーユーザーに投稿されています: https://superuser.com/questions/434235/script-calling-script-as-other-user

4
Viktor Trón

requiretty/etc/sudoersroot設定を無効にする必要があります。 visudoを使用して次の行を追加します。

Defaults:root !requiretty

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

root ALL=(ALL) ALL

次に、次の操作を実行できます。

Sudo -u training /path/to/training_command
5

これは本質的に この質問の特別なケースのようです ; script -c ttyを偽造します。唯一の問題は、なんらかの理由でsuを直接操作するトリックを取得できないことです。Sudoは、本当に~/.bashrctraining_command。試してください:

echo password | script -c "Sudo su - training -c training_command" 
3
gmatht

SSHでは、通常のユーザーでコマンド_foo.sh_を実行できます。

_$ ssh [email protected] bash /path/to/foo.sh
_

_foo.sh_のコマンドのいずれかにroot権限が必要な場合、たとえば、netstatの場合は、次のようにsuコマンドで囲みます(元のraw _netstat -tunple_を置き換えます)。

_su -c "netstat -tunpl" root
_

次のように_foo.sh_を実行します。

_$ ssh -t [email protected] bash /path/to/foo.sh
_

これにより、2つのパスワードが求められます。1つ目は_normal_user_用で、2つ目はroot用です。

0
coanor

クラシック(簡単なコマンド)

su user -c "commands" 

指定されたユーザーに対してコマンドを実行しますが、コマンドがサウンドを再生したりGUIを実行したりする場合に特に必要な環境変数は処理しません

上級(サウンド、GUIなど)

su user -c "export DISPLAY=:0; export XDG_RUNTIME_DIR='/run/user/1000'; xhost local:root; commands" 

ターゲットユーザーに一致するように使用済みの値を置き換えます

0
intika

SSHでコマンドを実行します。

  1. 他のユーザーのパスワードなしでログインするsshキー構成を作成します。これがこの目的のためのチュートリアルです: https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys--2

  2. Sshを使用してコマンドを実行します。ssh -l training -i key_file "training_command"

0
Ebru Yener

ここで私の答えを盗用します: 別のユーザーとしてスクリプトを開始する

次のようなstart-stop-daemonを使用できます。

/sbin/start-stop-daemon --background --start --exec /path/to/training.sh --user training --pidfile=/path/to/training.pid --make-pidfile

ここで、training.shは次のようなものです。

#!/bin/sh
exec >> /var/log/training_service.log 2>&1
source /home/training/.bashrc
training_command
0
Mr Shark

最初のものを選択し、必要な環境変数を設定します。

すでにdaemontoolsを使用している場合、手動でログファイルを作成したり、いじったりすることはありません。 Daemontoolsはあなたのためにその仕事をします。

これは、アプリケーション実行スクリプトのスクリプトです

#!/bin/bash
exec 2>&1
exec setuidgid training sh -c 'YOURVARIABLE=yourvalue exec training_command'

次に、独自のrunscriptを使用してlogディレクトリ実行スクリプトを作成します。

ログの設定については、このエントリを参照してください: http://cr.yp.to/daemontools/faq/create.html#runlog

0
cstamas