基本的に機能するsystemdサービスをいくつか作成しました。
ロケーション:
/etc/systemd/system/multi-user.target.wants/publicapi.service
コンテンツ:
[Unit]
Description=public api startup script
[Service]
Type=oneshot
RemainAfterExit=yes
EnvironmentFile=-/etc/environment
WorkingDirectory=/home/techops
ExecStart=/home/techops/publicapi start
ExecStop=/home/techops/publicapi stop
[Install]
WantedBy=multi-user.target
コマンドラインでtechopsユーザーとしてサービスを再起動しようとすると、次の出力が表示されます。
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to start 'publicapi.service'.
Multiple identities can be used for authentication:
1. Myself,,, (defaultuser)
2. ,,, (techops)
Choose identity to authenticate as (1-2):
techopsのみがサービスを再起動できるようにしたいのですが、techopsとしてログインしているときにこのプロンプトが表示されないようにしたいのですが。どうやってやるの?
polkit-1やsudoersにはさまざまなアプローチがあることを読みましたが、よくわかりません。
[更新] 2019-01-27 16:40
トーマスとパールダックへのこの包括的な答えをありがとう。systemdの知識を向上させるのに役立ちました。
パスワードプロンプトなしでサービスを開始するアプローチによると、私は本当の問題を十分に強調しなかったことをお詫びしたいと思います。
実際、私にとって最も重要なことは、techops以外のユーザーがサービスを停止または開始しないことです。しかし、少なくとも最初の2つのアプローチを使用するservice publicapi stop
と、実行は可能になり、==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
もう一度プロンプトが表示されます。defaultuserを選択してパスワードを知っていると、すべてのサービスを停止できます。このユーザーがパスワードを持っている場合でも、それを拒否します。これが私にとってより重要な部分である理由をよりよく理解するための重要な背景情報:
defaultuserはsshに公開されている唯一のユーザーですが、このユーザーは他に何もできません(他のユーザーのパスワードを持っている場合に他のユーザーに変更することを除く) 。しかし、現時点では、サービスを開始または停止できますが、このユーザーはこれを実行してはなりません。
だれかがdefaultuserのパスワードを取得し、sshを介してログインした場合、その時点ですべてのサービスを停止できます。これは私が「技術者だけがサービスを再開できるようにしたい」という意味です。申し訳ありませんが、私は最初の質問ではそれほど正確ではありませんでした。私はtechopsユーザーをsudoすることでこの問題を回避できると思いましたが、そうではありません。問題自体は、パスワードプロンプトなしでコマンドを実行することではありません。(私が実行するだけで、techopsユーザーとしてそれを簡単に行うことができました/home/techops/publicapi start
)。問題自体は、defaultuserがこれらのサービスを開始できないようにすることです。
そして、どのソリューションでもそれが可能であることを望みました。
トーマスのアプローチから始めました。説明されているようにコマンドを実行するときに、ユーザーtechopsのパスワードの入力を求められない場合は、sudoによるアプローチが機能します。たとえば、
sudo systemctl start publicapi.service
sudo systemctl stop publicapi.service
2番目のアプローチはまだ機能しません。パスワードプロンプトがないとサービスを開始できず==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
、このユーザーのパスワードを持っていると、defaultuserとしてログインできます。
3番目のアプローチでは、サービスは起動プロセスから開始されないため、このアプローチが自分に適しているかどうかはわかりません。私もそれを行うことができずsystemctl enable publicapi.service
、次のエラーが発生します:
Failed to enable unit: Unit file mycuisine-publicapi.service does not exist.
すべてのサービスを/ etc / systemd / system /に戻して実行しても、エラーは発生しませんsystemctl enable publicapi.service
。その後、サービスは起動時に再び開始されます。
これらのすべてのアプローチは、techopsユーザーのパスワードプロンプトを回避するのに多少役立ちますが、実行しservice publicapi stop
たりdefaultuserを使用したりするsystemctl stop publicapi
と、パスワードがあればサービスを停止できます。しかし、私の目標は、defaultuserがサービスを開始または停止しないようにロックアウトすることです。
/etc/sudoers
そのユーザーの参照があるかどうかファイルを確認する必要があります。
systemctl --user ...
としてではtechops
なく、ユーザーとして実行する必要があります。どちらも私の提案も@PerlDuckの一つは、任意の与えないsudo
あなたの権利defaultuserだけにtechopsのユーザーを。