システムを再起動/シャットダウンするときに常にsudoパスワードを要求します

システムを再起動/シャットダウンするときに常にsudoパスワードを要求します

それで、

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と同等です。shutdownhalt

これを元に戻すには、次のコマンドを再度実行します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

注記:スクリプトには好きな名前を付けてください。

関連情報