それで、
Manjaroでは、ユーザーが1人しかいない場合reboot
、須藤は失敗し、sudoパスワードを要求しますが、Ubuntuサーバーでは、これを入力してもsudoパスワードは要求されず、システムを正常に再起動します。私の質問は、次のように入力すると、再起動/シャットダウン/停止Ubuntu では、現在ログインしているユーザーが 1 人しかいない場合でも、常に sudo パスワードが要求されます。これは polkit と関係があるのでしょうか。もしそうなら、どうすればこれを変更できますか。
私がこれを尋ねる理由は、私のサーバーに物理的にアクセスできるすべての人が再起動できないようにしたいからです(もちろん、電源ケーブルを抜くという別の方法もありますが、笑)。
ありがとう
答え1
私がこれをやった方法の一つはsystemd
ターゲットをマスキングするは、誰がコマンドを入力したかに関係なく、特定のアクションが実行されないようにします。たとえば、システムがシャットダウンされないようにするには、次のようにします。
sudo systemctl mask poweroff.target
これで、 または を介してシステムをシャットダウンしようとするsudo shutdown
と、何もsudo systemctl shutdown
表示されずに失敗します。停止と再起動でも同じことができます。
sudo systemctl mask runlevel0.target
sudo systemctl mask halt.target
sudo systemctl mask runlevel6.target
sudo systemctl mask reboot.target
注記: runlevel6
は と同等でありreboot
、 はおよびrunlevel0
と同等です。shutdown
halt
これを元に戻すには、次のコマンドを再度実行しますunmask
。
sudo systemctl unmask runlevel0.target
sudo systemctl unmask shutdown.target
sudo systemctl unmask halt.target
sudo systemctl unmask runlevel6.target
sudo systemctl unmask reboot.target
これを念頭に置いて、実行可能なスクリプトを書くことができますのみアクセス権を持つ人向けsudo
:
#!/bin/bash
## Determine the operation to run (mask | unmask)
op=mask
if [[ $1 = unmask ]]
then
op=unmask
fi
## Set the targets we want to mask
declare -a arr=("runlevel0" "runlevel6" "shutdown" "reboot" "halt")
## Run the commands
for i in "${arr[@]}"
do
cmd=$( sudo systemctl $op $i.target )
echo "$i :: $op"
done
警告:このコードは動作しますが、かなり大雑把です。本番ボックスで実行する前に、必ず VM または「安全な」場所でサニティ チェックを行ってください。
これで、このスクリプトを実行して、起動後にターゲットをマスクし、次のようにシャットダウン/再起動することができます。
sudo ~./setTargetMask.sh unmask
sudo shutdown now
注記:スクリプトには好きな名前を付けてください。