タイトルが少し曖昧であることがわかっています。私たちの問題を説明してください。 Debian ベースのシステムが私たちの主な鍵であるため、Ubuntu ではインストーラスクリプトを設計しましたが、一部のクラウドベースのシステムと一部のお客様は Debian ベースではないシステムを使用しています。その結果、sudoを使用して以来、いくつかの主要な場所でスクリプトが失敗しました。私たちの質問に対する答えは非常に基本的であることを知っています。いくつかの一般的なディストリビューション(CentOS、RHEL、Fedora、Ubuntu、Debianなど)をサポートするために使用する必要がある正確な構文がわかりません。
まあ、それは問題です。私たちのスクリプトはソフトウェアのインストーラです。このスクリプトは必要なファイル、サービスなどをインストールします。インストールスクリプトはrootとして実行する必要があるため、ユーザーはrootコンソールにあるか、sudoを使用する必要があります。とにかく今まではとても良かったです。スクリプトが終了すると、インストーラはルートコンソールを終了し、ソフトウェアユーザーとしてサービスを開始する必要があります。この目的のために、最初にスクリプトを作成するときに次のように使用しました。
usermod -aG sudo <username> #Put the softwares user in the sudo group
sudo -u <username> service <software> start #Drop to the user and start the service
もちろん、Debianベースではないシステムにこのスクリプトをデプロイしようとすると、CentOSがsudoを理解していないため、スクリプトは失敗します。回避策はsudoを有効にしないことです。これは、オンまたはオフにできない一部の顧客システムでもこれが発生する可能性があるためです。だから当然、私は以前のsuコマンドを使ってこれを行う方法を見つけ始めました。次を試しましたが、ユーザーを変更した直後にエラーが発生するか、スクリプトで終了します。
su <username>
service <software> start
ほとんどのLinuxディストリビューションで使用できるように正しい構文に関する提案はありますか?
ありがとう
*更新*
私は以下を試しました:
su <username> -c 'service <software> start'
コマンドは実行されますが、ユーザーに root 権限がないため失敗します。具体的には、サービスコマンドが見つからないと言います(再度ルートなしで)。それでは、上記のsudoコマンドが機能するのはなぜですか?ユーザーとして実行していますが、root権限はありますか?
答え1
次のコマンドを直接渡す必要がありますsu
。
su <username> -c 'service <software> start'
その行を実行すると、そのsu <username>
ユーザーとして対話型シェルが起動します。
sudo
サービスの開始を指定されたユーザーとして実行する必要があることは多少奇妙です。より一般的には、起動スクリプトは、ルートに頼らずにサービスを開始できるように、必要なユーザーとして何でも実行する役割を果たしますsu
。
答え2
あなたの要件はAnsibleの優れたユースケースです。この問題を解決するオープンソース構成管理/調整ツールです。エージェントがなく、SSHを介して機能するため、通常はクライアント設定を実行する必要はありません。
答え3
あなたはマンページを読んでいませんsu
!必須ユーザー名は常に最後に入力する必要があります。
su -c 'service <software> start' <username>