CentOを使用して、システムサービスとしてユーザー「トレーニング」としてスクリプトを実行したいと考えています。私は、daemontoolsを使用してプロセスを監視します。このプロセスには、rootとして実行され、tty標準がないランチャースクリプトが必要です。
以下に、すべて失敗する5つの異なる試みを示します。
:
#!/bin/bash
exec >> /var/log/training_service.log 2>&1
setuidgid training training_command
この最後の行は、training_commandでは、ユーザーを設定するための環境を必要とするため、十分ではありません。
:
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 )しかし、私は気が進まず、結果に確信が持てません。
:
Sudo -u training -i bash -c 'source $HOME/.bashrc; training_command'
同じテーマのバリエーション: 'Sudo: sorry, you must have a tty to run Sudo
'
:
runuser - training -c 'training_command'
これはrunuser: cannot set groups: Connection refused
を与えます。このエラーの意味や解決策は見つかりませんでした。
:
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 )
requiretty
の/etc/sudoers
のroot
設定を無効にする必要があります。 visudo
を使用して次の行を追加します。
Defaults:root !requiretty
/etc/sudoers
には次の行も必要になるため、root
はすべてを実行できます(これはデフォルトで有効になっているはずですが、確認してください)。
root ALL=(ALL) ALL
次に、次の操作を実行できます。
Sudo -u training /path/to/training_command
これは本質的に この質問の特別なケースのようです ; script -c
ttyを偽造します。唯一の問題は、なんらかの理由でsu
を直接操作するトリックを取得できないことです。Sudo
は、本当に~/.bashrc
前 training_command
。試してください:
echo password | script -c "Sudo su - training -c training_command"
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
用です。
クラシック(簡単なコマンド)
su user -c "commands"
指定されたユーザーに対してコマンドを実行しますが、コマンドがサウンドを再生したりGUIを実行したりする場合に特に必要な環境変数は処理しません
上級(サウンド、GUIなど)
su user -c "export DISPLAY=:0; export XDG_RUNTIME_DIR='/run/user/1000'; xhost local:root; commands"
ターゲットユーザーに一致するように使用済みの値を置き換えます
SSHでコマンドを実行します。
他のユーザーのパスワードなしでログインするsshキー構成を作成します。これがこの目的のためのチュートリアルです: https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys--2
Sshを使用してコマンドを実行します。ssh -l training -i key_file "training_command"
ここで私の答えを盗用します: 別のユーザーとしてスクリプトを開始する
次のような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
最初のものを選択し、必要な環境変数を設定します。
すでに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